From ea7665dee91525d663bce8801b58ed9f56f99c0a Mon Sep 17 00:00:00 2001 From: Charlie Gordon Date: Tue, 8 Oct 2024 21:58:26 +0200 Subject: [PATCH] New indenting commands - rename `indent_size` window field as `indent_width` for consistency - handle negative argval in `do_tabulate` - fix reverse region in `indent-rigidly` - only indent lines that start in the region, ie: lines whose beginning offset >= start and < end - fix `do_backspace` to delete a TAB worth of white space after TAB. no longer use `undo` for this. - fix `find_window` to locate window according to top-left corner of current - add `unindent-region` on `M-C-|` to unindent current region - add `unindent-buffer` - redirect `S-RET` and `S-DEL` to their unshifted versions - rename `c-indent-command` command as `c-indent-line-or-region` --- extras.c | 138 ++++++++++++++++---------------------------- lang/clang.c | 33 ++++++----- lang/python.c | 2 +- qe.c | 155 ++++++++++++++++++++++++++++++++++++++------------ qe.h | 21 +++---- qescript.c | 2 +- tty.c | 12 +++- variables.c | 2 +- 8 files changed, 211 insertions(+), 154 deletions(-) diff --git a/extras.c b/extras.c index e8d01b1..d7a888d 100644 --- a/extras.c +++ b/extras.c @@ -22,8 +22,6 @@ * THE SOFTWARE. */ -#include - #include "qe.h" #include "variables.h" @@ -740,45 +738,13 @@ static void do_untabify_region(EditState *s) eb_untabify(s->b, s->b->mark, s->offset); } #endif -static void do_indent_region(EditState *s, int start, int end) + +/*---------------- indentation ----------------*/ + +static void do_indent_rigidly(EditState *s, int start, int end, int argval) { - int col_num, line1, line2; - - /* deactivate region hilite */ - s->region_style = 0; - - /* Swap point and mark so mark <= point */ - if (end < start) { - int tmp = start; - end = start; - start = tmp; - } - /* We do it with lines to avoid offset variations during indenting */ - eb_get_pos(s->b, &line1, &col_num, start); - eb_get_pos(s->b, &line2, &col_num, end); - - if (col_num == 0) - line2--; - - /* Iterate over all lines inside block */ - s->b->mark = eb_goto_bol(s->b, start); - for (; line1 <= line2; line1++) { - if (s->mode->indent_func) { - (s->mode->indent_func)(s, eb_goto_pos(s->b, line1, 0)); - } else { - s->offset = eb_goto_pos(s->b, line1, 0); - do_tabulate(s, 1); - } - } - s->offset = eb_goto_eol(s->b, s->offset); -} - -void do_indent_rigidly(EditState *s, int start, int end, int argval) -{ - int col_num, line1, line2; - if (argval == NO_ARG) { - // enter interactive mode + /* enter interactive mode */ QEmacsState *qs = s->qe_state; if (!qs->first_transient_key) { s->region_style = QE_STYLE_REGION_HILITE; @@ -788,54 +754,47 @@ void do_indent_rigidly(EditState *s, int start, int end, int argval) qe_register_transient_binding(qs, "indent-rigidly-left-to-tab-stop", "S-left, S-TAB"); qe_register_transient_binding(qs, "indent-rigidly-right-to-tab-stop", "S-right, TAB"); } + } else { + do_indent_rigidly_by(s, start, end, argval); + } +} + +static void do_indent_region(EditState *s, int start, int end, int argval) +{ + int col_num, line, line1, line2; + + /* deactivate region hilite */ + s->region_style = 0; + + if (argval < 0 || !s->mode->indent_func + || s->qe_state->last_cmd_func == (CmdFunc)do_indent_region) { + do_indent_rigidly_to_tab_stop(s, start, end, argval); return; } /* Swap point and mark so mark <= point */ if (end < start) { int tmp = start; - end = start; - start = tmp; + start = end; + end = tmp; } /* We do it with lines to avoid offset variations during indenting */ eb_get_pos(s->b, &line1, &col_num, start); - eb_get_pos(s->b, &line2, &col_num, end); - - if (col_num == 0) - line2--; - - /* Iterate over all lines inside block */ - //s->b->mark = eb_goto_bol(s->b, start); - for (; line1 <= line2; line1++) { - int offset = eb_goto_pos(s->b, line1, 0); - int off1, off2; - int indent = find_indent(s, offset, 0, &off1); - int new_indent = max_int(0, indent + argval); - /* if line is empty, remove indentation, - * otherwise increase it by argval columns. - */ - if (eb_nextc(s->b, off1, &off2) == '\n') - new_indent = 0; - make_indent(s, offset, off1, 0, new_indent); - } - //s->offset = eb_goto_eol(s->b, s->offset); -} - -static void do_indent_rigidly_to_tab_stop(EditState *s, int start, int end, int dir) { - int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH; - int indent = s->indent_size > 0 ? s->indent_size : tw; - - do_indent_rigidly(s, start, end, indent * dir); -} - -static void do_untabulate(EditState *s) { - if (s->region_style) { - do_indent_rigidly_to_tab_stop(s, s->b->mark, s->offset, -1); + if (start == end) { + line2 = line1; } else { - // FIXME: should decrease indentation at s->offset - int start = eb_goto_bol(s->b, s->offset); - int end = eb_goto_eol(s->b, s->offset); - do_indent_rigidly_to_tab_stop(s, start, end, -1); + if (col_num > 0) + line1++; + eb_get_pos(s->b, &line2, &col_num, end); + if (col_num == 0) + line2--; + } + /* Iterate over all lines inside block */ + for (line = line1; line <= line2; line++) { + int offset = eb_goto_pos(s->b, line, 0); + int off1; + if (eb_nextc(s->b, offset, &off1) != '\n') + (s->mode->indent_func)(s, offset); } } @@ -1941,7 +1900,7 @@ static void do_describe_window(EditState *s, int argval) s->wrap == WRAP_LINE ? "LINE" : s->wrap == WRAP_TERM ? "TERM" : s->wrap == WRAP_WORD ? "WORD" : "???"); - eb_printf(b1, "%*s: %d\n", w, "indent_size", s->indent_size); + eb_printf(b1, "%*s: %d\n", w, "indent_width", s->indent_width); eb_printf(b1, "%*s: %d\n", w, "indent_tabs_mode", s->indent_tabs_mode); eb_printf(b1, "%*s: %d\n", w, "interactive", s->interactive); eb_printf(b1, "%*s: %d\n", w, "force_highlight", s->force_highlight); @@ -3158,29 +3117,32 @@ static const CmdDef extra_commands[] = { do_untabify, ESii, "*" "ze") CMD2( "indent-region", "M-C-\\", - "Indent each nonblank line in the region", - do_indent_region, ESii, "*" "md") + "Indent each nonblank line that starts inside the region", + do_indent_region, ESiii, "*" "mdp") + CMD2( "unindent-region", "M-C-|", + "Unindent each nonblank line that starts inside the region", + do_indent_region, ESiii, "*" "mdq") CMD2( "indent-buffer", "", "Indent each nonblank line in the buffer", - do_indent_region, ESii, "*" "ze") + do_indent_region, ESiii, "*" "zep") + CMD2( "unindent-buffer", "", + "Unindent each nonblank line in the buffer", + do_indent_region, ESiii, "*" "zeq") CMD2( "indent-rigidly", "C-x TAB", "Indent the region interactively", do_indent_rigidly, ESiii, "*" "md" "P") CMD3( "indent-rigidly-left", "", "Decrease the region indentation", - do_indent_rigidly, ESiii, "*" "md" "v", -1) + do_indent_rigidly_by, ESiii, "*" "md" "v", -1) CMD3( "indent-rigidly-right", "", "Increase the region indentation", - do_indent_rigidly, ESiii, "*" "md" "v", +1) + do_indent_rigidly_by, ESiii, "*" "md" "v", +1) CMD3( "indent-rigidly-left-to-tab-stop", "", - "Decrease the region indentation by one tab", + "Decrease the region indentation by one tab width", do_indent_rigidly_to_tab_stop, ESiii, "*" "md" "v", -1) CMD3( "indent-rigidly-right-to-tab-stop", "", - "Increase the region indentation by one tab", + "Increase the region indentation by one tab width", do_indent_rigidly_to_tab_stop, ESiii, "*" "md" "v", +1) - CMD2( "untabulate", "S-TAB", - "Decrease indentation", - do_untabulate, ES, "*") CMD2( "show-date-and-time", "C-x t", "Show current date and time", diff --git a/lang/clang.c b/lang/clang.c index 750284d..daaad71 100644 --- a/lang/clang.c +++ b/lang/clang.c @@ -817,7 +817,7 @@ void c_indent_line(EditState *s, int offset0) if (pos1 == len || cp->sbuf[0] == C_STYLE_PREPROCESS) continue; if (c_line_has_label(s, cp->buf, len, cp->sbuf)) { - pos1 = pos1 - s->qe_state->c_label_indent + s->indent_size; + pos1 = pos1 - s->qe_state->c_label_indent + s->indent_width; } /* scan the line from end to start */ for (off = len; off-- > 0;) { @@ -860,7 +860,7 @@ void c_indent_line(EditState *s, int offset0) *q = '\0'; if (!eoi_found && strfind("if|for|while|do|switch|foreach", kbuf)) { - pos = pos1 + s->indent_size; + pos = pos1 + s->indent_width; goto end_parse; } if (has_else == 0) @@ -885,7 +885,7 @@ void c_indent_line(EditState *s, int offset0) goto end_parse; } if (lpos == -1) { - pos = pos1 + s->indent_size; + pos = pos1 + s->indent_width; eoi_found = 1; goto end_parse; } else { @@ -949,7 +949,7 @@ void c_indent_line(EditState *s, int offset0) /* start of instruction already found */ pos = lpos; if (!eoi_found) - pos += s->indent_size; + pos += s->indent_width; goto end_parse; } eoi_found = 1; @@ -996,7 +996,7 @@ void c_indent_line(EditState *s, int offset0) /* start of instruction already found */ pos = lpos; if (!eoi_found) - pos += s->indent_size; + pos += s->indent_width; } } @@ -1029,18 +1029,18 @@ void c_indent_line(EditState *s, int offset0) if (qe_isalpha_(c)) { if (has_else == 1 && cp->buf[i] == 'i' && cp->buf[i + 1] == 'f' && !qe_isalnum_(cp->buf[i + 2])) { /* unindent if after naked else */ - pos -= s->indent_size; + pos -= s->indent_width; break; } if (c_line_has_label(s, cp->buf + i, len - i, cp->sbuf + i)) { - pos -= s->indent_size + s->qe_state->c_label_indent; + pos -= s->indent_width + s->qe_state->c_label_indent; break; } break; } /* NOTE: strings & comments are correctly ignored there */ if (c == '}') { - pos -= s->indent_size; + pos -= s->indent_width; break; } if ((c == '&' || c == '|') && cp->buf[i + 1] == c) { @@ -1050,22 +1050,22 @@ void c_indent_line(EditState *s, int offset0) for (j = i + 2; cp->buf[j] == ' '; j++) continue; if (j == len) { - pos -= s->indent_size; + pos -= s->indent_width; } else { pos -= j - i + 2; } #else - pos -= s->indent_size; + pos -= s->indent_width; #endif break; } if (c == '{') { - if (pos == s->indent_size && !eoi_found) { + if (pos == s->indent_width && !eoi_found) { pos = 0; break; } // XXX: need fix for GNU style - pos -= s->indent_size; + pos -= s->indent_width; } break; } @@ -1115,13 +1115,16 @@ done: static void do_c_indent(EditState *s) { + QEmacsState *qs = s->qe_state; + if (!s->region_style && eb_is_in_indentation(s->b, s->offset) - && s->qe_state->last_cmd_func != (CmdFunc)do_c_indent) { + && qs->last_cmd_func != (CmdFunc)do_tabulate) { c_indent_line(s, s->offset); } else { do_tabulate(s, 1); } + qs->this_cmd_func = (CmdFunc)do_tabulate; } static void do_c_electric_key(EditState *s, int key) @@ -1292,8 +1295,8 @@ static void do_c_list_conditionals(EditState *s) /* C mode specific commands */ static const CmdDef c_commands[] = { - CMD2( "c-indent-command", "TAB", - "Indent the current line", + CMD2( "c-indent-line-or-region", "TAB", + "Indent the current line or highlighted region", do_c_indent, ES, "*") CMD2( "c-backward-conditional", "M-[", "Move to the beginning of the previous #if preprocessing directive", diff --git a/lang/python.c b/lang/python.c index 4e8e28b..9f61110 100644 --- a/lang/python.c +++ b/lang/python.c @@ -342,7 +342,7 @@ static int bazel_mode_init(EditState *s, EditBuffer *b, int flags) if (s) { /* XXX: should use the default values from mode variables */ s->indent_tabs_mode = 0; - s->indent_size = 2; + s->indent_width = 2; } return 0; } diff --git a/qe.c b/qe.c index 9b88e98..41e1153 100644 --- a/qe.c +++ b/qe.c @@ -1027,6 +1027,30 @@ void do_delete_char(EditState *s, int argval) do_kill(s, s->offset, endpos, argval, 0); } +static void do_backward_delete_tab(EditState *s, int backspace) { + /* Delete white space backward after TAB: + * attempt to delete whitespace up to the previous tab stop. + * If no whitespace is present, delete a character if `backspace` is non zero. + */ + int offset = s->offset; + int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH; + int indent = s->indent_width > 0 ? s->indent_width : tw; + int col = text_screen_width(s->b, eb_goto_bol(s->b, offset), offset, tw); + if (col > 0) { + int delta = 1 + (col - 1) % indent; + int offset1; + while (delta --> 0 && eb_prevc(s->b, offset, &offset1) == ' ') { + offset = offset1; + } + } + if (offset == s->offset) { + if (!backspace) + return; + eb_prevc(s->b, offset, &offset); + } + eb_delete_range(s->b, offset, s->offset); +} + void do_backspace(EditState *s, int argval) { int endpos; @@ -1101,12 +1125,11 @@ void do_backspace(EditState *s, int argval) return; } if (argval == NO_ARG) { - // XXX: this does not work for c-mode - // XXX: should implement backward-delete-char-untabify instead - if (s->qe_state->last_cmd_func == (CmdFunc)do_tabulate + if ((s->qe_state->last_cmd_func == (CmdFunc)do_tabulate || + s->qe_state->last_cmd_func == (CmdFunc)do_backward_delete_tab) && !s->indent_tabs_mode && !s->multi_cursor_active) { - /* Delete tab or indentation? */ - do_undo(s); + do_backward_delete_tab(s, 1); + s->qe_state->this_cmd_func = (CmdFunc)do_backward_delete_tab; return; } if (s->qe_state->last_cmd_func != (CmdFunc)do_append_next_kill) { @@ -2002,6 +2025,8 @@ void do_overwrite_mode(EditState *s, int argval) { put_status(s, "Overwrite mode is %s", s->overwrite ? "on" : "off"); } +/*---------------- indentation ----------------*/ + /* get the indentation width at a given offset */ int find_indent(EditState *s, int offset, int pos, int *offsetp) { int tw = s->b->tab_width > 0 ? s->b->tab_width : 8; @@ -2064,39 +2089,94 @@ int make_indent(EditState *s, int offset, int offset2, int pos, int target) { return replace_indent(s, offset, offset2, tabs, spaces); } +void do_indent_rigidly_by(EditState *s, int start, int end, int argval) +{ + int col_num, line, line1, line2; + + /* Swap point and mark so mark <= point */ + if (end < start) { + int tmp = start; + start = end; + end = tmp; + } + /* We do it with lines to avoid offset variations during indenting */ + eb_get_pos(s->b, &line1, &col_num, start); + if (start == end) { + line2 = line1; + } else { + if (col_num > 0) + line1++; + eb_get_pos(s->b, &line2, &col_num, end); + if (col_num == 0) + line2--; + } + /* Iterate over all lines inside block */ + for (line = line1; line <= line2; line++) { + int offset = eb_goto_pos(s->b, line, 0); + int off1, off2; + int indent = find_indent(s, offset, 0, &off1); + int new_indent = max_int(0, indent + argval); + /* if line is empty, remove indentation, + * otherwise adjust it by argval columns. + */ + if (eb_nextc(s->b, off1, &off2) == '\n') + new_indent = 0; + make_indent(s, offset, off1, 0, new_indent); + } +} + +void do_indent_rigidly_to_tab_stop(EditState *s, int start, int end, int dir) { + int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH; + int indent = s->indent_width > 0 ? s->indent_width : tw; + + do_indent_rigidly_by(s, start, end, indent * dir); +} + void do_tabulate(EditState *s, int argval) { int tw = s->b->tab_width > 0 ? s->b->tab_width : DEFAULT_TAB_WIDTH; - int indent = s->indent_size > 0 ? s->indent_size : tw; + int indent = s->indent_width > 0 ? s->indent_width : tw; + int offset = s->offset; - /* CG: should do smart complete, smart indent, insert tab */ #ifndef CONFIG_TINY - if (s->region_style) { - do_indent_rigidly(s, s->b->mark, s->offset, indent); - return; + if (s->b->flags & BF_PREVIEW) { + EditState *e = find_window(s, KEY_LEFT, NULL); + if (e && (e->flags & WF_FILELIST) + && s->qe_state->active_window == s) { + s->qe_state->active_window = e; + return; + } } #endif - if (s->indent_tabs_mode) { - do_char(s, '\t', argval); - } else { - int offset = s->offset; - int offset0 = eb_goto_bol(s->b, offset); - int col = 0; + if (s->b->flags & BF_READONLY) + return; - while (offset0 < offset) { - char32_t c = eb_nextc(s->b, offset0, &offset0); - if (c == '\t') { - col += tw - col % tw; - } else { - col += qe_wcwidth(c); - } - } - if (argval < 1) - argval = 1; - - s->offset += eb_insert_spaces(s->b, s->offset, - indent * argval - (col % indent)); + if (s->region_style) { + do_indent_rigidly_by(s, s->b->mark, offset, indent * argval); + return; } + if (argval < 0) { + do_indent_rigidly_by(s, offset, offset, indent * argval); + return; + } + + // TODO: should do smart complete, smart indent, insert tab + if (s->indent_tabs_mode) { + s->offset += eb_insert_char32_n(s->b, offset, '\t', argval); + } else { + int col = text_screen_width(s->b, eb_goto_bol(s->b, offset), offset, tw); + s->offset += eb_insert_spaces(s->b, offset, indent * argval - (col % indent)); + } +} + +static void do_untabulate(EditState *s) { + if (s->region_style) { + /* unindent the whole highlighted region */ + do_indent_rigidly_to_tab_stop(s, s->b->mark, s->offset, -1); + return; + } + /* decrease indentation at s->offset */ + do_backward_delete_tab(s, 0); } #ifndef CONFIG_TINY @@ -3179,7 +3259,7 @@ void do_set_tab_width(EditState *s, int tab_width) void do_set_indent_width(EditState *s, int indent_width) { if (indent_width > 1) - s->indent_size = indent_width; + s->indent_width = indent_width; } void do_set_indent_tabs_mode(EditState *s, int val) @@ -6854,7 +6934,7 @@ void switch_to_buffer(EditState *s, EditBuffer *b) memset(s, 0, SAVED_DATA_SIZE); mode = b->default_mode; /* default values */ - s->indent_size = s->qe_state->default_tab_width; + s->indent_width = s->qe_state->default_tab_width; s->default_style = QE_STYLE_DEFAULT; s->wrap = mode ? mode->default_wrap : WRAP_AUTO; } @@ -8088,16 +8168,16 @@ EditState *find_window(EditState *s, int key, EditState *def) * non regular window layouts */ for (e = qs->first_window; e != NULL; e = e->next_window) { - if (e->flags & WF_MINIBUF) + if (e->flags & (WF_MINIBUF | WF_POPUP)) continue; - if (e->y1 < s->y2 && e->y2 > s->y1) { + if (e->y1 <= s->y1 && e->y2 > s->y1) { /* horizontal overlap */ if (key == KEY_RIGHT && e->x1 == s->x2) return e; if (key == KEY_LEFT && e->x2 == s->x1) return e; } - if (e->x1 < s->x2 && e->x2 > s->x1) { + if (e->x1 <= s->x1 && e->x2 > s->x1) { /* vertical overlap */ if (key == KEY_UP && e->y2 == s->y1) return e; @@ -10728,11 +10808,14 @@ static const CmdDef basic_commands[] = { CMD2( "tabulate", "TAB", "Insert a TAB or spaces according to indent-tabs-mode", do_tabulate, ESi, "p") + CMD2( "untabulate", "S-TAB", + "Decrease indentation by one tab width", + do_untabulate, ES, "*") //CMD2( "space", "SPC", "Insert a space", do_space, ESi, "*" "P") CMD2( "quoted-insert", "C-q", "Read next input character and insert it", do_quoted_insert, ESi, "*" "p") - CMD2( "newline", "C-j, RET", + CMD2( "newline", "C-j, RET, S-RET", "Insert a newline, and move to left margin of the new line", do_newline, ES, "*") CMD2( "open-line", "C-o", @@ -10817,7 +10900,7 @@ static const CmdDef basic_commands[] = { CMD2( "delete-char", "C-d, delete", "Delete the character at point", do_delete_char, ESi, "*" "P") - CMD2( "backward-delete-char", "DEL", + CMD2( "backward-delete-char", "DEL, S-DEL", "Delete the character before point", do_backspace, ESi, "*" "P") CMD0( "set-mark-command", "C-@", diff --git a/qe.h b/qe.h index 2c75d11..a6c85f4 100644 --- a/qe.h +++ b/qe.h @@ -687,17 +687,17 @@ struct EditState { int cur_rtl; /* TRUE if the cursor on over RTL chars */ enum WrapType wrap; /* XXX: these should be buffer specific rather than window specific */ - int wrap_cols; /* number of columns in terminal emulator */ - int overwrite; /* insert/overtype mode */ - int indent_size; /* amount of whitespace for block indentation */ - int indent_tabs_mode; /* if true, use tabs to indent */ - int interactive; /* true if interaction is done instead of editing - (e.g. for shell mode or HTML) */ - int force_highlight; /* if true, force showing of cursor even if - window not focused (list mode only) */ + int wrap_cols; /* number of columns in terminal emulator */ + int overwrite; /* insert/overtype mode */ + int indent_width; /* amount of whitespace for block indentation */ + int indent_tabs_mode; /* if true, use tabs to indent */ + int interactive; /* true if interaction is done instead of editing + (e.g. for shell mode or HTML) */ + int force_highlight; /* if true, force showing of cursor even if + window not focused (list mode only) */ int mouse_force_highlight; /* if true, mouse can force highlight (list mode only) */ - int up_down_last_x; /* last x offset for vertical movement */ + int up_down_last_x; /* last x offset for vertical movement */ /* low level colorization function */ ModeDef *colorize_mode; @@ -1525,6 +1525,8 @@ void do_newline(EditState *s); void do_open_line(EditState *s); void do_backspace(EditState *s, int argval); void do_delete_char(EditState *s, int argval); +void do_indent_rigidly_by(EditState *s, int start, int end, int argval); +void do_indent_rigidly_to_tab_stop(EditState *s, int start, int end, int dir); void do_tabulate(EditState *s, int argval); EditBuffer *new_yank_buffer(QEmacsState *qs, EditBuffer *base); void do_append_next_kill(EditState *s); @@ -1779,7 +1781,6 @@ void delete_equivalent(struct Equivalent *ep); void do_compare_windows(EditState *s, int argval); void do_compare_files(EditState *s, const char *filename, int bflags); void do_delete_horizontal_space(EditState *s, int mode); -void do_indent_rigidly(EditState *s, int start, int end, int argval); void do_show_date_and_time(EditState *s, int argval); enum { diff --git a/qescript.c b/qescript.c index 6c7f9bd..25062fa 100644 --- a/qescript.c +++ b/qescript.c @@ -1033,7 +1033,7 @@ static int qe_cfg_assign(QEmacsDataSource *ds, QEValue *sp, int op) { ds->s->indent_tabs_mode = sp[1].u.value; } else if (strequal(sp->u.str, "indent-width")) { - ds->s->indent_size = sp[1].u.value; + ds->s->indent_width = sp[1].u.value; } else { /* ignore other variables without a warning */ put_error(ds->s, "unsupported variable %s", sp->u.str); diff --git a/tty.c b/tty.c index dcaf2c7..66d0c5a 100644 --- a/tty.c +++ b/tty.c @@ -689,6 +689,14 @@ static int tty_get_clipboard(QEditScreen *s, int ch) } } +static int tty_request_clipboard(QEditScreen *s) +{ + eb_trace_bytes("tty-request-clipboard", -1, EB_TRACE_COMMAND); + TTY_FPUTS("\033]52;;?\007", s->STDOUT); + fflush(s->STDOUT); + return 1; +} + static int tty_set_clipboard(QEditScreen *s) { // TODO: make this selectable @@ -715,6 +723,7 @@ static int tty_set_clipboard(QEditScreen *s) qe_free(&contents); return -1; } + eb_trace_bytes("tty-set-clipboard", -1, EB_TRACE_COMMAND); qe_free(&ts->clipboard); ts->clipboard = contents; ts->clipboard_size = size; @@ -1010,8 +1019,7 @@ static void tty_read_handler(void *opaque) eb_trace_bytes("tty-focus-in", -1, EB_TRACE_COMMAND); if (tty_clipboard) { /* request clipboard contents into kill buffer if changed */ - TTY_FPUTS("\033]52;;?\007", s->STDOUT); - fflush(s->STDOUT); + tty_request_clipboard(s); } break; case 'O': // FocusOut diff --git a/variables.c b/variables.c index 0988086..748653e 100644 --- a/variables.c +++ b/variables.c @@ -104,7 +104,7 @@ static VarDef var_table[] = { W_VAR_F( "point", offset, VAR_NUMBER, VAR_RW, qe_variable_set_value_offset, /* should be window-point */ "Current value of point in this window." ) - W_VAR( "indent-width", indent_size, VAR_NUMBER, VAR_RW, // XXX: need set_value function + W_VAR( "indent-width", indent_width, VAR_NUMBER, VAR_RW, // XXX: need set_value function "Number of columns to indent by for a syntactic level." ) W_VAR( "indent-tabs-mode", indent_tabs_mode, VAR_NUMBER, VAR_RW, "Set if indentation can insert tabs." )