diff --git a/dired.c b/dired.c index 5e5d875..37e3625 100644 --- a/dired.c +++ b/dired.c @@ -542,7 +542,7 @@ static CmdDef dired_commands[] = { CMD1( KEY_CTRL('g'), KEY_NONE, "dired-abort", do_delete_window, 0) CMD0( ' ', KEY_CTRL('t'), "dired-toggle_selection", list_toggle_selection) /* BS should go back to previous item and unmark it */ - CMD ( 's', KEY_NONE, "dired-sort\0s{Sort order: }", dired_sort) + CMD_( 's', KEY_NONE, "dired-sort", dired_sort, "s{Sort order: }") /* s -> should also change switches */ CMD1( 'd', KEY_NONE, "dired-delete", dired_mark, 'D') CMD1( 'c', KEY_NONE, "dired-copy", dired_mark, 'C') diff --git a/hex.c b/hex.c index ecd7819..fb36923 100644 --- a/hex.c +++ b/hex.c @@ -123,8 +123,8 @@ void do_toggle_hex(EditState *s) static CmdDef hex_commands[] = { CMD1( KEY_NONE, KEY_NONE, "decrease-width", do_incr_width, -1) CMD1( KEY_NONE, KEY_NONE, "increase-width", do_incr_width, 1) - CMD( KEY_NONE, KEY_NONE, "set-width\0i{Width: }", do_set_width) - CMD( KEY_NONE, KEY_NONE, "goto-byte\0i{Goto byte: }", do_goto_byte) + CMD_( KEY_NONE, KEY_NONE, "set-width", do_set_width, "i{Width: }") + CMD_( KEY_NONE, KEY_NONE, "goto-byte", do_goto_byte, "i{Goto byte: }") CMD0( KEY_NONE, KEY_NONE, "toggle-hex", do_toggle_hex) CMD_DEF_END, }; diff --git a/image.c b/image.c index b96eac1..ac2204f 100644 --- a/image.c +++ b/image.c @@ -800,16 +800,19 @@ static void pixel_format_completion(StringArray *cs, const char *str) /* specific image commands */ static CmdDef image_commands[] = { CMD0( 't', KEY_NONE, "image-rotate", image_rotate) - CMD( 'c', KEY_NONE, "image-convert\0s{New pixel format: }[pixel_format]|pixel_format|", image_convert) - CMD( 'b', KEY_NONE, "image-set-background-color\0s{Background color (use 'transparent' for tiling): }", - image_set_background_color) + CMD_( 'c', KEY_NONE, "image-convert", image_convert, + "s{New pixel format: }[pixel_format]|pixel_format|") + CMD_( 'b', KEY_NONE, "image-set-background-color", + image_set_background_color, + "s{Background color (use 'transparent' for tiling): }") #if 0 CMD0( 'n', KEY_NONE, "image-normal-size", image_normal_size) CMD1( '>', KEY_NONE, "image-double-size", image_mult_size, 100) CMD1( '<', KEY_NONE, "image-halve-size", image_mult_size, -50) CMD1( '.', KEY_NONE, "image-larger-10", image_mult_size, 10) CMD1( ',', KEY_NONE, "image-smaller-10", image_mult_size, -10) - CMD( 'S', KEY_NONE, "image-set-display-size\0i{Displayed width: }i{Displayed height: }", image_set_size) + CMD_( 'S', KEY_NONE, "image-set-display-size", image_set_size, + "i{Displayed width: }i{Displayed height: }") #endif CMD_DEF_END, }; diff --git a/latex-mode.c b/latex-mode.c index 84994cb..70ade39 100644 --- a/latex-mode.c +++ b/latex-mode.c @@ -327,7 +327,8 @@ static void do_latex(EditState *e, const char *cmd) static CmdDef latex_commands[] = { CMD0('\"', KEY_NONE, "tex-insert-quote", do_tex_insert_quote) /* this should actually be KEY_CTRLC(KEY_CTRL('c')), ie C-c C-c */ - CMD (KEY_CTRL('c'), KEY_NONE, "TeX-command-master\0s{Command: (default LaTeX) }[latex]|latex|", do_latex) + CMD_(KEY_CTRL('c'), KEY_NONE, "TeX-command-master", do_latex, + "s{Command: (default LaTeX) }[latex]|latex|") CMD_DEF_END, }; diff --git a/qe.c b/qe.c index 872f81a..de07058 100644 --- a/qe.c +++ b/qe.c @@ -197,11 +197,16 @@ static void qe_register_binding2(int key, static int backspace_is_control_h; -void do_set_backspace_is_control_h(EditState *s, int set) +void do_toggle_control_h(EditState *s, int set) { KeyDef *p; int i; + if (set) + set = (set > 0); + else + set = !backspace_is_control_h; + if (backspace_is_control_h == set) return; diff --git a/qe.h b/qe.h index c71a3da..a9bc093 100644 --- a/qe.h +++ b/qe.h @@ -887,14 +887,12 @@ typedef struct CmdDef { } CmdDef; /* new command macros */ -#define CMD(key, key_alt, name, func) { key, key_alt, name, { (void *)func } }, -#define CMDV(key, key_alt, name, func, val) { key, key_alt, name, { (void *)func }, val }, +#define CMD_(key, key_alt, name, func, args) { key, key_alt, name "\0" args, { (void *)func } }, +#define CMDV(key, key_alt, name, func, val, args) { key, key_alt, name "\0" args, { (void *)func }, (void *)val }, /* old macros for compatibility */ #define CMD0(key, key_alt, name, func) { key, key_alt, name "\0", { (void *)func } }, #define CMD1(key, key_alt, name, func, val) { key, key_alt, name "\0v", { (void *)func }, (void*)(val) }, -#define CMDi(key, key_alt, name, func) { key, key_alt, name "\0i", { (void *)func } }, -#define CMDss(key, key_alt, name, func) { key, key_alt, name "\0ss", { (void *)func } }, #define CMD_DEF_END { 0, 0, NULL, } void qe_register_mode(ModeDef *m); diff --git a/qeconfig.h b/qeconfig.h index 4cf3033..1d70709 100644 --- a/qeconfig.h +++ b/qeconfig.h @@ -28,8 +28,11 @@ CmdDef basic_commands[] = { CMD1( KEY_META('w'), KEY_NONE, "copy-region", do_kill_region, 0 ) CMD0( KEY_META('<'), KEY_CTRL_HOME, "beginning-of-buffer", do_bof ) CMD0( KEY_META('>'), KEY_CTRL_END, "end-of-buffer", do_eof ) - CMD( KEY_META('x'), KEY_NONE, "execute-extended-command\0s{Command: }[command]|command|i", do_execute_command ) - CMD0( KEY_CTRL('u'), KEY_NONE, "universal-argument", do_universal_argument ) + CMD_( KEY_META('x'), KEY_NONE, "execute-extended-command", + do_execute_command, + "s{Command: }[command]|command|i" ) + CMD0( KEY_CTRL('u'), KEY_NONE, "universal-argument", + do_universal_argument ) CMD0( KEY_CTRL('y'), KEY_NONE, "yank", do_yank) CMD0( KEY_META('y'), KEY_NONE, "yank-pop", do_yank_pop) CMD0( KEY_CTRL('i'), KEY_NONE, "tabulate", do_tab) @@ -37,32 +40,35 @@ CmdDef basic_commands[] = { CMD1( KEY_CTRLX(KEY_CTRL('s')), KEY_NONE, "save-buffer", do_save, 0 ) CMD1( KEY_CTRLX(KEY_CTRL('w')), KEY_NONE, "write-file", do_save, 1 ) CMD0( KEY_CTRLX(KEY_CTRL('c')), KEY_NONE, "suspend-emacs", do_quit ) - CMD( KEY_CTRLX(KEY_CTRL('f')), KEY_NONE, "find-file\0s{Find file: }[file]|file|", do_load) - CMD( KEY_CTRLX(KEY_CTRL('v')), KEY_NONE, "find-alternate-file\0s{Find alternate file: }[file]|file|", - do_find_alternate_file) - CMD( KEY_CTRLX('b'), KEY_NONE, - "switch-to-buffer\0s{Switch to buffer: }[buffer]|buffer|", do_switch_to_buffer) - CMD( KEY_CTRLX('k'), KEY_NONE, - "kill-buffer\0s{Kill buffer: }[buffer]|buffer|", do_kill_buffer) - CMD( KEY_CTRLX('i'), KEY_NONE, "insert-file\0s{Insert file: }[file]|file|", - do_insert_file) + CMD_( KEY_CTRLX(KEY_CTRL('f')), KEY_NONE, "find-file", do_load, + "s{Find file: }[file]|file|") + CMD_( KEY_CTRLX(KEY_CTRL('v')), KEY_NONE, "find-alternate-file", + do_find_alternate_file, + "s{Find alternate file: }[file]|file|") + CMD_( KEY_CTRLX('b'), KEY_NONE, "switch-to-buffer", do_switch_to_buffer, + "s{Switch to buffer: }[buffer]|buffer|") + CMD_( KEY_CTRLX('k'), KEY_NONE, "kill-buffer", do_kill_buffer, + "s{Kill buffer: }[buffer]|buffer|") + CMD_( KEY_CTRLX('i'), KEY_NONE, "insert-file", do_insert_file, + "s{Insert file: }[file]|file|") CMD0( KEY_CTRL('g'), KEY_NONE, "abort", do_break) CMD0( KEY_NONE, KEY_NONE, "doctor", do_doctor) CMD1( KEY_CTRL('s'), KEY_NONE, "isearch-forward", do_isearch, 1 ) CMD1( KEY_CTRL('r'), KEY_NONE, "isearch-backward", do_isearch, -1 ) - CMD( KEY_META('%'), KEY_NONE, "query-replace\0s{Query replace: }|search|s{With: }|replace|", do_query_replace ) + CMD_( KEY_META('%'), KEY_NONE, "query-replace", do_query_replace, + "s{Query replace: }|search|s{With: }|replace|") CMD0( KEY_CTRLX('u'), KEY_CTRL('_'), "undo", do_undo) CMD0( KEY_RET, KEY_NONE, "newline", do_return) CMD0( KEY_CTRL('l'), KEY_NONE, "refresh", do_refresh) - CMD( KEY_META('g'), KEY_NONE, "goto-line\0i{Goto line: }", do_goto_line) - CMDi( KEY_NONE, KEY_NONE, "goto-char\0i{Goto char: }", do_goto_char) - CMD( KEY_NONE, KEY_NONE, "global-set-key\0s{Set key globally: }s{command: }[command]|command|", do_global_set_key) + CMD_( KEY_META('g'), KEY_NONE, "goto-line", do_goto_line, "i{Goto line: }") + CMD_( KEY_NONE, KEY_NONE, "goto-char", do_goto_char, "i{Goto char: }") CMD0( KEY_CTRLX(KEY_CTRL('q')), KEY_NONE, "vc-toggle-read-only", do_toggle_read_only) CMD0( KEY_META('q'), KEY_NONE, "fill-paragraph", do_fill_paragraph) CMD0( KEY_META('{'), KEY_NONE, "backward-paragraph", do_backward_paragraph) CMD0( KEY_META('}'), KEY_NONE, "forward-paragraph", do_forward_paragraph) - CMD0( KEY_CTRLX(KEY_CTRL('x')), KEY_NONE, "exchange-point-and-mark", do_exchange_point_and_mark) + CMD0( KEY_CTRLX(KEY_CTRL('x')), KEY_NONE, "exchange-point-and-mark", + do_exchange_point_and_mark) CMD1( KEY_META('l'), KEY_NONE, "downcase-word", do_changecase_word, 0) CMD1( KEY_META('u'), KEY_NONE, "upcase-word", do_changecase_word, 1) CMD1( KEY_CTRLX(KEY_CTRL('l')), KEY_NONE, "downcase-region", @@ -74,6 +80,8 @@ CmdDef basic_commands[] = { CMD0( KEY_CTRLX('('), KEY_NONE, "start-kbd-macro", do_start_macro) CMD0( KEY_CTRLX(')'), KEY_NONE, "end-kbd-macro", do_end_macro) CMD0( KEY_CTRLX('e'), KEY_NONE, "call-last-kbd-macro", do_call_macro) + CMD_( KEY_NONE, KEY_NONE, "global-set-key", do_global_set_key, + "s{Set key globally: }s{command: }[command]|command|") /* window handling */ CMD0( KEY_CTRLX('o'), KEY_NONE, "other-window", do_other_window) @@ -84,49 +92,66 @@ CmdDef basic_commands[] = { CMD0( KEY_CTRL('x'), KEY_LEFT, "next-window", do_other_window) CMD0( KEY_CTRL('x'), KEY_RIGHT, "next-window", do_other_window) CMD1( KEY_CTRLX('0'), KEY_NONE, "delete-window", do_delete_window, 0) - CMD0( KEY_CTRLX('1'), KEY_NONE, "delete-other-windows", do_delete_other_windows) - CMD1( KEY_CTRLX('2'), KEY_NONE, "split-window-vertically", do_split_window, 0) - CMD1( KEY_CTRLX('3'), KEY_NONE, "split-window-horizontally", do_split_window, 1) + CMD0( KEY_CTRLX('1'), KEY_NONE, "delete-other-windows", + do_delete_other_windows) + CMD1( KEY_CTRLX('2'), KEY_NONE, "split-window-vertically", + do_split_window, 0) + CMD1( KEY_CTRLX('3'), KEY_NONE, "split-window-horizontally", + do_split_window, 1) /* help */ CMD0( KEY_CTRLH(KEY_CTRL('h')), KEY_F1, "help-for-help", do_help_for_help) - CMD0( KEY_CTRLH('b'), KEY_NONE, "describe-bindings", - do_describe_bindings) + CMD0( KEY_CTRLH('b'), KEY_NONE, "describe-bindings", do_describe_bindings) CMD0( KEY_CTRLH('c'), KEY_NONE, "describe-key-briefly", do_describe_key_briefly) /* international */ - CMD( KEY_CTRLXRET('f'), KEY_NONE, "set-buffer-file-coding-system\0s{Charset: }[charset]", - do_set_buffer_file_coding_system) - CMD( KEY_NONE, KEY_NONE, "convert-buffer-file-coding-system\0s{Charset: }[charset]", - do_convert_buffer_file_coding_system) + CMD_( KEY_CTRLXRET('f'), KEY_NONE, "set-buffer-file-coding-system", + do_set_buffer_file_coding_system, + "s{Charset: }[charset]") + CMD_( KEY_NONE, KEY_NONE, "convert-buffer-file-coding-system", + do_convert_buffer_file_coding_system, + "s{Charset: }[charset]") CMD0( KEY_CTRLXRET('b'), KEY_NONE, "toggle-bidir", do_toggle_bidir) - CMD( KEY_CTRLXRET(KEY_CTRL('\\')), KEY_NONE, - "set-input-method\0s{Input method: }[input]", do_set_input_method) + CMD_( KEY_CTRLXRET(KEY_CTRL('\\')), KEY_NONE, "set-input-method", + do_set_input_method, + "s{Input method: }[input]") CMD0( KEY_CTRL('\\'), KEY_NONE, "switch-input-method", do_switch_input_method) /* styles & display */ - CMD( KEY_NONE, KEY_NONE, "define-color\0s{Color name: }[color]|color|s{Color value: }", do_define_color) - CMD( KEY_NONE, KEY_NONE, "set-style\0s{Style: }[style]|style|s{CSS Property Name: }s{CSS Property Value: }", do_set_style) - CMD( KEY_NONE, KEY_NONE, "set-display-size\0i{Width: }i{Height: }", do_set_display_size) - CMD( KEY_NONE, KEY_NONE, "set-system-font\0ss", do_set_system_font) - CMD0( KEY_CTRLX('f'), KEY_NONE, "toggle-full-screen", do_toggle_full_screen) + CMD_( KEY_NONE, KEY_NONE, "define-color", do_define_color, + "s{Color name: }[color]|color|s{Color value: }") + CMD_( KEY_NONE, KEY_NONE, "set-style", do_set_style, + "s{Style: }[style]|style|s{CSS Property Name: }" + "s{CSS Property Value: }") + CMD_( KEY_NONE, KEY_NONE, "set-display-size", do_set_display_size, + "i{Width: }i{Height: }") + CMD_( KEY_NONE, KEY_NONE, "set-system-font", do_set_system_font, + "s{Font family: }s{System fonts: }") + CMD0( KEY_CTRLX('f'), KEY_NONE, "toggle-full-screen", + do_toggle_full_screen) CMD0( KEY_NONE, KEY_NONE, "toggle-mode-line", do_toggle_mode_line) - CMD( KEY_NONE, KEY_NONE, "parse-config-file\0s{Configuration file: }[file]|file|", parse_config) + + /* other stuff */ + CMD_( KEY_NONE, KEY_NONE, "parse-config-file", parse_config, + "s{Configuration file: }[file]|file|") + CMD_( KEY_NONE, KEY_NONE, "load-qerc", do_load_qerc, + "s{path: }[file]|file|") /* non standard mappings */ CMD0( KEY_CTRLXRET('l'), KEY_NONE, "toggle-line-numbers", do_line_numbers) CMD0( KEY_CTRLXRET('t'), KEY_NONE, "truncate-lines", do_line_truncate ) CMD0( KEY_CTRLXRET('w'), KEY_NONE, "word-wrap", do_word_wrap) - CMD1( KEY_NONE, KEY_NONE, "set-backspace-is-control-h", do_set_backspace_is_control_h, 1) + CMD1( KEY_NONE, KEY_NONE, "toggle-control-h", do_toggle_control_h, 0) /* tab & indent */ - CMD( KEY_NONE, KEY_NONE, "set-tab-width\0i{Tab width: }", do_set_tab_width) - CMD( KEY_NONE, KEY_NONE, "set-indent-width\0i{Indent width: }", - do_set_indent_width) - CMD( KEY_NONE, KEY_NONE, "set-indent-tabs-mode\0i{Indent tabs mode (0 or 1): }", - do_set_indent_tabs_mode) + CMD_( KEY_NONE, KEY_NONE, "set-tab-width", do_set_tab_width, + "i{Tab width: }") + CMD_( KEY_NONE, KEY_NONE, "set-indent-width", do_set_indent_width, + "i{Indent width: }") + CMD_( KEY_NONE, KEY_NONE, "set-indent-tabs-mode", do_set_indent_tabs_mode, + "i{Indent tabs mode (0 or 1): }") CMD_DEF_END, }; diff --git a/shell.c b/shell.c index 63aa210..7712a08 100644 --- a/shell.c +++ b/shell.c @@ -251,7 +251,7 @@ static void tty_emulate(ShellState *s, int c) int i, offset, offset1, offset2, n; unsigned char buf1[10]; - switch(s->state) { + switch (s->state) { case TTY_STATE_NORM: switch(c) { case 8: @@ -900,7 +900,8 @@ static CmdDef shell_commands[] = { /* compilation commands */ static CmdDef compile_commands[] = { - CMD( KEY_CTRLX(KEY_CTRL('e')), KEY_NONE, "compile\0s{Compile command: }", do_compile) + CMD_( KEY_CTRLX(KEY_CTRL('e')), KEY_NONE, "compile", do_compile, + "s{Compile command: }|compile|") CMD1( KEY_CTRLX(KEY_CTRL('p')), KEY_NONE, "previous-error", do_compile_error, -1) CMD1( KEY_CTRLX(KEY_CTRL('n')), KEY_NONE, "next-error", diff --git a/tty.c b/tty.c index 44403d4..fb47c5b 100644 --- a/tty.c +++ b/tty.c @@ -77,6 +77,7 @@ static int term_init(QEditScreen *s, int w, int h) TTYState *ts; struct termios tty; struct sigaction sig; + char *term; memcpy(&s->dpy, &tty_dpy, sizeof(QEDisplay)); @@ -135,6 +136,19 @@ static int term_init(QEditScreen *s, int w, int h) set_read_handler(0, tty_read_handler, s); tty_resize(0); + + /* Test TERM env var: + * linux and xterm -> kbs=\177 + * ansi cygwin vt100 -> kbs=^H + */ + term = getenv("TERM"); + if (term) { + if (strstart(term, "ansi", NULL) || + strstart(term, "cygwin", NULL) || + strstart(term, "vt", NULL)) { + do_toggle_control_h(NULL, 1); + } + } return 0; }