diff options
-rw-r--r-- | README | 1 | ||||
-rw-r--r-- | doc/sciteco.7.template | 33 | ||||
-rw-r--r-- | lib/fnkeys.tes | 20 | ||||
-rw-r--r-- | src/cmdline.cpp | 30 |
4 files changed, 78 insertions, 6 deletions
@@ -50,6 +50,7 @@ Features the command stream. This also enables navigating with function keys (e.g. cursor keys) as demonstrated by the standard library `fnkeys.tes`. + Function key macros can be context-sensitive, too. * Many TECO-11 features, like that most commands have a colon-modified form, string-building characters, exotic match characters * Interactivity: supports filename completion via immediate editing commands (e.g. `<TAB>` in diff --git a/doc/sciteco.7.template b/doc/sciteco.7.template index 288c3dd..a9bc944 100644 --- a/doc/sciteco.7.template +++ b/doc/sciteco.7.template @@ -223,6 +223,39 @@ in long Q-Register names. The names are all derived from key definitions of the curses library \(em not all of them may be supported on any particular user interface. +.LP +By default function key macros are effective everywhere \(em +pressing a function key has the same effect as processing +the characters of the corresponding function key macro as +immediate editing commands (or self-inserting characters). +However function key macros that rewrite the current command line +will only work correctly from specific \*(ST parser states. +\*(ST therefore allows you to mask function key macros in +specific parser states by evaluating the Q-Register's numeric +part, thus allowing you to control \fIwhere\fP a function key +macro is effective. +The numeric part represents a bitmask of states where +function keys are \fIdisabled\fP (so the default value 0 +enables that function key everywhere). +\*(ST defines the following state flags: +.IP 1 4 +Bit 0 represents the \(lqstart\(rq state where \*(ST accepts the +beginning of a command. +This is the state you will want command line editing macros +to be enabled in. +.IP 2 +Bit 1 represents any string argument. +.LP +All other bits/flags represent any other parser state. +Consequently, setting the register to the inverse of a bitmask of +state flags enables the corresponding macro only for the specified +states. +For instance, to enable the \(lq^FRIGHT\(rq function key macro +only in the \(lqstart\(rq state, you could set: +.EX +1^_U[^FRIGHT] +.EE +.LP A set of useful Function Key Macros are provided in the standard library .BR fnkeys.tes . diff --git a/lib/fnkeys.tes b/lib/fnkeys.tes index 87674e8..4ad653d 100644 --- a/lib/fnkeys.tes +++ b/lib/fnkeys.tes @@ -10,24 +10,32 @@ "> Q.c\IC) | -Q.c\IR) ' }} -! Make DELETE an alternative to ESCAPE ! +! Make DELETE an ESCAPE surrogate. + Macro is enabled everywhere. ! @[DC]{} ! Make SHIFT+DELETE a rubout/re-insert key. - This reverses the ^G modifier for BACKSPACE ! + This reverses the ^G modifier for BACKSPACE. + The macro is enabled everywhere. ! @[SDC]{} +! Command line editing macros. + They are enabled only in the start state (i.e. they + have no effect in string arguments, etc.). ! + @[HOME]{ .ESLINEFROMPOSITIONESPOSITIONFROMLINEU.p Q.pU.l <Q.l-."U 1; ' Q.l-.AU.c Q.c- "N Q.c-9"N Q.lU.p 1; '' %.l> Q.p-.M#c } @[HOME]{(M[HOME]} +1U[HOME] @[END]{ .ESLINEFROMPOSITIONESGETLINEENDPOSITION-.M#c } @[END]{(M[END]} +1U[END] @[NPAGE]{ .ESLINEFROMPOSITION+(ESLINESONSCREEN) @@ -35,32 +43,38 @@ Q.p"< Z | Q.p '-.M#c } @[NPAGE]{(M[NPAGE]} +1U[NPAGE] @[PPAGE]{ .ESLINEFROMPOSITION-(ESLINESONSCREEN)U.l Q.l"< 0 | Q.lESPOSITIONFROMLINE '-.M#c } @[PPAGE]{(M[PPAGE]} +1U[PPAGE] @[LEFT]{ ."=0|-1'M#c } @[LEFT]{(M[LEFT]} +1U[LEFT] @[SLEFT]{ 0,0,.ESWORDSTARTPOSITIONESWORDSTARTPOSITION-.M#c } @[SLEFT]{(M[SLEFT]} +1U[SLEFT] @[RIGHT]{ .-Z"=0|1'M#c } @[RIGHT]{(M[RIGHT]} +1U[RIGHT] @[SRIGHT]{ 0,0,.ESWORDENDPOSITIONESWORDENDPOSITION-.M#c } @[SRIGHT]{(M[SRIGHT]} +1U[SRIGHT] @[UP]{ .ESGETCOLUMN @@ -68,6 +82,7 @@ ESFINDCOLUMN-.M#c } @[UP]{(M[UP]} +1U[UP] @[DOWN]{ .ESGETCOLUMN @@ -75,3 +90,4 @@ ESFINDCOLUMN-.M#c } @[DOWN]{(M[DOWN]} +1U[DOWN] diff --git a/src/cmdline.cpp b/src/cmdline.cpp index e7ce066..90fed6e 100644 --- a/src/cmdline.cpp +++ b/src/cmdline.cpp @@ -499,21 +499,43 @@ Cmdline::process_edit_cmd(gchar key) void Cmdline::fnmacro(const gchar *name) { + enum { + FNMACRO_MASK_START = (1 << 0), + FNMACRO_MASK_STRING = (1 << 1) + }; + if (!(Flags::ed & Flags::ED_FNKEYS)) + /* function key macros disabled */ return; gchar macro_name[1 + strlen(name) + 1]; QRegister *reg; + tecoInt mask; + gchar *macro; 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(); - keypress(macro); - g_free(macro); + if (!reg) + /* macro undefined */ + return; + + mask = reg->get_integer(); + if (States::current == &States::start) { + if (mask & FNMACRO_MASK_START) + return; + } else if (States::is_string()) { + if (mask & FNMACRO_MASK_STRING) + return; + } else if (mask & ~(tecoInt)(FNMACRO_MASK_START | FNMACRO_MASK_STRING)) { + /* all other bits refer to any other state */ + return; } + + macro = reg->get_string(); + keypress(macro); + g_free(macro); } static gchar * |