mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 04:43:10 +00:00
Changes to bind_mode implementation based on code review and merge
errors
This commit is contained in:
parent
d4fafeb6d6
commit
bd895aa76c
5 changed files with 88 additions and 98 deletions
19
builtin.cpp
19
builtin.cpp
|
@ -404,8 +404,7 @@ int builtin_test(parser_t &parser, wchar_t **argv);
|
|||
static void builtin_bind_list(const wchar_t *bind_mode)
|
||||
{
|
||||
size_t i;
|
||||
wcstring_list_t lst;
|
||||
input_mapping_get_names(lst);
|
||||
const wcstring_list_t lst = input_mapping_get_names();
|
||||
|
||||
for (i=0; i<lst.size(); i++)
|
||||
{
|
||||
|
@ -415,9 +414,12 @@ static void builtin_bind_list(const wchar_t *bind_mode)
|
|||
wcstring mode;
|
||||
wcstring sets_mode;
|
||||
|
||||
input_mapping_get(seq, ecmds, mode, sets_mode);
|
||||
|
||||
if(bind_mode != NULL && wcscmp(mode.c_str(), bind_mode))
|
||||
if (! input_mapping_get(seq, &ecmds, &mode, &sets_mode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bind_mode != NULL && bind_mode != mode)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -542,11 +544,8 @@ static void builtin_bind_erase(wchar_t **seq, int all, const wchar_t *mode)
|
|||
{
|
||||
if (all)
|
||||
{
|
||||
size_t i;
|
||||
wcstring_list_t lst;
|
||||
input_mapping_get_names(lst);
|
||||
|
||||
for (i=0; i<lst.size(); i++)
|
||||
const wcstring_list_t lst = input_mapping_get_names();
|
||||
for (size_t i=0; i<lst.size(); i++)
|
||||
{
|
||||
input_mapping_erase(lst.at(i).c_str(), mode);
|
||||
}
|
||||
|
|
|
@ -548,7 +548,7 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
|
|||
|
||||
if (search_mode)
|
||||
{
|
||||
return !reader_search_mode();
|
||||
return ! reader_search_mode();
|
||||
}
|
||||
|
||||
if (paging_mode)
|
||||
|
|
131
input.cpp
131
input.cpp
|
@ -71,7 +71,7 @@
|
|||
struct input_mapping_t
|
||||
{
|
||||
wcstring seq; /**< Character sequence which generates this event */
|
||||
std::vector<wcstring> commands; /**< commands that should be evaluated by this mapping */
|
||||
wcstring_list_t commands; /**< commands that should be evaluated by this mapping */
|
||||
|
||||
/* We wish to preserve the user-specified order. This is just an incrementing value. */
|
||||
unsigned int specification_order;
|
||||
|
@ -285,32 +285,25 @@ static bool is_init = false;
|
|||
*/
|
||||
static void input_terminfo_init();
|
||||
|
||||
wchar_t input_function_args[MAX_INPUT_FUNCTION_ARGS];
|
||||
bool input_function_status;
|
||||
int input_function_args_index = 0;
|
||||
static wchar_t input_function_args[MAX_INPUT_FUNCTION_ARGS];
|
||||
static bool input_function_status;
|
||||
static int input_function_args_index = 0;
|
||||
|
||||
/**
|
||||
Return the current bind mode
|
||||
*/
|
||||
const wchar_t *input_get_bind_mode()
|
||||
wcstring input_get_bind_mode()
|
||||
{
|
||||
const wchar_t *bind_mode = DEFAULT_BIND_MODE;
|
||||
const env_var_t bind_mode_var = env_get_string(FISH_BIND_MODE_VAR);
|
||||
if(!bind_mode_var.missing())
|
||||
{
|
||||
bind_mode = bind_mode_var.c_str();
|
||||
}
|
||||
return bind_mode;
|
||||
env_var_t mode = env_get_string(FISH_BIND_MODE_VAR);
|
||||
return mode.missing() ? DEFAULT_BIND_MODE : mode;
|
||||
}
|
||||
|
||||
/**
|
||||
Set the current bind mode
|
||||
*/
|
||||
bool input_set_bind_mode(const wchar_t *bm)
|
||||
void input_set_bind_mode(const wcstring &bm)
|
||||
{
|
||||
if(wcscmp(bm, input_get_bind_mode()))
|
||||
env_set(FISH_BIND_MODE_VAR, bm, ENV_GLOBAL);
|
||||
return true;
|
||||
env_set(FISH_BIND_MODE_VAR, bm.c_str(), ENV_GLOBAL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -323,9 +316,9 @@ int input_function_arity(int function)
|
|||
{
|
||||
case R_FORWARD_JUMP:
|
||||
case R_BACKWARD_JUMP:
|
||||
return 1;
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -375,7 +368,7 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t **commands, size_t
|
|||
// debug( 0, L"Add mapping from %ls to %ls in mode %ls", escape(sequence, 1), escape(command, 1 ), mode);
|
||||
|
||||
// remove existing mappings with this sequence
|
||||
std::vector<wcstring> commands_vector(commands, commands + commands_len);
|
||||
const wcstring_list_t commands_vector(commands, commands + commands_len);
|
||||
|
||||
for (size_t i=0; i<mapping_list.size(); i++)
|
||||
{
|
||||
|
@ -387,7 +380,10 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t **commands, size_t
|
|||
return;
|
||||
}
|
||||
}
|
||||
mapping_list.push_back(input_mapping_t(sequence, commands_vector, mode, sets_mode));
|
||||
|
||||
// add a new mapping, using the next order
|
||||
const input_mapping_t new_mapping = input_mapping_t(sequence, commands_vector, mode, sets_mode);
|
||||
input_mapping_insert_sorted(new_mapping);
|
||||
}
|
||||
|
||||
void input_mapping_add(const wchar_t *sequence, const wchar_t *command,
|
||||
|
@ -558,40 +554,42 @@ static void input_mapping_execute(const input_mapping_t &m)
|
|||
{
|
||||
/* By default input functions always succeed */
|
||||
input_function_status = true;
|
||||
|
||||
for(int i = m.commands.size() - 1; i >= 0; i--)
|
||||
|
||||
size_t idx = m.commands.size();
|
||||
while (idx--)
|
||||
{
|
||||
wcstring command = m.commands.at(i);
|
||||
wchar_t code = input_function_get_code(command);
|
||||
if (code != (wchar_t)-1)
|
||||
{
|
||||
input_function_push_args(code);
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = m.commands.size() - 1; i >= 0; i--)
|
||||
{
|
||||
wcstring command = m.commands.at(i);
|
||||
wchar_t code = input_function_get_code(command);
|
||||
if (code != (wchar_t)-1)
|
||||
{
|
||||
input_unreadch(code);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
This key sequence is bound to a command, which
|
||||
is sent to the parser for evaluation.
|
||||
*/
|
||||
int last_status = proc_get_last_status();
|
||||
parser_t::principal_parser().eval(command.c_str(), io_chain_t(), TOP);
|
||||
|
||||
proc_set_last_status(last_status);
|
||||
|
||||
input_unreadch(R_NULL);
|
||||
wcstring command = m.commands.at(idx);
|
||||
wchar_t code = input_function_get_code(command);
|
||||
if (code != (wchar_t)-1)
|
||||
{
|
||||
input_function_push_args(code);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
idx = m.commands.size();
|
||||
while (idx--)
|
||||
{
|
||||
wcstring command = m.commands.at(idx);
|
||||
wchar_t code = input_function_get_code(command);
|
||||
if (code != (wchar_t)-1)
|
||||
{
|
||||
input_unreadch(code);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
This key sequence is bound to a command, which
|
||||
is sent to the parser for evaluation.
|
||||
*/
|
||||
int last_status = proc_get_last_status();
|
||||
parser_t::principal_parser().eval(command.c_str(), io_chain_t(), TOP);
|
||||
|
||||
proc_set_last_status(last_status);
|
||||
|
||||
input_unreadch(R_NULL);
|
||||
}
|
||||
}
|
||||
|
||||
input_set_bind_mode(m.sets_mode.c_str());
|
||||
}
|
||||
|
||||
|
@ -650,7 +648,7 @@ static void input_mapping_execute_matching_or_generic()
|
|||
{
|
||||
const input_mapping_t *generic = NULL;
|
||||
|
||||
const wchar_t *bind_mode = input_get_bind_mode();
|
||||
const wcstring bind_mode = input_get_bind_mode();
|
||||
|
||||
for (int i = 0; i < mapping_list.size(); i++)
|
||||
{
|
||||
|
@ -659,7 +657,7 @@ static void input_mapping_execute_matching_or_generic()
|
|||
//debug(0, L"trying mapping (%ls,%ls,%ls)\n", escape(m.seq.c_str(), 1),
|
||||
// m.mode.c_str(), m.sets_mode.c_str());
|
||||
|
||||
if(wcscmp(m.mode.c_str(), bind_mode))
|
||||
if (m.mode != bind_mode)
|
||||
{
|
||||
//debug(0, L"skipping mapping because mode %ls != %ls\n", m.mode.c_str(), input_get_bind_mode());
|
||||
continue;
|
||||
|
@ -745,18 +743,20 @@ wint_t input_readch()
|
|||
}
|
||||
}
|
||||
|
||||
void input_mapping_get_names(wcstring_list_t &lst)
|
||||
wcstring_list_t input_mapping_get_names()
|
||||
{
|
||||
// Sort the mappings by the user specification order, so we can return them in the same order that the user specified them in
|
||||
std::vector<input_mapping_t> local_list = mapping_list;
|
||||
std::sort(local_list.begin(), local_list.end(), specification_order_is_less_than);
|
||||
wcstring_list_t result;
|
||||
result.reserve(local_list.size());
|
||||
|
||||
for (size_t i=0; i<local_list.size(); i++)
|
||||
{
|
||||
const input_mapping_t &m = local_list.at(i);
|
||||
lst.push_back(wcstring(m.seq));
|
||||
result.push_back(m.seq);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -784,22 +784,23 @@ bool input_mapping_erase(const wchar_t *sequence, const wchar_t *mode)
|
|||
return result;
|
||||
}
|
||||
|
||||
bool input_mapping_get(const wcstring &sequence, std::vector<wcstring> &cmds, wcstring &mode, wcstring &sets_mode)
|
||||
bool input_mapping_get(const wcstring &sequence, wcstring_list_t *out_cmds, wcstring *out_mode, wcstring *out_sets_mode)
|
||||
{
|
||||
size_t i, sz = mapping_list.size();
|
||||
|
||||
for (i=0; i<sz; i++)
|
||||
bool result = false;
|
||||
size_t sz = mapping_list.size();
|
||||
for (size_t i=0; i<sz; i++)
|
||||
{
|
||||
const input_mapping_t &m = mapping_list.at(i);
|
||||
if (sequence == m.seq)
|
||||
{
|
||||
cmds = m.commands;
|
||||
mode = m.mode;
|
||||
sets_mode = m.sets_mode;
|
||||
return true;
|
||||
*out_cmds = m.commands;
|
||||
*out_mode = m.mode;
|
||||
*out_sets_mode = m.sets_mode;
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
10
input.h
10
input.h
|
@ -128,9 +128,9 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t **commands, size_t
|
|||
const wchar_t *mode = DEFAULT_BIND_MODE, const wchar_t *new_mode = DEFAULT_BIND_MODE);
|
||||
|
||||
/**
|
||||
Insert all mapping names into the specified wcstring_list_t
|
||||
Returns all mapping names
|
||||
*/
|
||||
void input_mapping_get_names(wcstring_list_t &lst);
|
||||
wcstring_list_t input_mapping_get_names();
|
||||
|
||||
/**
|
||||
Erase binding for specified key sequence
|
||||
|
@ -140,17 +140,17 @@ bool input_mapping_erase(const wchar_t *sequence, const wchar_t *mode = DEFAULT_
|
|||
/**
|
||||
Gets the command bound to the specified key sequence. Returns true if it exists, false if not.
|
||||
*/
|
||||
bool input_mapping_get(const wcstring &sequence, std::vector<wcstring> &cmds, wcstring &mode, wcstring &new_mode);
|
||||
bool input_mapping_get(const wcstring &sequence, wcstring_list_t *out_cmds, wcstring *out_mode, wcstring *out_new_mode);
|
||||
|
||||
/**
|
||||
Return the current bind mode
|
||||
*/
|
||||
const wchar_t *input_get_bind_mode();
|
||||
wcstring input_get_bind_mode();
|
||||
|
||||
/**
|
||||
Set the current bind mode
|
||||
*/
|
||||
bool input_set_bind_mode(const wchar_t *bind_mode);
|
||||
void input_set_bind_mode(const wcstring &bind_mode);
|
||||
|
||||
|
||||
wchar_t input_function_pop_arg();
|
||||
|
|
24
reader.cpp
24
reader.cpp
|
@ -626,9 +626,9 @@ static void reader_repaint()
|
|||
cmd_line->size(),
|
||||
&colors[0],
|
||||
&indents[0],
|
||||
cursor_position,
|
||||
data->sel_start_pos,
|
||||
data->sel_stop_pos,
|
||||
cursor_position,
|
||||
data->current_page_rendering,
|
||||
focused_on_pager);
|
||||
|
||||
|
@ -2446,23 +2446,14 @@ size_t reader_get_cursor_pos()
|
|||
|
||||
bool reader_get_selection(size_t *start, size_t *len)
|
||||
{
|
||||
if (!data)
|
||||
bool result = false;
|
||||
if (data != NULL && data->sel_active)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! data->sel_active)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
*start = data->sel_start_pos;
|
||||
*len = std::min(data->sel_stop_pos - data->sel_start_pos + 1, data->command_line.size());
|
||||
return true;
|
||||
}
|
||||
*start = data->sel_start_pos;
|
||||
*len = std::min(data->sel_stop_pos - data->sel_start_pos + 1, data->command_line.size());
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3833,7 +3824,6 @@ const wchar_t *reader_readline(void)
|
|||
line_offset_old = el->position - parse_util_get_offset_from_line(el->text, line_old);
|
||||
total_offset_new = parse_util_get_offset(el->text, line_new, line_offset_old - 4*(indent_new-indent_old));
|
||||
update_buff_pos(el, total_offset_new);
|
||||
el->position = total_offset_new;
|
||||
reader_repaint_needed();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue