diff options
-rw-r--r-- | src/cmdline.cpp | 17 | ||||
-rw-r--r-- | src/cmdline.h | 8 | ||||
-rw-r--r-- | src/interface-ncurses.cpp | 39 | ||||
-rw-r--r-- | src/sciteco.h | 3 |
4 files changed, 59 insertions, 8 deletions
diff --git a/src/cmdline.cpp b/src/cmdline.cpp index b28bfa1..e73c148 100644 --- a/src/cmdline.cpp +++ b/src/cmdline.cpp @@ -268,6 +268,23 @@ process_edit_cmd(gchar key) return insert; } +void +cmdline_fnmacro(const gchar *name) +{ + gchar macro_name[1 + strlen(name) + 1]; + QRegister *reg; + + macro_name[0] = CTL_KEY('F'); + g_strlcpy(macro_name + 1, name, sizeof(macro_name) - 1); + + reg = QRegisters::globals[macro_name]; + if (reg) { + gchar *macro = reg->get_string(); + cmdline_keypress(macro); + g_free(macro); + } +} + static gchar * macro_echo(const gchar *macro) { diff --git a/src/cmdline.h b/src/cmdline.h index 443158f..ca7dfc0 100644 --- a/src/cmdline.h +++ b/src/cmdline.h @@ -29,6 +29,14 @@ extern gint cmdline_pos; extern bool quit_requested; void cmdline_keypress(gchar key); +static inline void +cmdline_keypress(const gchar *keys) +{ + while (*keys) + cmdline_keypress(*keys++); +} + +void cmdline_fnmacro(const gchar *name); /* * Command states diff --git a/src/interface-ncurses.cpp b/src/interface-ncurses.cpp index b850ad4..a0e1e9a 100644 --- a/src/interface-ncurses.cpp +++ b/src/interface-ncurses.cpp @@ -49,9 +49,6 @@ static void scintilla_notify(Scintilla *sci, int idFrom, #define UNNAMED_FILE "(Unnamed)" -/* FIXME: should be configurable in TECO (Function key substitutes) */ -#define ESCAPE_SURROGATE KEY_DC - #define SCI_COLOR_ATTR(f, b) \ COLOR_PAIR(SCI_COLOR_PAIR(f, b)) @@ -76,7 +73,6 @@ InterfaceNCurses::InterfaceNCurses() msg_window = newwin(1, 0, LINES - 2, 0); cmdline_window = newwin(0, 0, LINES - 1, 0); - keypad(cmdline_window, TRUE); cmdline_current = NULL; ssm(SCI_SETFOCUS, TRUE); @@ -362,6 +358,8 @@ InterfaceNCurses::event_loop(void) if (popup.window) wrefresh(popup.window); + keypad(cmdline_window, Flags::ed & Flags::ED_FNKEYS); + /* no special <CTRL/C> handling */ raw(); key = wgetch(cmdline_window); @@ -378,9 +376,7 @@ InterfaceNCurses::event_loop(void) resize_all_windows(); break; #endif - case ESCAPE_SURROGATE: - cmdline_keypress('\x1B'); - break; + case 0x7F: /* DEL */ case KEY_BACKSPACE: cmdline_keypress('\b'); break; @@ -398,6 +394,35 @@ InterfaceNCurses::event_loop(void) cmdline_keypress('\n'); } break; + + /* + * Function key macros + */ +#define FN(KEY) case KEY_##KEY: cmdline_fnmacro(#KEY); break + FN(DOWN); FN(UP); FN(LEFT); FN(RIGHT); + FN(SLEFT); FN(SRIGHT); + FN(HOME); FN(SHOME); + case KEY_F(0)...KEY_F(63): { + gchar macro_name[3+1]; + + g_snprintf(macro_name, sizeof(macro_name), + "F%d", key - KEY_F0); + cmdline_fnmacro(macro_name); + break; + } + FN(DC); FN(SDC); + FN(IC); FN(SIC); + FN(NPAGE); FN(PPAGE); + FN(PRINT); FN(SPRINT); + FN(A1); FN(A3); FN(B2); FN(C1); FN(C3); + FN(COMMAND); FN(SCOMMAND); + FN(END); FN(SEND); + FN(HELP); FN(SHELP); +#undef FN + + /* + * Control keys and keys with printable representation + */ default: if (key <= 0xFF) cmdline_keypress((gchar)key); diff --git a/src/sciteco.h b/src/sciteco.h index e129a4c..e40b6f4 100644 --- a/src/sciteco.h +++ b/src/sciteco.h @@ -26,7 +26,8 @@ namespace Flags { enum { - ED_HOOKS = (1 << 5) + ED_HOOKS = (1 << 5), + ED_FNKEYS = (1 << 6) }; extern gint64 ed; |