diff options
author | Julian Aron Prenner <julian@linux4you.it> | 2013-12-31 14:53:29 +0100 |
---|---|---|
committer | Julian Aron Prenner <julian@linux4you.it> | 2013-12-31 14:53:29 +0100 |
commit | 2587649ca28ac9a161c51430c630a34fc09f8dc5 (patch) | |
tree | c14c1193de7f4b97567ed3387f1f68780c744d17 | |
parent | d1faac58dd7e22c959c8d8d2bb626842b88bff5c (diff) |
Allow restricting earsing and listing of bindings to specific mode;
implement force repaint and multi-char bindings;
-rw-r--r-- | builtin.cpp | 29 | ||||
-rw-r--r-- | input.cpp | 24 | ||||
-rw-r--r-- | input.h | 1 | ||||
-rw-r--r-- | reader.cpp | 1 | ||||
-rw-r--r-- | share/functions/fish_vi_key_bindings.fish | 29 |
5 files changed, 69 insertions, 15 deletions
diff --git a/builtin.cpp b/builtin.cpp index dfee2c0a..335b81ce 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -403,7 +403,7 @@ int builtin_test(parser_t &parser, wchar_t **argv); /** List all current key bindings */ -static void builtin_bind_list() +static void builtin_bind_list(const wchar_t *bind_mode) { size_t i; wcstring_list_t lst; @@ -417,6 +417,12 @@ static void builtin_bind_list() wcstring mode; input_mapping_get(seq, ecmd, mode); + + if(bind_mode != NULL && wcscmp(mode.c_str(), bind_mode)) + { + continue; + } + ecmd = escape_string(ecmd, 1); wcstring tname; @@ -522,7 +528,7 @@ static int builtin_bind_add(const wchar_t *seq, const wchar_t *cmd, const wchar_ \param seq an array of all key bindings to erase \param all if specified, _all_ key bindings will be erased */ -static void builtin_bind_erase(wchar_t **seq, int all) +static void builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode) { if (all) { @@ -532,7 +538,7 @@ static void builtin_bind_erase(wchar_t **seq, int all) for (i=0; i<lst.size(); i++) { - input_mapping_erase(lst.at(i).c_str()); + input_mapping_erase(lst.at(i).c_str(), mode); } } @@ -540,7 +546,7 @@ static void builtin_bind_erase(wchar_t **seq, int all) { while (*seq) { - input_mapping_erase(*seq++); + input_mapping_erase(*seq++, mode); } } @@ -569,7 +575,9 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) int all = 0; const wchar_t *bind_mode = DEFAULT_BIND_MODE; + bool bind_mode_given = false; const wchar_t *new_bind_mode = DEFAULT_BIND_MODE; + bool new_bind_mode_given = false; int use_terminfo = 0; @@ -667,10 +675,12 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case 'M': bind_mode = woptarg; + bind_mode_given = true; break; case 'm': new_bind_mode = woptarg; + new_bind_mode_given = true; break; case '?': @@ -679,7 +689,14 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) } + } + /* + * if mode is given, but not new mode, default to new mode to mode + */ + if(bind_mode_given && !new_bind_mode_given) + { + new_bind_mode = bind_mode; } switch (mode) @@ -687,7 +704,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) case BIND_ERASE: { - builtin_bind_erase(&argv[woptind], all); + builtin_bind_erase(&argv[woptind], all, bind_mode_given ? bind_mode : NULL); break; } @@ -697,7 +714,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv) { case 0: { - builtin_bind_list(); + builtin_bind_list(bind_mode_given ? bind_mode : NULL); break; } @@ -129,6 +129,7 @@ static const wchar_t * const name_arr[] = L"beginning-of-buffer", L"end-of-buffer", L"repaint", + L"force-repaint", L"up-line", L"down-line", L"suppress-autosuggestion", @@ -218,6 +219,7 @@ static const wchar_t code_arr[] = R_BEGINNING_OF_BUFFER, R_END_OF_BUFFER, R_REPAINT, + R_FORCE_REPAINT, R_UP_LINE, R_DOWN_LINE, R_SUPPRESS_AUTOSUGGESTION, @@ -289,7 +291,7 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t *command, CHECK(mode,); CHECK(new_mode,); - // debug( 0, L"Add mapping from %ls to %ls in mode %ls", escape(sequence, 1), escape(command, 1 ), mode); + // debug( 0, L"Add mapping from %ls to %ls in mode %ls", escape(sequence, 1), escape(command, 1 ), mode); for (size_t i=0; i<mapping_list.size(); i++) { @@ -514,10 +516,21 @@ static wint_t input_try_mapping(const input_mapping_t &m) const wchar_t *str = m.seq.c_str(); for (j=0; str[j] != L'\0'; j++) { - bool timed = (j > 0); + bool timed; + if(iswalnum(str[j])) + { + timed = false; + } + else + { + timed = (j > 0); + } + c = input_common_readch(timed); if (str[j] != c) + { break; + } } if (str[j] == L'\0') @@ -548,7 +561,6 @@ void input_unreadch(wint_t ch) wint_t input_readch() { - size_t i; CHECK_BLOCK(R_NULL); @@ -569,8 +581,12 @@ wint_t input_readch() { const input_mapping_t &m = mapping_list.at(i); + // debug(0, L"trying mapping (%ls,%ls,%ls,%ls)\n", escape(m.seq.c_str(), 1), + // m.command.c_str(), m.mode.c_str(), m.new_mode.c_str()); + if(wcscmp(m.mode.c_str(), input_get_bind_mode())) { + // debug(0, L"skipping mapping because mode %ls != %ls\n", m.mode.c_str(), input_get_bind_mode()); continue; } @@ -641,7 +657,7 @@ bool input_mapping_erase(const wchar_t *sequence, const wchar_t *mode) for (i=0; i<sz; i++) { const input_mapping_t &m = mapping_list.at(i); - if (sequence == m.seq && mode == m.mode) + if (sequence == m.seq && (mode == NULL || mode == m.mode)) { if (i != (sz-1)) { @@ -56,6 +56,7 @@ enum R_BEGINNING_OF_BUFFER, R_END_OF_BUFFER, R_REPAINT, + R_FORCE_REPAINT, R_UP_LINE, R_DOWN_LINE, R_SUPPRESS_AUTOSUGGESTION, @@ -3164,6 +3164,7 @@ const wchar_t *reader_readline(void) break; } + case R_FORCE_REPAINT: case R_REPAINT: { if (! coalescing_repaints) diff --git a/share/functions/fish_vi_key_bindings.fish b/share/functions/fish_vi_key_bindings.fish index 245e2cc4..cec66ea0 100644 --- a/share/functions/fish_vi_key_bindings.fish +++ b/share/functions/fish_vi_key_bindings.fish @@ -1,6 +1,3 @@ -function nothing -end - function fish_vi_key_bindings -d "vi-like key bindings for fish" bind --erase --all @@ -19,7 +16,7 @@ function fish_vi_key_bindings -d "vi-like key bindings for fish" bind -k right forward-char bind -k left backward-char bind \n execute - bind -m insert i nothing + bind -m insert i force-repaint bind -m insert a forward-char bind \x24 end-of-line @@ -27,6 +24,15 @@ function fish_vi_key_bindings -d "vi-like key bindings for fish" bind \e\[H beginning-of-line bind \e\[F end-of-line + # NOTE: history-search-backward and history-search-forward + # must both be bound for `commandline -f ...' to work, and thus for up-or-search + # and down-or-search to work, since those are actually + # simple shell functions that use `commandline -f ...'. + # Generally, commandline -f can only invoke functions that have been bound previously + + bind u history-search-backward + bind \cr history-search-forward + bind k up-or-search bind j down-or-search bind \e\[A up-or-search @@ -39,6 +45,8 @@ function fish_vi_key_bindings -d "vi-like key bindings for fish" bind w forward-word bind W backward-word + bind dd kill-line + bind y yank bind p yank-pop @@ -51,6 +59,17 @@ function fish_vi_key_bindings -d "vi-like key bindings for fish" bind -M insert -k dc delete-char bind -M insert -k backspace backward-delete-char - bind -M insert -m default \e nothing + bind -M insert -m default \e force-repaint + bind -M insert -m default q force-repaint bind -M insert \t complete + + bind -M insert \e\[A up-or-search + bind -M insert \e\[B down-or-search + bind -M insert -k down down-or-search + bind -M insert -k up up-or-search + + bind -M insert \e\[C forward-char + bind -M insert \e\[D backward-char + bind -M insert -k right forward-char + bind -M insert -k left backward-char end |