mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-13 21:44:16 +00:00
Allow restricting earsing and listing of bindings to specific mode;
implement force repaint and multi-char bindings;
This commit is contained in:
parent
d1faac58dd
commit
2587649ca2
5 changed files with 69 additions and 15 deletions
29
builtin.cpp
29
builtin.cpp
|
@ -403,7 +403,7 @@ int builtin_test(parser_t &parser, wchar_t **argv);
|
||||||
/**
|
/**
|
||||||
List all current key bindings
|
List all current key bindings
|
||||||
*/
|
*/
|
||||||
static void builtin_bind_list()
|
static void builtin_bind_list(const wchar_t *bind_mode)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
wcstring_list_t lst;
|
wcstring_list_t lst;
|
||||||
|
@ -417,6 +417,12 @@ static void builtin_bind_list()
|
||||||
wcstring mode;
|
wcstring mode;
|
||||||
|
|
||||||
input_mapping_get(seq, ecmd, mode);
|
input_mapping_get(seq, ecmd, mode);
|
||||||
|
|
||||||
|
if(bind_mode != NULL && wcscmp(mode.c_str(), bind_mode))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ecmd = escape_string(ecmd, 1);
|
ecmd = escape_string(ecmd, 1);
|
||||||
|
|
||||||
wcstring tname;
|
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 seq an array of all key bindings to erase
|
||||||
\param all if specified, _all_ key bindings will be erased
|
\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)
|
if (all)
|
||||||
{
|
{
|
||||||
|
@ -532,7 +538,7 @@ static void builtin_bind_erase(wchar_t **seq, int all)
|
||||||
|
|
||||||
for (i=0; i<lst.size(); i++)
|
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)
|
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;
|
int all = 0;
|
||||||
|
|
||||||
const wchar_t *bind_mode = DEFAULT_BIND_MODE;
|
const wchar_t *bind_mode = DEFAULT_BIND_MODE;
|
||||||
|
bool bind_mode_given = false;
|
||||||
const wchar_t *new_bind_mode = DEFAULT_BIND_MODE;
|
const wchar_t *new_bind_mode = DEFAULT_BIND_MODE;
|
||||||
|
bool new_bind_mode_given = false;
|
||||||
|
|
||||||
int use_terminfo = 0;
|
int use_terminfo = 0;
|
||||||
|
|
||||||
|
@ -667,10 +675,12 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
|
||||||
|
|
||||||
case 'M':
|
case 'M':
|
||||||
bind_mode = woptarg;
|
bind_mode = woptarg;
|
||||||
|
bind_mode_given = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
new_bind_mode = woptarg;
|
new_bind_mode = woptarg;
|
||||||
|
new_bind_mode_given = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
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)
|
switch (mode)
|
||||||
|
@ -687,7 +704,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
|
||||||
|
|
||||||
case BIND_ERASE:
|
case BIND_ERASE:
|
||||||
{
|
{
|
||||||
builtin_bind_erase(&argv[woptind], all);
|
builtin_bind_erase(&argv[woptind], all, bind_mode_given ? bind_mode : NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +714,7 @@ static int builtin_bind(parser_t &parser, wchar_t **argv)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
builtin_bind_list();
|
builtin_bind_list(bind_mode_given ? bind_mode : NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
24
input.cpp
24
input.cpp
|
@ -129,6 +129,7 @@ static const wchar_t * const name_arr[] =
|
||||||
L"beginning-of-buffer",
|
L"beginning-of-buffer",
|
||||||
L"end-of-buffer",
|
L"end-of-buffer",
|
||||||
L"repaint",
|
L"repaint",
|
||||||
|
L"force-repaint",
|
||||||
L"up-line",
|
L"up-line",
|
||||||
L"down-line",
|
L"down-line",
|
||||||
L"suppress-autosuggestion",
|
L"suppress-autosuggestion",
|
||||||
|
@ -218,6 +219,7 @@ static const wchar_t code_arr[] =
|
||||||
R_BEGINNING_OF_BUFFER,
|
R_BEGINNING_OF_BUFFER,
|
||||||
R_END_OF_BUFFER,
|
R_END_OF_BUFFER,
|
||||||
R_REPAINT,
|
R_REPAINT,
|
||||||
|
R_FORCE_REPAINT,
|
||||||
R_UP_LINE,
|
R_UP_LINE,
|
||||||
R_DOWN_LINE,
|
R_DOWN_LINE,
|
||||||
R_SUPPRESS_AUTOSUGGESTION,
|
R_SUPPRESS_AUTOSUGGESTION,
|
||||||
|
@ -289,7 +291,7 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t *command,
|
||||||
CHECK(mode,);
|
CHECK(mode,);
|
||||||
CHECK(new_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++)
|
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();
|
const wchar_t *str = m.seq.c_str();
|
||||||
for (j=0; str[j] != L'\0'; j++)
|
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);
|
c = input_common_readch(timed);
|
||||||
if (str[j] != c)
|
if (str[j] != c)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str[j] == L'\0')
|
if (str[j] == L'\0')
|
||||||
|
@ -548,7 +561,6 @@ void input_unreadch(wint_t ch)
|
||||||
|
|
||||||
wint_t input_readch()
|
wint_t input_readch()
|
||||||
{
|
{
|
||||||
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
CHECK_BLOCK(R_NULL);
|
CHECK_BLOCK(R_NULL);
|
||||||
|
@ -569,8 +581,12 @@ wint_t input_readch()
|
||||||
{
|
{
|
||||||
const input_mapping_t &m = mapping_list.at(i);
|
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()))
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,7 +657,7 @@ bool input_mapping_erase(const wchar_t *sequence, const wchar_t *mode)
|
||||||
for (i=0; i<sz; i++)
|
for (i=0; i<sz; i++)
|
||||||
{
|
{
|
||||||
const input_mapping_t &m = mapping_list.at(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))
|
if (i != (sz-1))
|
||||||
{
|
{
|
||||||
|
|
1
input.h
1
input.h
|
@ -56,6 +56,7 @@ enum
|
||||||
R_BEGINNING_OF_BUFFER,
|
R_BEGINNING_OF_BUFFER,
|
||||||
R_END_OF_BUFFER,
|
R_END_OF_BUFFER,
|
||||||
R_REPAINT,
|
R_REPAINT,
|
||||||
|
R_FORCE_REPAINT,
|
||||||
R_UP_LINE,
|
R_UP_LINE,
|
||||||
R_DOWN_LINE,
|
R_DOWN_LINE,
|
||||||
R_SUPPRESS_AUTOSUGGESTION,
|
R_SUPPRESS_AUTOSUGGESTION,
|
||||||
|
|
|
@ -3164,6 +3164,7 @@ const wchar_t *reader_readline(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case R_FORCE_REPAINT:
|
||||||
case R_REPAINT:
|
case R_REPAINT:
|
||||||
{
|
{
|
||||||
if (! coalescing_repaints)
|
if (! coalescing_repaints)
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
function nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
function fish_vi_key_bindings -d "vi-like key bindings for fish"
|
function fish_vi_key_bindings -d "vi-like key bindings for fish"
|
||||||
|
|
||||||
bind --erase --all
|
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 right forward-char
|
||||||
bind -k left backward-char
|
bind -k left backward-char
|
||||||
bind \n execute
|
bind \n execute
|
||||||
bind -m insert i nothing
|
bind -m insert i force-repaint
|
||||||
bind -m insert a forward-char
|
bind -m insert a forward-char
|
||||||
|
|
||||||
bind \x24 end-of-line
|
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\[H beginning-of-line
|
||||||
bind \e\[F end-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 k up-or-search
|
||||||
bind j down-or-search
|
bind j down-or-search
|
||||||
bind \e\[A up-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 forward-word
|
||||||
bind W backward-word
|
bind W backward-word
|
||||||
|
|
||||||
|
bind dd kill-line
|
||||||
|
|
||||||
bind y yank
|
bind y yank
|
||||||
bind p yank-pop
|
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 dc delete-char
|
||||||
bind -M insert -k backspace backward-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 \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
|
end
|
||||||
|
|
Loading…
Reference in a new issue