?? ed.c
字號:
#include "tdestr.h"
#include "define.h"
#include "tdefunc.h"
#include "global.h"
#include "prompts.h"
#include "default.h"
int insert_newline( WINDOW *window )
{
char *source;
char *dest;
int len;
int split_len;
int add;
int rcol;
int rc;
long length;
int carriage_return;
int split_line;
int wordwrap;
int dirty;
int old_bcol;
register WINDOW *win;
file_infos *file;
line_list_ptr new_node;
text_ptr new_line;
rc = OK;
win = window;
file = win->file_info;
length = file->length;
wordwrap = mode.word_wrap;
switch (g_status.command) {
case WordWrap :
carriage_return = TRUE;
split_line = FALSE;
break;
case AddLine :
split_line = carriage_return = FALSE;
break;
case SplitLine :
split_line = carriage_return = TRUE;
break;
case Rturn :
default :
if (file->crlf == BINARY)
return( next_line( win ) );
show_ruler_char( win );
carriage_return = TRUE;
split_line = FALSE;
break;
}
new_node = (line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
new_line = NULL;
win->visible = FALSE;
old_bcol = win->bcol;
if (rc == OK) {
new_node->line = new_line;
new_node->len = 0;
new_node->dirty = FALSE;
if (win->ll->len != EOF) {
win->file_info->modified = TRUE;
if (mode.do_backups == TRUE)
rc = backup_file( win );
copy_line( win->ll );
detab_linebuff( );
len = g_status.line_buff_len;
split_len = 0;
if (win->rcol < len)
win->ll->dirty = TRUE;
source = g_status.line_buff + len;
if (carriage_return || split_line) {
if (win->rcol < len) {
source = g_status.line_buff + win->rcol;
split_len = len - win->rcol;
len = win->rcol;
}
}
g_status.line_buff_len = len;
entab_linebuff( );
if (un_copy_line( win->ll, win, TRUE ) == OK) {
assert( split_len >= 0 );
assert( split_len < MAX_LINE_LENGTH );
memmove( g_status.line_buff, source, split_len );
g_status.line_buff_len = len = split_len;
g_status.copied = TRUE;
entab_linebuff( );
} else
rc = ERROR;
} else {
g_status.line_buff_len = len = 0;
g_status.copied = TRUE;
}
if (rc == OK) {
new_node->line = new_line;
new_node->len = 0;
new_node->dirty = TRUE;
if (win->ll->next != NULL) {
win->ll->next->prev = new_node;
new_node->next = win->ll->next;
win->ll->next = new_node;
new_node->prev = win->ll;
} else {
new_node->next = win->ll;
if (win->ll->prev != NULL)
win->ll->prev->next = new_node;
new_node->prev = win->ll->prev;
win->ll->prev = new_node;
if (new_node->prev == NULL)
win->file_info->line_list = new_node;
win->ll = new_node;
}
++file->length;
detab_linebuff( );
entab_linebuff( );
rc = un_copy_line( new_node, win, FALSE );
adjust_windows_cursor( win, 1 );
file->dirty = NOT_LOCAL;
if (length == 0l || wordwrap || win->cline == win->bottom_line)
file->dirty = GLOBAL;
else if (!split_line)
update_line( win );
if (rc == OK && (carriage_return || split_line)) {
dirty = file->dirty;
if (win->cline < win->bottom_line)
win->cline++;
win->rline++;
if (win->ll->next != NULL) {
win->bin_offset += win->ll->len;
win->ll = win->ll->next;
}
rcol = win->rcol;
old_bcol = win->bcol;
if (win->ll->next != NULL) {
if (mode.indent || wordwrap) {
add = find_left_margin( wordwrap == FIXED_WRAP ?
win->ll : win->ll->prev, wordwrap );
assert( add >= 0 );
assert( add < MAX_LINE_LENGTH );
copy_line( win->ll );
detab_linebuff( );
len = g_status.line_buff_len;
source = g_status.line_buff;
if (len + add > MAX_LINE_LENGTH)
add = MAX_LINE_LENGTH - len;
dest = source + add;
assert( len >= 0);
assert( len < MAX_LINE_LENGTH );
memmove( dest, source, len );
assert( add >= 0 );
assert( add < MAX_LINE_LENGTH );
memset( source, ' ', add );
win->rcol = add;
g_status.line_buff_len += add;
entab_linebuff( );
rc = un_copy_line( win->ll, win, TRUE );
} else
win->rcol = 0;
}
if (rc == OK && split_line) {
win->rline--;
win->ll = win->ll->prev;
if (win->cline > win->top_line + window->ruler)
win->cline--;
win->rcol = rcol;
}
check_virtual_col( win, win->rcol, win->ccol );
if (dirty == GLOBAL || file->dirty == LOCAL || wordwrap)
file->dirty = GLOBAL;
else
file->dirty = dirty;
}
} else {
if (new_node != NULL)
my_free( new_node );
}
} else {
if (new_node != NULL)
my_free( new_node );
error( WARNING, window->bottom_line, main4 );
}
win->visible = TRUE;
if (rc == OK) {
if (file->dirty != GLOBAL)
my_scroll_down( win );
restore_marked_block( win, 1 );
show_size( win );
show_avail_mem( );
if (old_bcol != win->bcol) {
make_ruler( win );
show_ruler( win );
}
}
return( rc );
}
int insert_overwrite( WINDOW *window )
{
char *source;
char *dest;
int len;
int pad;
int add;
register int rcol;
register WINDOW *win;
int rc;
win = window;
if (win->ll->len == EOF || g_status.key_pressed >= 256)
rc = OK;
else {
rcol = win->rcol;
if (rcol >= g_display.line_length) {
error( WARNING, win->bottom_line, ed2 );
rc = ERROR;
} else {
copy_line( win->ll );
detab_linebuff( );
len = g_status.line_buff_len;
pad = rcol > len ? rcol - len : 0;
if (mode.insert || rcol >= len)
add = 1;
else
add = 0;
if (len + pad + add >= g_display.line_length) {
error( WARNING, win->bottom_line, ed3 );
rc = ERROR;
} else {
if (pad > 0 || add > 0) {
source = g_status.line_buff + rcol - pad;
dest = source + pad + add;
assert( len + pad - rcol >= 0 );
assert( len + pad - rcol < MAX_LINE_LENGTH );
memmove( dest, source, len + pad - rcol );
assert( pad >= 0 );
assert( pad < MAX_LINE_LENGTH );
memset( source, ' ', pad );
}
g_status.line_buff[rcol] = (char)g_status.key_pressed;
g_status.line_buff_len += pad + add;
entab_linebuff( );
win->file_info->dirty = NOT_LOCAL;
win->ll->dirty = TRUE;
show_changed_line( win );
if (win->ccol < win->end_col) {
show_curl_line( win );
show_ruler_char( win );
win->ccol++;
} else {
win->bcol++;
win->file_info->dirty = LOCAL;
make_ruler( win );
show_ruler( win );
}
rcol++;
}
check_virtual_col( win, rcol, win->ccol );
win->file_info->modified = TRUE;
if (mode.word_wrap) {
add = mode.right_justify;
mode.right_justify = FALSE;
g_status.command = FormatText;
word_wrap( win );
mode.right_justify = add;
}
rc = OK;
}
}
return( rc );
}
int join_line( WINDOW *window )
{
int len;
int new_len;
int next_len;
text_ptr q;
text_ptr tab_free;
int pad;
register WINDOW *win;
WINDOW *wp;
line_list_ptr next_node;
int rc;
win = window;
if (win->ll->len == EOF || win->ll->next->len == EOF)
return( ERROR );
rc = OK;
assert( win->ll->next != NULL );
next_node = win->ll->next;
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
copy_line( win->ll );
detab_linebuff( );
if (win->rcol < (len = g_status.line_buff_len))
len = win->rcol;
pad = win->rcol > len ? win->rcol - len : 0;
assert( pad >= 0 );
assert( pad < MAX_LINE_LENGTH );
next_len = next_node->len;
tab_free = detab_a_line( next_node->line, &next_len );
assert( next_len >= 0 );
assert( next_len < MAX_LINE_LENGTH );
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
new_len = len + pad + next_len;
if (new_len >= g_display.line_length) {
error( WARNING, win->bottom_line, ed4 );
rc = ERROR;
} else {
if (mode.do_backups == TRUE) {
win->file_info->modified = TRUE;
rc = backup_file( win );
}
q = (text_ptr)(g_status.line_buff + len);
if (pad > 0) {
while (pad--)
*q++ = ' ';
}
_fmemcpy( q, tab_free, next_len );
g_status.line_buff_len = new_len;
entab_linebuff( );
if ((rc = un_copy_line( win->ll, win, FALSE )) == OK) {
if (next_node->next != NULL)
next_node->next->prev = win->ll;
win->ll->next = next_node->next;
win->ll->dirty = TRUE;
--win->file_info->length;
++win->rline;
adjust_windows_cursor( win, -1 );
restore_marked_block( win, -1 );
--win->rline;
wp = g_status.window_list;
while (wp != NULL) {
if (wp->file_info == win->file_info) {
if (wp != win) {
if (wp->ll == next_node)
wp->ll = win->ll->next;
}
}
wp = wp->next;
}
if (next_node->line != NULL)
my_free( next_node->line );
my_free( next_node );
show_size( win );
show_avail_mem( );
win->file_info->dirty = GLOBAL;
}
}
return( rc );
}
int word_delete( WINDOW *window )
{
int len;
int count;
register int start;
char *source;
char *dest;
text_ptr p;
register WINDOW *win;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -