Add '*' binding, which (smart) copy current selection to search pattern
This commit is contained in:
parent
a453ddaf37
commit
18aac3d4e8
|
@ -180,6 +180,13 @@ selection.
|
||||||
Registers are lists, instead of simply text in order to interact well with
|
Registers are lists, instead of simply text in order to interact well with
|
||||||
multiselection. Each selection have it's own captures, or yank buffer.
|
multiselection. Each selection have it's own captures, or yank buffer.
|
||||||
|
|
||||||
|
Search selection
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Using the _*_ key, you can set the search pattern to the current selection.
|
||||||
|
This tries to be intelligent. It will for example detect if current selection
|
||||||
|
begins and/or end at word boundaries, and set the search pattern accordingly.
|
||||||
|
|
||||||
Basic Commands
|
Basic Commands
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
@ -227,7 +234,7 @@ Kakoune support three string syntax:
|
||||||
* +"strings" and \'strings\'+: classic strings, use \' or \" to escape the
|
* +"strings" and \'strings\'+: classic strings, use \' or \" to escape the
|
||||||
separator.
|
separator.
|
||||||
|
|
||||||
* +%\{strings\}+: these strings are very usefull when entering commands
|
* +%\{strings\}+: these strings are very useful when entering commands
|
||||||
|
|
||||||
- the '{' and '}' delimiter are configurable: you can use any non
|
- the '{' and '}' delimiter are configurable: you can use any non
|
||||||
alphanumeric character. like %[string], %<string>, %(string), %~string~
|
alphanumeric character. like %[string], %<string>, %(string), %~string~
|
||||||
|
|
21
src/main.cc
21
src/main.cc
|
@ -189,6 +189,25 @@ void do_search_next(Context& context)
|
||||||
context.print_status("no search pattern");
|
context.print_status("no search pattern");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void use_selection_as_search_pattern(Context& context)
|
||||||
|
{
|
||||||
|
std::vector<String> patterns;
|
||||||
|
auto& sels = context.editor().selections();
|
||||||
|
for (auto& sel : sels)
|
||||||
|
{
|
||||||
|
auto begin = sel.begin();
|
||||||
|
auto end = sel.end();
|
||||||
|
auto content = "\\Q" + context.buffer().string(begin, end) + "\\E";
|
||||||
|
if (begin.is_begin() or (is_word(utf8::codepoint(begin)) and not is_word(utf8::codepoint(utf8::previous(begin)))))
|
||||||
|
content = "\\b" + content;
|
||||||
|
if (end.is_end() or (is_word(utf8::codepoint(utf8::previous(end))) and not is_word(utf8::codepoint(end))))
|
||||||
|
content = content + "\\b";
|
||||||
|
|
||||||
|
patterns.push_back(std::move(content));
|
||||||
|
}
|
||||||
|
RegisterManager::instance()['/'] = patterns;
|
||||||
|
}
|
||||||
|
|
||||||
void do_yank(Context& context)
|
void do_yank(Context& context)
|
||||||
{
|
{
|
||||||
RegisterManager::instance()['"'] = context.editor().selections_content();
|
RegisterManager::instance()['"'] = context.editor().selections_content();
|
||||||
|
@ -620,6 +639,8 @@ std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
||||||
|
|
||||||
{ { Key::Modifiers::None, 'q' }, start_or_end_macro_recording },
|
{ { Key::Modifiers::None, 'q' }, start_or_end_macro_recording },
|
||||||
{ { Key::Modifiers::None, '@' }, replay_macro },
|
{ { Key::Modifiers::None, '@' }, replay_macro },
|
||||||
|
|
||||||
|
{ { Key::Modifiers::None, '*' }, use_selection_as_search_pattern },
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user