📄 tab.c
字号:
#include "tdestr.h"
#include "common.h"
#include "tdefunc.h"
#include "define.h"
int tab_key( WINDOW *window )
{
int spaces;
char *source;
char *dest;
int pad;
int len;
register int rcol;
int old_bcol;
register WINDOW *win;
int rc;
win = window;
if (win->ll->len == EOF)
return( OK );
rcol = win->rcol;
old_bcol = win->bcol;
show_ruler_char( win );
if (mode.smart_tab)
spaces = next_smart_tab( win );
else
spaces = mode.ltab_size - (rcol % mode.ltab_size);
assert( spaces >= 0 );
assert( spaces < MAX_LINE_LENGTH );
rc = OK;
if (mode.insert && rcol + spaces < g_display.line_length) {
copy_line( win->ll );
detab_linebuff( );
len = g_status.line_buff_len;
pad = rcol > len ? rcol - len : 0;
if (len + pad + spaces >= g_display.line_length) {
error( WARNING, win->bottom_line, ed1 );
rc = ERROR;
g_status.copied = FALSE;
} else {
if (pad > 0 || spaces > 0) {
source = g_status.line_buff + rcol - pad;
dest = source + pad + spaces;
assert( len + pad - rcol >= 0 );
assert( len + pad - rcol < MAX_LINE_LENGTH );
memmove( dest, source, len + pad - rcol );
assert( pad + spaces >= 0 );
assert( pad + spaces < MAX_LINE_LENGTH );
memset( source, ' ', pad + spaces );
g_status.line_buff_len += pad + spaces;
entab_linebuff( );
}
win->ll->dirty = TRUE;
win->file_info->dirty = GLOBAL;
show_changed_line( win );
rcol += spaces;
win->ccol += spaces;
}
} else if (rcol + spaces <= g_display.line_length) {
rcol += spaces;
win->ccol += spaces;
}
check_virtual_col( win, rcol, win->ccol );
if (old_bcol != win->bcol) {
make_ruler( win );
show_ruler( win );
}
return( rc );
}
the required distance.
*/
int backtab( WINDOW *window )
{
int spaces;
char *source;
char *dest;
int pad;
int len;
register int rcol;
int old_bcol;
register WINDOW *win;
win = window;
rcol = win->rcol;
if (win->ll->len == EOF || win->rcol == 0)
return( OK );
old_bcol = win->bcol;
show_ruler_char( win );
if (mode.smart_tab)
spaces = prev_smart_tab( win );
else
spaces = win->rcol % mode.ltab_size;
if (spaces == 0)
spaces = mode.ltab_size;
copy_line( win->ll );
detab_linebuff( );
len = g_status.line_buff_len;
if (mode.insert && rcol - spaces < len) {
pad = rcol > len ? rcol - len : 0;
if (pad > 0 || spaces > 0) {
if (pad > 0) {
assert( rcol - pad >= 0 );
assert( pad < MAX_LINE_LENGTH );
source = g_status.line_buff + rcol - pad;
dest = source + pad;
assert( pad >= 0 );
assert( pad < MAX_LINE_LENGTH );
memmove( dest, source, pad );
memset( source, ' ', pad );
g_status.line_buff_len += pad;
}
source = g_status.line_buff + rcol;
dest = source - spaces;
assert( len + pad - rcol >= 0 );
assert( len + pad - rcol < MAX_LINE_LENGTH );
memmove( dest, source, len + pad - rcol );
g_status.line_buff_len -= spaces;
entab_linebuff( );
}
win->ll->dirty = TRUE;
win->file_info->dirty = GLOBAL;
show_changed_line( win );
rcol -= spaces;
win->ccol -= spaces;
} else {
rcol -= spaces;
if (rcol < 0)
rcol = 0;
win->ccol -= spaces;
}
check_virtual_col( win, rcol, win->ccol );
if (old_bcol != win->bcol) {
make_ruler( win );
show_ruler( win );
}
return( OK );
}
int next_smart_tab( WINDOW *window )
{
register int spaces;
text_ptr s;
line_list_ptr ll;
register WINDOW *win;
int len;
win = window;
ll = win->ll->prev;
while (ll != NULL && is_line_blank( ll->line, ll->len ))
ll = ll->prev;
if (ll != NULL) {
s = ll->line;
if (window->rcol >= find_end( s, ll->len ))
spaces = mode.ltab_size - (window->rcol % mode.ltab_size);
else {
len = ll->len;
s = detab_a_line( s, &len );
spaces = 0;
s = s + window->rcol;
len -= window->rcol;
while (*s != ' ' && len > 0) {
++s;
++spaces;
--len;
}
if (len > 0)
while (*s == ' ' && len > 0) {
++s;
++spaces;
--len;
}
}
} else
spaces = mode.ltab_size - (window->rcol % mode.ltab_size);
return( spaces );
}
int prev_smart_tab( WINDOW *window )
{
register int spaces;
text_ptr s;
int len;
line_list_ptr ll;
WINDOW *win;
win = window;
ll = win->ll->prev;
while (ll != NULL && is_line_blank( ll->line, ll->len ))
ll = ll->prev;
if (ll != NULL) {
s = ll->line;
if (window->rcol < first_non_blank( s, ll->len ))
spaces = window->rcol % mode.ltab_size;
else {
len = ll->len;
if (mode.inflate_tabs)
s = detab_a_line( s, &len );
if (len < window->rcol) {
s += len;
spaces = window->rcol - len;
} else {
len = window->rcol;
s += window->rcol;
spaces = 0;
}
while (*(s-1) == ' ' && len > 0) {
--s;
++spaces;
--len;
}
while (*(s-1) != ' ' && len > 0) {
--s;
++spaces;
--len;
}
if (len == 0 && *s == ' ')
spaces = window->rcol % mode.ltab_size;
if (spaces > window->rcol)
spaces = window->rcol;
}
} else
spaces = window->rcol % mode.ltab_size;
if (spaces < 0)
spaces = 0;
return( spaces );
}
text_ptr entab( text_ptr s, int len )
{
int tab_size;
int last_col;
int space;
register int col;
text_ptr to;
assert( s != NULL );
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
tab_size = mode.ptab_size;
to = (text_ptr)g_status.tabout_buff;
if (s == NULL)
g_status.tabout_buff_len = 0;
else {
g_status.tabout_buff_len = len;
for (last_col=col=0; ; s++, len--) {
if (len == 0) {
if (col != last_col) {
while (last_col < col) {
space = tab_size - last_col % tab_size;
if (space <= 1) {
*to++ = ' ';
last_col++;
} else if (last_col + space <= col) {
*to++ = '\t';
last_col += space;
g_status.tabout_buff_len -= (space - 1);
} else {
*to++ = ' ';
last_col++;
}
}
}
break;
} else if (*s == ' ')
col++;
else {
if (col != last_col) {
while (last_col < col) {
space = tab_size - last_col % tab_size;
if (space <= 1) {
*to++ = ' ';
last_col++;
} else if (last_col + space <= col) {
*to++ = '\t';
last_col += space;
g_status.tabout_buff_len -= (space - 1);
} else {
*to++ = ' ';
last_col++;
}
}
}
if (*s == '\t')
col = col + tab_size - (col % tab_size);
else
++col;
last_col = col;
*to++ = *s;
if (*s == '\"' || *s == '\'') {
while (len > 0) {
*to++ = *++s;
--len;
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -