Add support for -itersel option in exec/eval
-itersel makes a -draft eval/exec run once for each selections separately rather than with all selections at a time.
This commit is contained in:
parent
088f670fe9
commit
7495d04a47
|
@ -299,10 +299,14 @@ Commands are entered using +:+.
|
||||||
is relative to kak executable path.
|
is relative to kak executable path.
|
||||||
* +nameclient <name>+: set current client name
|
* +nameclient <name>+: set current client name
|
||||||
* +namebuf <name>+: set current buffer name
|
* +namebuf <name>+: set current buffer name
|
||||||
* +exec [-client <name>] <keys>+: execute <keys> as if pressed in normal mode.
|
* +exec [-client <name>] [-draft [-itersel]] <keys>+: execute <keys> as if
|
||||||
if client if specified, exec keys in the named client context.
|
pressed in normal mode. if +client+ if specified, exec keys in the named
|
||||||
* +eval [-client <name>] <command>+: execute <command> as if entered in command line
|
client context. if +draft+ is specified, execute the keys in a draft
|
||||||
if client if specified, exec command in the named client context.
|
context. if +itersel+ is specified, apply the keys on each selection
|
||||||
|
separately.
|
||||||
|
* +eval [-client <name>] [-draft [-itersel]] <command>+: execute <command> as
|
||||||
|
if entered in command line. +draft+, +client+ and +itersel+ works the same
|
||||||
|
as for the +exec+ command.
|
||||||
* +echo <text>+: show <text> in status line
|
* +echo <text>+: show <text> in status line
|
||||||
* +name <name>+: sets current client name to name
|
* +name <name>+: sets current client name to name
|
||||||
* +nop+: does nothing, but as with every other commands, arguments may be
|
* +nop+: does nothing, but as with every other commands, arguments may be
|
||||||
|
|
|
@ -540,7 +540,7 @@ public:
|
||||||
template<typename Func>
|
template<typename Func>
|
||||||
void context_wrap(CommandParameters params, Context& context, Func func)
|
void context_wrap(CommandParameters params, Context& context, Func func)
|
||||||
{
|
{
|
||||||
ParametersParser parser(params, { { "client", true }, { "draft", false }},
|
ParametersParser parser(params, { { "client", true }, { "draft", false }, { "itersel", false } },
|
||||||
ParametersParser::Flags::OptionsOnlyAtStart, 1);
|
ParametersParser::Flags::OptionsOnlyAtStart, 1);
|
||||||
|
|
||||||
Context& real_context = parser.has_option("client") ?
|
Context& real_context = parser.has_option("client") ?
|
||||||
|
@ -554,10 +554,24 @@ void context_wrap(CommandParameters params, Context& context, Func func)
|
||||||
real_context.has_client() ? real_context.client().name() : "");
|
real_context.has_client() ? real_context.client().name() : "");
|
||||||
DynamicSelectionList sels{editor.buffer(), editor.selections()};
|
DynamicSelectionList sels{editor.buffer(), editor.selections()};
|
||||||
auto restore_sels = on_scope_end([&]{ editor.select(sels); });
|
auto restore_sels = on_scope_end([&]{ editor.select(sels); });
|
||||||
func(parser, client.context());
|
|
||||||
|
if (parser.has_option("itersel"))
|
||||||
|
{
|
||||||
|
for (auto& sel : sels)
|
||||||
|
{
|
||||||
|
editor.select(sel);
|
||||||
|
func(parser, client.context());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
func(parser, client.context());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (parser.has_option("itersel"))
|
||||||
|
throw runtime_error("-itersel makes no sense without -draft");
|
||||||
func(parser, real_context);
|
func(parser, real_context);
|
||||||
|
}
|
||||||
|
|
||||||
// force redraw of this client window
|
// force redraw of this client window
|
||||||
if (parser.has_option("client") and real_context.has_window())
|
if (parser.has_option("client") and real_context.has_window())
|
||||||
|
|
|
@ -19,13 +19,13 @@ hook global WinSetOption filetype=cpp %~
|
||||||
addhl -group cpp-highlight regex "(?<!')\".*?(?<!\\)(\\\\)*\"" 0:string
|
addhl -group cpp-highlight regex "(?<!')\".*?(?<!\\)(\\\\)*\"" 0:string
|
||||||
addhl -group cpp-highlight regex "(//[^\n]*\n)|(/\*.*?(\*/|\'))" 0:comment
|
addhl -group cpp-highlight regex "(//[^\n]*\n)|(/\*.*?(\*/|\'))" 0:comment
|
||||||
hook window InsertEnd .* -id cpp-hooks %{ try %{ exec -draft <a-x>s\h+$<ret>d } } # cleanup trailing whitespaces when exiting insert mode
|
hook window InsertEnd .* -id cpp-hooks %{ try %{ exec -draft <a-x>s\h+$<ret>d } } # cleanup trailing whitespaces when exiting insert mode
|
||||||
hook window InsertChar \n -id cpp-hooks %[ try %{ exec -draft k<a-x>s\h+$<ret>d } ] # cleanup trailing white space son previous line
|
|
||||||
|
|
||||||
hook window InsertChar \n -id cpp-indent %@
|
hook window InsertChar \n -id cpp-indent %@ eval -draft -itersel %_
|
||||||
try %{ exec -draft k<a-x>s^\h+<ret>yj<a-h>P } # preserve previous line indent
|
try %{ exec -draft k<a-x>s^\h+<ret>yj<a-h>P } # preserve previous line indent
|
||||||
try %[ exec -draft k<a-x><a-k>[{(]\h*$<ret>j<a-gt> ] # indent after lines ending with { or (
|
try %[ exec -draft k<a-x><a-k>[{(]\h*$<ret>j<a-gt> ] # indent after lines ending with { or (
|
||||||
|
try %{ exec -draft k<a-x>s\h+$<ret>d } # cleanup trailing white space son previous line
|
||||||
try %{ exec -draft [(<a-k>\`\([^\n]+\n[^\n]*\n?\'<ret>s\`..|.\'<ret>& } # align to opening paren of previous line
|
try %{ exec -draft [(<a-k>\`\([^\n]+\n[^\n]*\n?\'<ret>s\`..|.\'<ret>& } # align to opening paren of previous line
|
||||||
@
|
_ @
|
||||||
hook window InsertChar \} -id cpp-indent %[ try %[ exec -draft <a-h><a-k>^\h+\}$<ret>< ] ] # deindent on insert } alone on a line
|
hook window InsertChar \} -id cpp-indent %[ try %[ exec -draft <a-h><a-k>^\h+\}$<ret>< ] ] # deindent on insert } alone on a line
|
||||||
~
|
~
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user