Improve command consistency

- use `n` instead of `dir` or `delta` when passing premultiplied argval
- describe-xxx commands take `argval` to avoid repetition
- move paragraph functions to extras.c
- bumped version to 5.3.1k
This commit is contained in:
Charlie Gordon 2022-08-15 14:33:30 +02:00
commit e00a3d0cfa
7 changed files with 351 additions and 319 deletions

259
extras.c
View file

@ -959,7 +959,7 @@ static void print_bindings(EditBuffer *b, ModeDef *mode)
}
}
void do_describe_bindings(EditState *s)
void do_describe_bindings(EditState *s, int argval)
{
EditBuffer *b;
@ -1809,6 +1809,8 @@ static void do_sort_buffer(EditState *s, int flags, int argval) {
do_sort_span(s, 0, s->b->total_size, flags, argval);
}
/*---------------- tag handling ----------------*/
static void tag_buffer(EditState *s) {
unsigned int buf[COLORED_MAX_LINE_SIZE];
QETermStyle sbuf[COLORED_MAX_LINE_SIZE];
@ -1904,7 +1906,7 @@ static void do_goto_tag(EditState *s) {
/* XXX: should have next-tag and previous-tag */
static void do_list_tags(EditState *s) {
static void do_list_tags(EditState *s, int argval) {
char buf[256];
EditBuffer *b;
QEProperty *p;
@ -1938,6 +1940,237 @@ static CompletionDef tag_completion = {
"tag", tag_complete, tag_print_entry, tag_get_entry
};
/*---------------- paragraph handling ----------------*/
int eb_next_paragraph(EditBuffer *b, int offset) {
/* find end of paragraph around or after point:
skip blank lines, if any, then skip non blank lines
and return start of blank line before text.
*/
int text_found = 0;
offset = eb_goto_bol(b, offset);
while (offset < b->total_size) {
if (eb_is_blank_line(b, offset, NULL)) {
if (text_found)
break;
} else {
text_found = 1;
}
offset = eb_next_line(b, offset);
}
return offset;
}
void do_mark_paragraph(EditState *s, int n) {
/* mark-paragraph (bound to M-h):
mark_paragraph(n = arg_val)
Put point at beginning of this paragraph, mark at end.
The paragraph marked is the one that contains point or follows point.
With argument ARG, puts mark at end of a following paragraph, so that
the number of paragraphs marked equals ARG.
If ARG is negative, point is put at end of this paragraph, mark is put
at beginning of this or a previous paragraph.
The paragraph marked is the one that contains point or precedes point.
Interactively if the current region is highlighted, it marks
the next ARG paragraphs after the ones already marked.
*/
int start = s->offset;
int end = s->region_style ? s->b->mark : s->offset;
if (n < 0) {
end = eb_prev_paragraph(s->b, end);
if (!s->region_style)
start = eb_next_paragraph(s->b, end);
while (++n < 0 && end > 0) {
end = eb_prev_paragraph(s->b, end);
}
} else
if (n > 0) {
end = eb_next_paragraph(s->b, end);
if (!s->region_style)
start = eb_prev_paragraph(s->b, end);
while (--n > 0 && end < s->b->total_size) {
end = eb_next_paragraph(s->b, end);
}
}
do_mark_region(s, end, start);
}
int eb_prev_paragraph(EditBuffer *b, int offset) {
/* find start of paragraph around or before point:
skip blank lines, if any, then skip non blank lines
and return start of blank line after end of text.
*/
int text_found = 0;
offset = eb_goto_bol(b, offset);
while (offset > 0) {
if (eb_is_blank_line(b, offset, NULL)) {
if (text_found)
break;
} else {
text_found = 1;
}
offset = eb_prev_line(b, offset);
}
return offset;
}
void do_forward_paragraph(EditState *s, int n) {
for (; n < 0 && s->offset > 0; n++) {
s->offset = eb_prev_paragraph(s->b, s->offset);
}
for (; n > 0 && s->offset < s->b->total_size; n--) {
s->offset = eb_next_paragraph(s->b, s->offset);
}
}
void do_kill_paragraph(EditState *s, int n) {
/*
kill_paragraph(n = ARG)
Kill forward to end of paragraph.
With arg N, kill forward to Nth end of paragraph;
negative arg -N means kill backward to Nth start of paragraph.
*/
if (n != 0) {
int start = s->offset;
do_forward_paragraph(s, n);
do_kill(s, start, s->offset, n, 0);
}
}
/* replace the contents between p1 and p2 with a specified number
of newlines and spaces */
static int eb_respace(EditBuffer *b, int p1, int p2, int newlines, int spaces) {
int adjust = 0, nb, offset1, c;
while (newlines > 0 && p1 < p2) {
c = eb_nextc(b, p1, &offset1);
if (c != '\n')
break;
p1 = offset1;
newlines--;
}
if (newlines > 0) {
nb = eb_insert_uchars(b, p1, '\n', newlines);
adjust += nb;
p1 += nb;
p2 += nb;
}
while (spaces > 0 && p1 < p2) {
c = eb_nextc(b, p1, &offset1);
if (c == ' ') {
p1 = offset1;
spaces--;
} else {
nb = eb_delete(b, p1, offset1 - p1);
adjust -= nb;
p2 -= nb;
}
}
if (p1 < p2) {
nb = eb_delete(b, p1, p2 - p1);
adjust -= nb;
p2 -= nb;
}
if (spaces) {
nb = eb_insert_uchars(b, p1, ' ', spaces);
adjust += nb;
p1 += nb;
p2 += nb;
}
return adjust;
}
static int get_indent_size(EditState *s, int p1, int p2) {
int indent_size = 0;
while (p1 < p2) {
int c = eb_nextc(s->b, p1, &p1);
if (!qe_isblank(c))
break;
if (c == '\t') {
int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH;
indent_size += tw - indent_size % tw;
} else {
indent_size++;
}
}
return indent_size;
}
void do_fill_paragraph(EditState *s)
{
/* buffer offsets, byte counts */
int par_start, par_end, offset, offset1, chunk_start, word_start;
/* number of characters / screen positions */
int col, indent0_size, indent_size, word_size;
/* find start & end of paragraph */
par_end = eb_next_paragraph(s->b, s->offset);
par_start = eb_prev_paragraph(s->b, par_end);
/* skip the blank line if any */
eb_is_blank_line(s->b, par_start, &par_start);
/* compute indent sizes for first and second lines */
indent0_size = get_indent_size(s, par_start, par_end);
offset = eb_next_line(s->b, par_start);
indent_size = get_indent_size(s, offset, par_end);
/* reflow words to fill lines */
col = 0;
offset = par_start;
while (offset < par_end) {
/* skip spaces */
chunk_start = offset;
while (offset < par_end) {
int c = eb_nextc(s->b, offset, &offset1);
if (!qe_isspace(c))
break;
offset = offset1;
}
/* skip word */
word_start = offset;
word_size = 0;
while (offset < par_end) {
int c = eb_nextc(s->b, offset, &offset1);
if (qe_isspace(c))
break;
offset = offset1;
/* handle variable width and combining glyphs */
word_size += unicode_tty_glyph_width(c);
}
if (chunk_start == par_start) {
/* preserve spaces at paragraph start */
col += indent0_size + word_size;
} else {
if (word_start == offset) {
/* space at end of paragraph: append a newline */
eb_respace(s->b, chunk_start, word_start, 1, 0);
break;
}
if (col + 1 + word_size > s->b->fill_column) {
/* insert newline and indentation */
int nb = eb_respace(s->b, chunk_start, word_start, 1, indent_size);
offset += nb;
par_end += nb;
col = indent_size + word_size;
} else {
/* single space the word */
int nb = eb_respace(s->b, chunk_start, word_start, 0, 1);
offset += nb;
par_end += nb;
col += 1 + word_size;
}
}
}
}
/*---------------- command and binding definitions ----------------*/
static CmdDef extra_commands[] = {
CMD2( KEY_META('='), KEY_NONE,
"compare-windows", do_compare_windows, ESi, "p" , "")
@ -2002,8 +2235,8 @@ static CmdDef extra_commands[] = {
CMD2( KEY_CTRLH('a'), KEY_CTRLH(KEY_CTRL('A')),
"apropos", do_apropos, ESs,
"s{Apropos: }[symbol]|apropos|", "")
CMD0( KEY_CTRLH('b'), KEY_NONE,
"describe-bindings", do_describe_bindings, "")
CMD2( KEY_CTRLH('b'), KEY_NONE,
"describe-bindings", do_describe_bindings, ESi, "p", "")
CMD2( KEY_CTRLH('B'), KEY_NONE,
"show-bindings", do_show_bindings, ESs,
"s{Show bindings of command: }[command]|command|", "")
@ -2040,14 +2273,28 @@ static CmdDef extra_commands[] = {
CMD3( KEY_NONE, KEY_NONE,
"reverse-sort-region", do_sort_region, ESii, SF_REVERSE, "*vp", "")
CMD0( KEY_NONE, KEY_NONE,
"list-tags", do_list_tags, "")
CMD2( KEY_NONE, KEY_NONE,
"list-tags", do_list_tags, ESi, "p", "")
CMD0( KEY_CTRLX(','), KEY_META(KEY_F1),
"goto-tag", do_goto_tag, "")
CMD2( KEY_CTRLX('.'), KEY_NONE,
"find-tag", do_find_tag, ESs,
"s{Find tag: }[tag]|tag|", "")
/*---------------- Paragraph handling ----------------*/
CMD3( KEY_META('h'), KEY_NONE,
"mark-paragraph", do_mark_paragraph, ESi, +1, "P", "")
CMD3( KEY_META('{'), KEY_CTRL_UP,
"backward-paragraph", do_forward_paragraph, ESi, -1, "P", "")
CMD3( KEY_META('}'), KEY_CTRL_DOWN,
"forward-paragraph", do_forward_paragraph, ESi, +1, "P", "")
CMD2( KEY_META('q'), KEY_NONE,
"fill-paragraph", do_fill_paragraph, ES, "*", "")
/* should have fill-region */
CMD3( KEY_NONE, KEY_NONE,
"kill-paragraph", do_kill_paragraph, ESi, 1, "P", "")
CMD_DEF_END,
};

View file

@ -1372,6 +1372,34 @@ static CmdDef dired_global_commands[] = {
CMD_DEF_END,
};
#if 0
static int dired_buffer_load(EditBuffer *b, FILE *f)
{
/* XXX: launch subprocess to list dired contents */
return -1;
}
static int dired_buffer_save(EditBuffer *b, int start, int end,
const char *filename)
{
/* XXX: prevent saving parsed contents to dired file */
return -1;
}
static void dired_buffer_close(EditBuffer *b)
{
/* XXX: free dired structures? */
}
static EditBufferDataType dired_data_type = {
"dired",
dired_buffer_load,
dired_buffer_save,
dired_buffer_close,
NULL, /* next */
};
#endif
static int filelist_init(void);
static int dired_init(void)
@ -1388,6 +1416,7 @@ static int dired_init(void)
dired_mode.display_hook = dired_display_hook;
dired_mode.get_default_path = dired_get_default_path;
//eb_register_data_type(&dired_data_type);
qe_register_mode(&dired_mode, /* MODEF_DATATYPE | */ MODEF_MAJOR | MODEF_VIEW);
qe_register_variables(dired_variables, countof(dired_variables));
qe_register_cmd_table(dired_commands, &dired_mode);

View file

@ -927,32 +927,32 @@ static void do_fractal_move(EditState *s, int deltax, int deltay) {
}
}
static void do_fractal_move_x(EditState *s, int delta) {
do_fractal_move(s, delta, 0);
static void do_fractal_move_x(EditState *s, int n) {
do_fractal_move(s, n, 0);
}
static void do_fractal_move_y(EditState *s, int delta) {
do_fractal_move(s, 0, delta);
static void do_fractal_move_y(EditState *s, int n) {
do_fractal_move(s, 0, n);
}
static void do_fractal_zoom(EditState *s, int delta) {
static void do_fractal_zoom(EditState *s, int n) {
FractalState *ms = fractal_get_state(s, 1);
if (ms) {
fractal_set_zoom(ms, ms->zoom + delta);
fractal_set_zoom(ms, ms->zoom + n);
}
}
static void do_fractal_rotate(EditState *s, int delta) {
static void do_fractal_rotate(EditState *s, int n) {
FractalState *ms = fractal_get_state(s, 1);
if (ms) {
fractal_set_rotation(ms, delta ? ms->rot + delta : 0);
fractal_set_rotation(ms, n ? ms->rot + n : 0);
}
}
static void do_fractal_shift_colors(EditState *s, int delta) {
static void do_fractal_shift_colors(EditState *s, int n) {
FractalState *ms = fractal_get_state(s, 1);
if (ms) {
ms->shift += delta;
ms->shift += n;
#if USE_BITMAP_API
fractal_invalidate(ms);
#else
@ -979,18 +979,18 @@ static void do_fractal_set_colors(EditState *s, int type) {
}
}
static void do_fractal_iter(EditState *s, int delta) {
static void do_fractal_iter(EditState *s, int n) {
FractalState *ms = fractal_get_state(s, 1);
if (ms) {
ms->maxiter += delta;
ms->maxiter += n;
fractal_invalidate(ms);
}
}
static void do_fractal_bailout(EditState *s, int delta) {
static void do_fractal_bailout(EditState *s, int n) {
FractalState *ms = fractal_get_state(s, 1);
if (ms) {
ms->bailout += delta;
ms->bailout += n;
fractal_invalidate(ms);
}
}
@ -1084,40 +1084,40 @@ static void fractal_display_hook(EditState *s) {
}
static CmdDef fractal_commands[] = {
CMD1( KEY_LEFT, KEY_NONE,
"fractal-left", do_fractal_move_x, -1, "")
CMD1( KEY_RIGHT, KEY_NONE,
"fractal-right", do_fractal_move_x, +1, "")
CMD1( KEY_UP, KEY_NONE,
"fractal-up", do_fractal_move_y, -1, "")
CMD1( KEY_DOWN, KEY_NONE,
"fractal-down", do_fractal_move_y, +1, "")
CMD1( '+', ' ',
"fractal-zoom-in", do_fractal_zoom, +1, "")
CMD1( '-', '_',
"fractal-zoom-out", do_fractal_zoom, -1, "")
CMD1( '\\', '.',
"fractal-rotate-left", do_fractal_rotate, +1, "")
CMD1( '/', KEY_NONE,
"fractal-rotate-right", do_fractal_rotate, -1, "")
CMD1( '|', KEY_NONE,
"fractal-rotate-none", do_fractal_rotate, 0, "")
CMD1( 'c', KEY_NONE,
"fractal-set-colors-default", do_fractal_set_colors, 0, "")
CMD1( 'g', KEY_NONE,
"fractal-set-colors-gray", do_fractal_set_colors, 1, "")
CMD1( '[', KEY_NONE,
"fractal-shift-colors-left", do_fractal_shift_colors, -1, "")
CMD1( ']', KEY_NONE,
"fractal-shift-colors-right", do_fractal_shift_colors, +1, "")
CMD1( '{', KEY_NONE,
"fractal-iter-less", do_fractal_iter, -1, "")
CMD1( '}', KEY_NONE,
"fractal-iter-more", do_fractal_iter, +1, "")
CMD1( '<', KEY_NONE,
"fractal-bailout-less", do_fractal_bailout, -1, "")
CMD1( '>', KEY_NONE,
"fractal-bailout-more", do_fractal_bailout, +1, "")
CMD3( KEY_LEFT, KEY_NONE,
"fractal-left", do_fractal_move_x, ESi, -1, "P", "")
CMD3( KEY_RIGHT, KEY_NONE,
"fractal-right", do_fractal_move_x, ESi, +1, "P", "")
CMD3( KEY_UP, KEY_NONE,
"fractal-up", do_fractal_move_y, ESi, -1, "P", "")
CMD3( KEY_DOWN, KEY_NONE,
"fractal-down", do_fractal_move_y, ESi, +1, "P", "")
CMD3( '+', ' ',
"fractal-zoom-in", do_fractal_zoom, ESi, +1, "P", "")
CMD3( '-', '_',
"fractal-zoom-out", do_fractal_zoom, ESi, -1, "P", "")
CMD3( '\\', '.',
"fractal-rotate-left", do_fractal_rotate, ESi, +1, "P", "")
CMD3( '/', KEY_NONE,
"fractal-rotate-right", do_fractal_rotate, ESi, -1, "P", "")
CMD3( '|', KEY_NONE,
"fractal-rotate-none", do_fractal_rotate, ESi, 0, "v", "")
CMD3( 'c', KEY_NONE,
"fractal-set-colors-default", do_fractal_set_colors, ESi, 0, "v", "")
CMD3( 'g', KEY_NONE,
"fractal-set-colors-gray", do_fractal_set_colors, ESi, 1, "v", "")
CMD3( '[', KEY_NONE,
"fractal-shift-colors-left", do_fractal_shift_colors, ESi, -1, "P", "")
CMD3( ']', KEY_NONE,
"fractal-shift-colors-right", do_fractal_shift_colors, ESi, +1, "P", "")
CMD3( '{', KEY_NONE,
"fractal-iter-less", do_fractal_iter, ESi, -1, "P", "")
CMD3( '}', KEY_NONE,
"fractal-iter-more", do_fractal_iter, ESi, +1, "P", "")
CMD3( '<', KEY_NONE,
"fractal-bailout-less", do_fractal_bailout, ESi, -1, "P", "")
CMD3( '>', KEY_NONE,
"fractal-bailout-more", do_fractal_bailout, ESi, +1, "P", "")
CMD2( '1', '2',
"fractal-set-type", do_fractal_set_type, ESi, "k", "")
CMD2( '=', KEY_NONE,

View file

@ -124,12 +124,9 @@ static void do_set_width(EditState *s, int w)
}
}
static void do_increase_width(EditState *s, int incr)
static void do_increase_width(EditState *s, int n)
{
int w;
w = s->dump_width + incr;
if (w >= 1)
do_set_width(s, w);
do_set_width(s, s->dump_width + n);
}
static void do_toggle_hex(EditState *s)
@ -139,10 +136,10 @@ static void do_toggle_hex(EditState *s)
/* common binary and hex commands */
static CmdDef binary_commands[] = {
CMD1( KEY_CTRL_LEFT, KEY_NONE,
"decrease-width", do_increase_width, -1, "")
CMD1( KEY_CTRL_RIGHT, KEY_NONE,
"increase-width", do_increase_width, 1, "")
CMD3( KEY_CTRL_LEFT, KEY_NONE,
"decrease-width", do_increase_width, ESi, -1, "P", "")
CMD3( KEY_CTRL_RIGHT, KEY_NONE,
"increase-width", do_increase_width, ESi, +1, "P", "")
CMD2( KEY_NONE, KEY_NONE,
"set-width", do_set_width, ESi,
"p{Width: }", "")

245
qe.c
View file

@ -735,234 +735,7 @@ void do_mark_region(EditState *s, int mark, int offset)
s->region_style = QE_STYLE_REGION_HILITE;
}
/* paragraph handling */
int eb_next_paragraph(EditBuffer *b, int offset) {
/* find end of paragraph around or after point:
skip blank lines, if any, then skip non blank lines
and return start of blank line before text.
*/
int text_found = 0;
offset = eb_goto_bol(b, offset);
while (offset < b->total_size) {
if (eb_is_blank_line(b, offset, NULL)) {
if (text_found)
break;
} else {
text_found = 1;
}
offset = eb_next_line(b, offset);
}
return offset;
}
void do_mark_paragraph(EditState *s, int n) {
/* mark-paragraph (bound to M-h):
mark_paragraph(n = arg_val)
Put point at beginning of this paragraph, mark at end.
The paragraph marked is the one that contains point or follows point.
With argument ARG, puts mark at end of a following paragraph, so that
the number of paragraphs marked equals ARG.
If ARG is negative, point is put at end of this paragraph, mark is put
at beginning of this or a previous paragraph.
The paragraph marked is the one that contains point or precedes point.
Interactively if the current region is highlighted, it marks
the next ARG paragraphs after the ones already marked.
*/
int start = s->offset;
int end = s->region_style ? s->b->mark : s->offset;
if (n < 0) {
end = eb_prev_paragraph(s->b, end);
if (!s->region_style)
start = eb_next_paragraph(s->b, end);
while (++n < 0 && end > 0) {
end = eb_prev_paragraph(s->b, end);
}
} else
if (n > 0) {
end = eb_next_paragraph(s->b, end);
if (!s->region_style)
start = eb_prev_paragraph(s->b, end);
while (--n > 0 && end < s->b->total_size) {
end = eb_next_paragraph(s->b, end);
}
}
do_mark_region(s, end, start);
}
int eb_prev_paragraph(EditBuffer *b, int offset) {
/* find start of paragraph around or before point:
skip blank lines, if any, then skip non blank lines
and return start of blank line after end of text.
*/
int text_found = 0;
offset = eb_goto_bol(b, offset);
while (offset > 0) {
if (eb_is_blank_line(b, offset, NULL)) {
if (text_found)
break;
} else {
text_found = 1;
}
offset = eb_prev_line(b, offset);
}
return offset;
}
void do_forward_paragraph(EditState *s, int n) {
for (; n < 0 && s->offset > 0; n++) {
s->offset = eb_prev_paragraph(s->b, s->offset);
}
for (; n > 0 && s->offset < s->b->total_size; n--) {
s->offset = eb_next_paragraph(s->b, s->offset);
}
}
void do_kill_paragraph(EditState *s, int n) {
/*
kill_paragraph(n = ARG)
Kill forward to end of paragraph.
With arg N, kill forward to Nth end of paragraph;
negative arg -N means kill backward to Nth start of paragraph.
*/
if (n != 0) {
int start = s->offset;
do_forward_paragraph(s, n);
do_kill(s, start, s->offset, n, 0);
}
}
/* replace the contents between p1 and p2 with a specified number
of newlines and spaces */
static int eb_respace(EditBuffer *b, int p1, int p2, int newlines, int spaces) {
int adjust = 0, nb, offset1, c;
while (newlines > 0 && p1 < p2) {
c = eb_nextc(b, p1, &offset1);
if (c != '\n')
break;
p1 = offset1;
newlines--;
}
if (newlines > 0) {
nb = eb_insert_uchars(b, p1, '\n', newlines);
adjust += nb;
p1 += nb;
p2 += nb;
}
while (spaces > 0 && p1 < p2) {
c = eb_nextc(b, p1, &offset1);
if (c == ' ') {
p1 = offset1;
spaces--;
} else {
nb = eb_delete(b, p1, offset1 - p1);
adjust -= nb;
p2 -= nb;
}
}
if (p1 < p2) {
nb = eb_delete(b, p1, p2 - p1);
adjust -= nb;
p2 -= nb;
}
if (spaces) {
nb = eb_insert_uchars(b, p1, ' ', spaces);
adjust += nb;
p1 += nb;
p2 += nb;
}
return adjust;
}
static int get_indent_size(EditState *s, int p1, int p2) {
int indent_size = 0;
while (p1 < p2) {
int c = eb_nextc(s->b, p1, &p1);
if (!qe_isblank(c))
break;
if (c == '\t') {
int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH;
indent_size += tw - indent_size % tw;
} else {
indent_size++;
}
}
return indent_size;
}
void do_fill_paragraph(EditState *s)
{
/* buffer offsets, byte counts */
int par_start, par_end, offset, offset1, chunk_start, word_start;
/* number of characters / screen positions */
int col, indent0_size, indent_size, word_size;
/* find start & end of paragraph */
par_end = eb_next_paragraph(s->b, s->offset);
par_start = eb_prev_paragraph(s->b, par_end);
/* skip the blank line if any */
eb_is_blank_line(s->b, par_start, &par_start);
/* compute indent sizes for first and second lines */
indent0_size = get_indent_size(s, par_start, par_end);
offset = eb_next_line(s->b, par_start);
indent_size = get_indent_size(s, offset, par_end);
/* reflow words to fill lines */
col = 0;
offset = par_start;
while (offset < par_end) {
/* skip spaces */
chunk_start = offset;
while (offset < par_end) {
int c = eb_nextc(s->b, offset, &offset1);
if (!qe_isspace(c))
break;
offset = offset1;
}
/* skip word */
word_start = offset;
word_size = 0;
while (offset < par_end) {
int c = eb_nextc(s->b, offset, &offset1);
if (qe_isspace(c))
break;
offset = offset1;
/* handle variable width and combining glyphs */
word_size += unicode_tty_glyph_width(c);
}
if (chunk_start == par_start) {
/* preserve spaces at paragraph start */
col += indent0_size + word_size;
} else {
if (word_start == offset) {
/* space at end of paragraph: append a newline */
eb_respace(s->b, chunk_start, word_start, 1, 0);
break;
}
if (col + 1 + word_size > s->b->fill_column) {
/* insert newline and indentation */
int nb = eb_respace(s->b, chunk_start, word_start, 1, indent_size);
offset += nb;
par_end += nb;
col = indent_size + word_size;
} else {
/* single space the word */
int nb = eb_respace(s->b, chunk_start, word_start, 0, 1);
offset += nb;
par_end += nb;
col += 1 + word_size;
}
}
}
}
/*---------------- Case handling ----------------*/
/* Upper / lower / capital case functions. Update offset, return isword */
/* arg: -1=lower-case, +1=upper-case, +2=capital-case */
@ -7370,21 +7143,21 @@ EditState *qe_find_target_window(EditState *s, int activate) {
}
/* Select appropriate mode for buffer:
* iff dir == 0, select best mode
* iff dir > 0, select next mode
* iff dir < 0, select previous mode
* if n == 0, select best mode
* if n > 0, select n-th next mode
* if n < 0, select n-th previous mode
*/
void do_set_next_mode(EditState *s, int dir)
void do_set_next_mode(EditState *s, int n)
{
if (s->flags & (WF_POPUP | WF_MINIBUF))
return;
/* next-mode from the dired window applies to the target window */
s = qe_find_target_window(s, 0);
qe_set_next_mode(s, dir, 1);
qe_set_next_mode(s, n, 1);
}
void qe_set_next_mode(EditState *s, int dir, int status)
void qe_set_next_mode(EditState *s, int n, int status)
{
u8 buf[4097];
int size;
@ -7414,10 +7187,10 @@ void qe_set_next_mode(EditState *s, int dir, int status)
b->filename, 0, b->st_mode, b->total_size,
buf, size, b->charset, b->eol_type);
found = 0;
if (dir && nb > 0) {
if (n && nb > 0) {
for (i = 0; i < nb; i++) {
if (s->mode == modes[i]) {
found = (i + dir) % nb;
found = (i + n) % nb;
if (found < 0)
found += nb;
break;

6
qe.h
View file

@ -2141,8 +2141,8 @@ void edit_display(QEmacsState *qs);
void edit_invalidate(EditState *s, int all);
void display_mode_line(EditState *s);
int edit_set_mode(EditState *s, ModeDef *m);
void qe_set_next_mode(EditState *s, int dir, int status);
void do_set_next_mode(EditState *s, int dir);
void qe_set_next_mode(EditState *s, int n, int status);
void do_set_next_mode(EditState *s, int n);
/* loading files */
void do_exit_qemacs(EditState *s, int argval);
@ -2337,7 +2337,7 @@ void do_describe_key_briefly(EditState *s);
void do_show_bindings(EditState *s, const char *cmd_name);
void do_apropos(EditState *s, const char *str);
EditBuffer *new_help_buffer(void);
void do_describe_bindings(EditState *s);
void do_describe_bindings(EditState *s, int argval);
void do_help_for_help(EditState *s);
void qe_event_init(void);
void window_get_min_size(EditState *s, int *w_ptr, int *h_ptr);

View file

@ -182,20 +182,6 @@ static CmdDef basic_commands[] = {
"s{Set visited file name: }[file]|file|"
"s{Rename file? }|newname|", "")
/*---------------- Paragraph handling ----------------*/
CMD3( KEY_META('h'), KEY_NONE,
"mark-paragraph", do_mark_paragraph, ESi, +1, "P", "")
CMD3( KEY_META('{'), KEY_CTRL_UP,
"backward-paragraph", do_forward_paragraph, ESi, -1, "P", "")
CMD3( KEY_META('}'), KEY_CTRL_DOWN,
"forward-paragraph", do_forward_paragraph, ESi, +1, "P", "")
CMD2( KEY_META('q'), KEY_NONE,
"fill-paragraph", do_fill_paragraph, ES, "*", "")
/* should have fill-region */
CMD3( KEY_NONE, KEY_NONE,
"kill-paragraph", do_kill_paragraph, ESi, 1, "P", "")
/*---------------- Case handling ----------------*/
CMD3( KEY_META('c'), KEY_NONE,
@ -250,11 +236,11 @@ static CmdDef basic_commands[] = {
/* should merge these functions */
CMD0( KEY_CTRLX('o'), KEY_NONE,
"other-window", do_other_window, "") /* "p"? */
"other-window", do_other_window, "")
CMD0( KEY_CTRLX('n'), KEY_NONE,
"next-window", do_other_window, "") /* "P"? */
"next-window", do_other_window, "")
CMD0( KEY_CTRLX('p'), KEY_NONE,
"previous-window", do_previous_window, "") /* "P"? */
"previous-window", do_previous_window, "")
#ifndef CONFIG_TINY
CMD1( KEY_META(KEY_CTRL('l')), KEY_NONE,
"center-cursor", do_center_cursor, 1, "")