📄 wordwrap.c
字号:
next_line_len = find_end( pp->line, pp->len ) - non_blank;
if (!is_line_blank( pp->line, pp->len ) && p_len + next_line_len <= rm) {
control_t = 1;
if (mode.inflate_tabs) {
if (*pp->line == ' ' || *pp->line == '\t')
++control_t;
} else if (*pp->line == ' ')
++control_t;
w.ll = p;
w.rcol = p_len + 1;
if (*(p->line+p_len-1) == '.')
++w.rcol;
while (control_t--)
word_delete( &w );
remove_spaces( lm );
un_copy_line( w.ll, &w, TRUE );
}
window->file_info->dirty = GLOBAL;
}
}
}
void justify_right_margin( WINDOW *window, line_list_ptr ll, int lm, int rm,
int side )
{
int len;
int i;
int word_count;
int holes;
int nb;
int spaces;
text_ptr s;
len = find_end( ll->line, ll->len );
if (len <= lm || len >= rm+1)
return;
i = entab_adjust_rcol( ll->line, ll->len, lm );
s = ll->line + i;
len -= i;
word_count = 0;
while (len > 0) {
while (len-- > 0 && *s++ == ' ');
if (len == 0)
break;
++word_count;
while (len-- > 0 && *s++ != ' ');
}
if (word_count <= 1)
return;
holes = word_count - 1;
copy_line( ll );
detab_linebuff( );
remove_spaces( lm );
i = g_status.line_buff_len - 1;
spaces = rm - i;
if (spaces <= 0)
return;
g_status.line_buff_len += spaces;
while (i < rm) {
g_status.line_buff[rm] = g_status.line_buff[i];
if (g_status.line_buff[rm] == ' ') {
while (g_status.line_buff[i-1] == ' ')
g_status.line_buff[--rm] = g_status.line_buff[--i];
nb = side == LEFT ? spaces holes + 1;
spaces -= nb;
--holes;
while (nb-- > 0)
g_status.line_buff[--rm] = ' ';
}
--i;
--rm;
}
entab_linebuff( );
un_copy_line( ll, window, window->bottom_line );
}
void remove_spaces( int lm )
{
int period;
int len;
int i;
int c;
char *s;
char *d;
if ((i = len = g_status.line_buff_len) <= lm)
return;
period = FALSE;
s = d = g_status.line_buff + lm;
i -= lm;
c = (int)*s++;
while (c == ' ' && i > 0) {
c = *s++;
--i;
--len;
}
period = c == '.' ? TRUE : FALSE;
while (i > 0) {
*d++ = (char)c;
c = (int)*s++;
--i;
if (c != ' ')
period = c == '.' ? TRUE : FALSE;
else {
*d++ = (char)c;
c = (int)*s++;
--i;
if (period && c == ' ') {
*d++ = (char)c;
period = FALSE;
if (i > 0)
++len;
}
while (c == ' ' && i > 0) {
c = (int)*s++;
--len;
--i;
}
}
}
*d = (char)c;
g_status.line_buff_len = len;
}
int find_word( text_ptr p, int len, int start_col )
{
register int rc;
register char c;
if (len <= start_col || len < 0 || start_col < 0)
return( ERROR );
p += start_col;
rc = start_col;
if (mode.inflate_tabs) {
while (len-- > 0 && ((c = *p++) == ' ' || c == '\t'))
if (c != '\t')
++rc;
else
rc += mode.ptab_size - (rc % mode.ptab_size);
} else
while (len-- > 0 && (c = *p++) == ' ')
++rc;
if (len <= 0)
rc = ERROR;
return( rc );
}
int flush_left( WINDOW *window )
{
int len;
register int spaces;
char *source;
char *dest;
int rcol;
int lm;
register WINDOW *win;
win = window;
copy_line( win->ll );
detab_linebuff( );
lm = mode.left_margin;
rcol = find_word( (text_ptr)g_status.line_buff, g_status.line_buff_len, 0 );
if (rcol != ERROR && rcol != lm) {
if (rcol < lm) {
source = g_status.line_buff;
spaces = lm - rcol;
dest = source + spaces;
len = g_status.line_buff_len;
if (len + spaces > MAX_LINE_LENGTH) {
error( WARNING, win->bottom_line, ww1 );
return( ERROR );
} else {
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
memmove( dest, source, len );
g_status.line_buff_len += spaces;
while (spaces--)
*source++ = ' ';
win->file_info->dirty = GLOBAL;
}
} else {
dest = g_status.line_buff + lm;
source = g_status.line_buff + rcol;
assert( g_status.line_buff_len - rcol >= 0 );
assert( g_status.line_buff_len - rcol < MAX_LINE_LENGTH );
memmove( dest, source, g_status.line_buff_len - rcol );
g_status.line_buff_len -= (rcol - lm);
win->file_info->dirty = GLOBAL;
}
win->ll->dirty = TRUE;
show_changed_line( win );
}
return( OK );
}
int flush_right( WINDOW *window )
{
int len;
int i;
int spaces;
char *source;
char *dest;
register int rcol;
int rm;
register WINDOW *win;
win = window;
copy_line( win->ll );
detab_linebuff( );
source = g_status.line_buff;
len = g_status.line_buff_len;
if (!is_line_blank( (text_ptr)source, len )) {
rm = mode.right_margin;
for (rcol=len-1; rcol>=0 && *(source+rcol) == ' ';)
rcol--;
if (rcol != rm) {
if (rcol < rm) {
spaces = rm - rcol;
dest = source + spaces;
if (len + spaces > MAX_LINE_LENGTH) {
error( WARNING, win->bottom_line, ww1 );
return( ERROR );
} else {
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
memmove( dest, source, len );
g_status.line_buff_len += spaces;
while (spaces--)
*source++ = ' ';
win->file_info->dirty = GLOBAL;
}
} else {
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
rcol = rcol - rm;
i = first_non_blank( (text_ptr)source, len );
if (rcol > i)
rcol = i;
dest = source + rcol;
assert( len - rcol >= 0 );
assert( len - rcol < MAX_LINE_LENGTH );
memmove( source, dest, len - rcol );
g_status.line_buff_len -= (rcol - rm);
win->file_info->dirty = GLOBAL;
}
win->ll->dirty = TRUE;
show_changed_line( win );
}
}
return( OK );
}
int flush_center( WINDOW *window )
{
int len;
char *source;
char *dest;
int rm;
int lm;
register int spaces;
int center;
int first;
int last;
register WINDOW *win;
win = window;
copy_line( win->ll );
detab_linebuff( );
source = g_status.line_buff;
len = g_status.line_buff_len;
if (!is_line_blank( (text_ptr)source, len )) {
rm = mode.right_margin;
lm = mode.left_margin;
center = (rm + lm) / 2;
first = first_non_blank( (text_ptr)source, len );
for (last=len-1; last>=0 && *(source+last) == ' ';)
last--;
spaces = last + first - 1;
spaces = (spaces / 2) + (spaces & 1);
if (spaces != center) {
if (spaces < center) {
spaces = center - spaces;
dest = source + spaces;
if (len + spaces > MAX_LINE_LENGTH) {
error( WARNING, win->bottom_line, ww1 );
return( ERROR );
} else {
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
memmove( dest, source, len );
g_status.line_buff_len += spaces;
while (spaces--)
*source++ = ' ';
win->file_info->dirty = GLOBAL;
}
} else {
load_undo_buffer( win->file_info, win->ll->line, win->ll->len );
spaces = spaces - center;
if (spaces > first)
spaces = first;
dest = source + spaces;
assert( len - spaces >= 0 );
assert( len - spaces < MAX_LINE_LENGTH );
memmove( source, dest, len - spaces );
g_status.line_buff_len -= spaces;
win->file_info->dirty = GLOBAL;
}
win->ll->dirty = TRUE;
show_changed_line( win );
}
}
return( OK );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -