Support <c-v> to insert raw value in insert/prompt mode
This commit is contained in:
parent
67d1b7dcd1
commit
111732005a
|
@ -412,12 +412,15 @@ public:
|
||||||
else if (key == ctrlalt('e'))
|
else if (key == ctrlalt('e'))
|
||||||
to_next_word_end<WORD>(m_cursor_pos, m_line);
|
to_next_word_end<WORD>(m_cursor_pos, m_line);
|
||||||
else if (auto cp = key.codepoint())
|
else if (auto cp = key.codepoint())
|
||||||
|
insert(*cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(Codepoint cp)
|
||||||
{
|
{
|
||||||
m_line = m_line.substr(0, m_cursor_pos) + codepoint_to_str(*cp)
|
m_line = m_line.substr(0, m_cursor_pos) + codepoint_to_str(cp)
|
||||||
+ m_line.substr(m_cursor_pos);
|
+ m_line.substr(m_cursor_pos);
|
||||||
++m_cursor_pos;
|
++m_cursor_pos;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void insert(StringView str)
|
void insert(StringView str)
|
||||||
{
|
{
|
||||||
|
@ -626,6 +629,17 @@ String common_prefix(ConstArrayView<String> strings)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Optional<Codepoint> get_raw_codepoint(Key key)
|
||||||
|
{
|
||||||
|
if (auto cp = key.codepoint())
|
||||||
|
return cp;
|
||||||
|
else if (key.modifiers == Key::Modifiers::Control and
|
||||||
|
((key.key >= '@' and key.key <= '_') or
|
||||||
|
(key.key >= 'a' and key.key <= 'z')))
|
||||||
|
return {(Codepoint)(to_upper((char)key.key) - '@')};
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
class Prompt : public InputMode
|
class Prompt : public InputMode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -688,6 +702,18 @@ public:
|
||||||
}, "Enter register name", register_doc);
|
}, "Enter register name", register_doc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (key == ctrl('v'))
|
||||||
|
{
|
||||||
|
on_next_key_with_autoinfo(context(), KeymapMode::None,
|
||||||
|
[this](Key key, Context&) {
|
||||||
|
if (auto cp = get_raw_codepoint(key))
|
||||||
|
{
|
||||||
|
m_line_editor.insert(*cp);
|
||||||
|
display();
|
||||||
|
m_callback(m_line_editor.line(), PromptEvent::Change, context());
|
||||||
|
}
|
||||||
|
}, "raw insert", "enter key to insert");
|
||||||
|
}
|
||||||
else if (key == Key::Up or key == ctrl('p'))
|
else if (key == Key::Up or key == ctrl('p'))
|
||||||
{
|
{
|
||||||
if (m_history_it != history.begin())
|
if (m_history_it != history.begin())
|
||||||
|
@ -1100,6 +1126,19 @@ public:
|
||||||
}
|
}
|
||||||
else if (key == ctrl('u'))
|
else if (key == ctrl('u'))
|
||||||
context().buffer().commit_undo_group();
|
context().buffer().commit_undo_group();
|
||||||
|
else if (key == ctrl('v'))
|
||||||
|
{
|
||||||
|
on_next_key_with_autoinfo(context(), KeymapMode::None,
|
||||||
|
[this](Key key, Context&) {
|
||||||
|
if (auto cp = get_raw_codepoint(key))
|
||||||
|
{
|
||||||
|
insert(*cp);
|
||||||
|
context().hooks().run_hook("InsertKey", key_to_str(key), context());
|
||||||
|
m_idle_timer.set_next_date(Clock::now() + idle_timeout);
|
||||||
|
}
|
||||||
|
}, "raw insert", "enter key to insert");
|
||||||
|
update_completions = false;
|
||||||
|
}
|
||||||
else if (key == alt(';'))
|
else if (key == alt(';'))
|
||||||
{
|
{
|
||||||
push_mode(new Normal(context().input_handler(), true));
|
push_mode(new Normal(context().input_handler(), true));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user