make keymap definition more readable using a select helper function
This commit is contained in:
parent
67971995f8
commit
0e081a76c1
95
src/main.cc
95
src/main.cc
|
@ -377,24 +377,6 @@ void do_rotate_selections(Context& context)
|
||||||
context.editor().select(std::move(sels));
|
context.editor().select(std::move(sels));
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class Repeated
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Repeated(T t) : m_func(t) {}
|
|
||||||
|
|
||||||
void operator() (Context& context)
|
|
||||||
{
|
|
||||||
int count = context.numeric_param();
|
|
||||||
do { m_func(context); } while(--count > 0);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
T m_func;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
Repeated<T> repeated(T func) { return Repeated<T>(func); }
|
|
||||||
|
|
||||||
enum class SelectFlags
|
enum class SelectFlags
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
|
@ -462,6 +444,41 @@ String runtime_directory()
|
||||||
return String(buffer, ptr);
|
return String(buffer, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class Repeated
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr Repeated(T t) : m_func(t) {}
|
||||||
|
|
||||||
|
void operator() (Context& context)
|
||||||
|
{
|
||||||
|
int count = context.numeric_param();
|
||||||
|
do { m_func(context); } while(--count > 0);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
T m_func;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Repeated<T> repeated(T func) { return Repeated<T>(func); }
|
||||||
|
|
||||||
|
template<SelectMode mode, typename T>
|
||||||
|
class Select
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr Select(T t) : m_func(t) {}
|
||||||
|
|
||||||
|
void operator() (Context& context)
|
||||||
|
{
|
||||||
|
context.editor().select(m_func, mode);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
T m_func;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<SelectMode mode, typename T>
|
||||||
|
constexpr Select<mode, T> select(T func) { return Select<mode, T>(func); }
|
||||||
|
|
||||||
std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
||||||
{
|
{
|
||||||
{ { Key::Modifiers::None, 'h' }, [](Context& context) { context.editor().move_selections(-CharCount(std::max(context.numeric_param(),1))); } },
|
{ { Key::Modifiers::None, 'h' }, [](Context& context) { context.editor().move_selections(-CharCount(std::max(context.numeric_param(),1))); } },
|
||||||
|
@ -515,16 +532,16 @@ std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
||||||
{ { Key::Modifiers::Alt, ' ' }, [](Context& context) { int count = context.numeric_param();
|
{ { Key::Modifiers::Alt, ' ' }, [](Context& context) { int count = context.numeric_param();
|
||||||
if (count == 0) context.editor().flip_selections();
|
if (count == 0) context.editor().flip_selections();
|
||||||
else context.editor().remove_selection(count-1); } },
|
else context.editor().remove_selection(count-1); } },
|
||||||
{ { Key::Modifiers::None, 'w' }, repeated([](Context& context) { context.editor().select(select_to_next_word<false>); }) },
|
{ { Key::Modifiers::None, 'w' }, repeated(select<SelectMode::Replace>(select_to_next_word<false>)) },
|
||||||
{ { Key::Modifiers::None, 'e' }, repeated([](Context& context) { context.editor().select(select_to_next_word_end<false>); }) },
|
{ { Key::Modifiers::None, 'e' }, repeated(select<SelectMode::Replace>(select_to_next_word_end<false>)) },
|
||||||
{ { Key::Modifiers::None, 'b' }, repeated([](Context& context) { context.editor().select(select_to_previous_word<false>); }) },
|
{ { Key::Modifiers::None, 'b' }, repeated(select<SelectMode::Replace>(select_to_previous_word<false>)) },
|
||||||
{ { Key::Modifiers::None, 'W' }, repeated([](Context& context) { context.editor().select(select_to_next_word<false>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::None, 'W' }, repeated(select<SelectMode::Extend>(select_to_next_word<false>)) },
|
||||||
{ { Key::Modifiers::None, 'E' }, repeated([](Context& context) { context.editor().select(select_to_next_word_end<false>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::None, 'E' }, repeated(select<SelectMode::Extend>(select_to_next_word_end<false>)) },
|
||||||
{ { Key::Modifiers::None, 'B' }, repeated([](Context& context) { context.editor().select(select_to_previous_word<false>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::None, 'B' }, repeated(select<SelectMode::Extend>(select_to_previous_word<false>)) },
|
||||||
{ { Key::Modifiers::None, 'x' }, repeated([](Context& context) { context.editor().select(select_line, SelectMode::Replace); }) },
|
{ { Key::Modifiers::None, 'x' }, repeated(select<SelectMode::Replace>(select_line)) },
|
||||||
{ { Key::Modifiers::None, 'X' }, repeated([](Context& context) { context.editor().select(select_line, SelectMode::Extend); }) },
|
{ { Key::Modifiers::None, 'X' }, repeated(select<SelectMode::Extend>(select_line)) },
|
||||||
{ { Key::Modifiers::None, 'm' }, [](Context& context) { context.editor().select(select_matching); } },
|
{ { Key::Modifiers::None, 'm' }, select<SelectMode::Replace>(select_matching) },
|
||||||
{ { Key::Modifiers::None, 'M' }, [](Context& context) { context.editor().select(select_matching, SelectMode::Extend); } },
|
{ { Key::Modifiers::None, 'M' }, select<SelectMode::Extend>(select_matching) },
|
||||||
|
|
||||||
{ { Key::Modifiers::None, '/' }, do_search<SelectMode::Replace, true> },
|
{ { Key::Modifiers::None, '/' }, do_search<SelectMode::Replace, true> },
|
||||||
{ { Key::Modifiers::None, '?' }, do_search<SelectMode::Extend, true> },
|
{ { Key::Modifiers::None, '?' }, do_search<SelectMode::Extend, true> },
|
||||||
|
@ -543,17 +560,17 @@ std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
||||||
{ { Key::Modifiers::None, ']' }, do_select_object<SurroundFlags::ToEnd> },
|
{ { Key::Modifiers::None, ']' }, do_select_object<SurroundFlags::ToEnd> },
|
||||||
{ { Key::Modifiers::None, '[' }, do_select_object<SurroundFlags::ToBegin> },
|
{ { Key::Modifiers::None, '[' }, do_select_object<SurroundFlags::ToBegin> },
|
||||||
|
|
||||||
{ { Key::Modifiers::Alt, 'w' }, repeated([](Context& context) { context.editor().select(select_to_next_word<true>); }) },
|
{ { Key::Modifiers::Alt, 'w' }, repeated(select<SelectMode::Replace>(select_to_next_word<true>)) },
|
||||||
{ { Key::Modifiers::Alt, 'e' }, repeated([](Context& context) { context.editor().select(select_to_next_word_end<true>); }) },
|
{ { Key::Modifiers::Alt, 'e' }, repeated(select<SelectMode::Replace>(select_to_next_word_end<true>)) },
|
||||||
{ { Key::Modifiers::Alt, 'b' }, repeated([](Context& context) { context.editor().select(select_to_previous_word<true>); }) },
|
{ { Key::Modifiers::Alt, 'b' }, repeated(select<SelectMode::Replace>(select_to_previous_word<true>)) },
|
||||||
{ { Key::Modifiers::Alt, 'W' }, repeated([](Context& context) { context.editor().select(select_to_next_word<true>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::Alt, 'W' }, repeated(select<SelectMode::Extend>(select_to_next_word<true>)) },
|
||||||
{ { Key::Modifiers::Alt, 'E' }, repeated([](Context& context) { context.editor().select(select_to_next_word_end<true>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::Alt, 'E' }, repeated(select<SelectMode::Extend>(select_to_next_word_end<true>)) },
|
||||||
{ { Key::Modifiers::Alt, 'B' }, repeated([](Context& context) { context.editor().select(select_to_previous_word<true>, SelectMode::Extend); }) },
|
{ { Key::Modifiers::Alt, 'B' }, repeated(select<SelectMode::Extend>(select_to_previous_word<true>)) },
|
||||||
|
|
||||||
{ { Key::Modifiers::Alt, 'l' }, repeated([](Context& context) { context.editor().select(select_to_eol, SelectMode::Replace); }) },
|
{ { Key::Modifiers::Alt, 'l' }, repeated(select<SelectMode::Replace>(select_to_eol)) },
|
||||||
{ { Key::Modifiers::Alt, 'L' }, repeated([](Context& context) { context.editor().select(select_to_eol, SelectMode::Extend); }) },
|
{ { Key::Modifiers::Alt, 'L' }, repeated(select<SelectMode::Extend>(select_to_eol)) },
|
||||||
{ { Key::Modifiers::Alt, 'h' }, repeated([](Context& context) { context.editor().select(select_to_eol_reverse, SelectMode::Replace); }) },
|
{ { Key::Modifiers::Alt, 'h' }, repeated(select<SelectMode::Replace>(select_to_eol_reverse)) },
|
||||||
{ { Key::Modifiers::Alt, 'H' }, repeated([](Context& context) { context.editor().select(select_to_eol_reverse, SelectMode::Extend); }) },
|
{ { Key::Modifiers::Alt, 'H' }, repeated(select<SelectMode::Extend>(select_to_eol_reverse)) },
|
||||||
|
|
||||||
{ { Key::Modifiers::Alt, 's' }, do_split_regex },
|
{ { Key::Modifiers::Alt, 's' }, do_split_regex },
|
||||||
|
|
||||||
|
@ -562,7 +579,7 @@ std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
||||||
{ { Key::Modifiers::None, '<' }, do_deindent },
|
{ { Key::Modifiers::None, '<' }, do_deindent },
|
||||||
{ { Key::Modifiers::None, '>' }, do_indent },
|
{ { Key::Modifiers::None, '>' }, do_indent },
|
||||||
|
|
||||||
{ { Key::Modifiers::Alt, 'x' }, [](Context& context) { context.editor().select(select_whole_lines); } },
|
{ { Key::Modifiers::Alt, 'x' }, select<SelectMode::Replace>(select_whole_lines) },
|
||||||
|
|
||||||
{ { Key::Modifiers::Alt, 'c' }, [](Context& context) { if (context.has_window()) context.window().center_selection(); } },
|
{ { Key::Modifiers::Alt, 'c' }, [](Context& context) { if (context.has_window()) context.window().center_selection(); } },
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user