Support <c-v> to insert raw value in insert/prompt mode

This commit is contained in:
Maxime Coste 2015-11-13 13:52:54 +00:00
parent 67d1b7dcd1
commit 111732005a

View File

@ -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));