mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-25 02:01:15 -03:00
Defer escape bindings as well
This allows rebinding escape in the user list without breaking e.g. arrow keys (which send escape and then `[A` and similar, so escape is a prefix of them). Fixes #8428.
This commit is contained in:
@@ -597,6 +597,7 @@ maybe_t<input_mapping_t> inputter_t::find_mapping(event_queue_peeker_t *peeker)
|
||||
const input_mapping_t *generic = nullptr;
|
||||
const auto &vars = parser_->vars();
|
||||
const wcstring bind_mode = input_get_bind_mode(vars);
|
||||
const input_mapping_t *escape = nullptr;
|
||||
|
||||
auto ml = input_mappings()->all_mappings();
|
||||
for (const auto &m : *ml) {
|
||||
@@ -611,10 +612,25 @@ maybe_t<input_mapping_t> inputter_t::find_mapping(event_queue_peeker_t *peeker)
|
||||
}
|
||||
|
||||
if (try_peek_sequence(peeker, m.seq)) {
|
||||
return m;
|
||||
// A binding for just escape should also be deferred
|
||||
// so escape sequences take precedence.
|
||||
if (m.seq == L"\x1B") {
|
||||
if (!escape) {
|
||||
escape = &m;
|
||||
}
|
||||
} else {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
peeker->restart();
|
||||
}
|
||||
|
||||
if (escape) {
|
||||
// We need to reconsume the escape.
|
||||
peeker->next();
|
||||
return *escape;
|
||||
}
|
||||
|
||||
return generic ? maybe_t<input_mapping_t>(*generic) : none();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user