2017-11-02 03:03:24 +01:00
|
|
|
= Hooks
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-11-02 03:03:24 +01:00
|
|
|
== Description
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-04-08 18:00:24 +02:00
|
|
|
Commands can be registered to be executed when certain events arise. To
|
2016-02-10 22:03:49 +01:00
|
|
|
register a hook use the following command:
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-02-03 18:15:35 +01:00
|
|
|
----------------------------------------------------------------------
|
|
|
|
hook [-group <group>] <scope> <hook_name> <filtering_regex> <commands>
|
|
|
|
----------------------------------------------------------------------
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2017-11-01 12:49:13 +01:00
|
|
|
*scope* can be one of *global*, *buffer* or *window* (See
|
|
|
|
<<scopes#,`:doc scopes`>>).
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-02-10 22:03:49 +01:00
|
|
|
*command* is a string containing the commands to execute when the hook
|
|
|
|
is called.
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-02-10 22:03:49 +01:00
|
|
|
For example to automatically use line numbering with .cc files, use the
|
|
|
|
following command:
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-02-03 18:15:35 +01:00
|
|
|
----------------------------------------------------
|
2018-07-10 18:05:26 +02:00
|
|
|
hook global WinCreate .*\.cc %{ add-highlighter number-lines }
|
2016-02-03 18:15:35 +01:00
|
|
|
----------------------------------------------------
|
|
|
|
|
2017-04-21 12:32:47 +02:00
|
|
|
If *group* is given, make this hook part of the named group. Groups are used
|
2016-02-10 22:03:49 +01:00
|
|
|
for removing hooks with the following command:
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
-----------------------
|
2017-01-04 01:07:45 +01:00
|
|
|
remove-hooks <scope> <group>
|
2016-02-03 18:15:35 +01:00
|
|
|
-----------------------
|
|
|
|
|
2016-02-10 22:03:49 +01:00
|
|
|
A call to the command above will remove every hooks in *scope* that are part
|
|
|
|
of the given *group*.
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-11-02 03:03:24 +01:00
|
|
|
== Default hooks
|
|
|
|
|
2016-02-03 18:15:35 +01:00
|
|
|
*NormalIdle*::
|
2017-11-02 10:37:39 +01:00
|
|
|
a certain duration has passed since last key was pressed in normal mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*NormalBegin*::
|
2017-11-02 10:37:39 +01:00
|
|
|
entering normal mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*NormalEnd*::
|
2017-11-02 10:37:39 +01:00
|
|
|
leaving normal mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*NormalKey* `key`::
|
|
|
|
a key is received in normal mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*InsertIdle*::
|
2017-11-02 10:37:39 +01:00
|
|
|
a certain duration has passed since last key was pressed in insert mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*InsertBegin*::
|
2017-11-02 10:37:39 +01:00
|
|
|
entering insert mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*InsertEnd*::
|
2017-11-02 10:37:39 +01:00
|
|
|
leaving insert mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*InsertKey* `key`::
|
|
|
|
a key is received in insert mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*InsertChar* `char`::
|
|
|
|
a character is received in insert mode
|
2016-06-20 20:30:28 +02:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*InsertDelete* `deleted char`::
|
|
|
|
a character is deleted in insert mode
|
2017-03-30 11:38:56 +02:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*InsertMove* `move key`::
|
|
|
|
the cursor moved (without inserting) in insert mode
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-07-05 13:45:45 +02:00
|
|
|
*PromptIdle*::
|
2017-11-02 10:37:39 +01:00
|
|
|
a certain duration has passed since last key was pressed in prompt mode
|
2017-07-05 13:45:45 +02:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*WinCreate* `buffer name`::
|
|
|
|
a window was created
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*WinClose* `buffer name`::
|
|
|
|
a window was destroyed
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*WinResize* `<line>.<column>`::
|
|
|
|
a window was resized
|
2016-05-13 10:33:11 +02:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*WinDisplay* `buffer name`::
|
|
|
|
a window was bound a client
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*WinSetOption* `<option_name>=<new_value>`::
|
|
|
|
an option was set in a window context
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2018-03-05 01:20:17 +01:00
|
|
|
*GlobalSetOption* `<option_name>=<new_value>`::
|
|
|
|
an option was set at the global scope
|
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufSetOption* `<option_name>=<new_value>`::
|
|
|
|
an option was set in a buffer context
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufNewFile* `filename`::
|
|
|
|
a buffer for a new file has been created
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufOpenFile* `filename`::
|
|
|
|
a buffer for an existing file has been created
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufCreate* `filename`::
|
|
|
|
a buffer has been created
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufWritePre* `filename`::
|
|
|
|
executed just before a buffer is written
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufWritePost* `filename`::
|
|
|
|
executed just after a buffer is written
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufClose* `buffer name`::
|
2017-11-02 10:37:39 +01:00
|
|
|
executed when a buffer is deleted, while it is still valid
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufOpenFifo* `buffer name`::
|
2017-11-02 10:37:39 +01:00
|
|
|
executed when a buffer opens a fifo
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*BufReadFifo* `buffer name`::
|
2017-11-02 10:37:39 +01:00
|
|
|
executed after some data has been read from a fifo and inserted in
|
|
|
|
the buffer
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*BufCloseFifo*::
|
2017-11-02 10:37:39 +01:00
|
|
|
executed when a fifo buffer closes its fifo file descriptor either
|
2017-12-16 15:31:31 +01:00
|
|
|
because the buffer is being deleted or the writing end has been closed
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*RuntimeError* `error message`::
|
|
|
|
an error was encountered while executing a user command
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2018-01-21 00:34:09 +01:00
|
|
|
*ModeChange* `<old mode>:<new mode>`::
|
2017-12-18 01:03:29 +01:00
|
|
|
Triggered whenever the current input mode changes
|
|
|
|
|
2017-12-21 22:22:33 +01:00
|
|
|
*KakBegin* `session name`::
|
2017-11-02 10:37:39 +01:00
|
|
|
kakoune has started, this hook is called just after reading the user
|
|
|
|
configuration files
|
2016-02-03 18:15:35 +01:00
|
|
|
|
|
|
|
*KakEnd*::
|
2017-11-02 10:37:39 +01:00
|
|
|
kakoune is quitting
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*FocusIn* `client name`::
|
|
|
|
on supported clients, triggered when the client gets focused
|
2016-02-03 18:15:35 +01:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*FocusOut* `client name`::
|
|
|
|
on supported clients, triggered when the client gets unfocused
|
2016-02-02 20:15:12 +01:00
|
|
|
|
2016-09-21 14:38:34 +02:00
|
|
|
*InsertCompletionShow*::
|
2017-11-02 10:37:39 +01:00
|
|
|
Triggered when the insert completion menu gets displayed
|
2016-09-21 14:38:34 +02:00
|
|
|
|
|
|
|
*InsertCompletionHide*::
|
2017-11-02 10:37:39 +01:00
|
|
|
Triggered when the insert completion menu gets hidden
|
2016-09-21 14:38:34 +02:00
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*InsertCompletionSelect* `selected completion`::
|
2017-11-25 06:47:04 +01:00
|
|
|
Triggered when an entry is selected in the insert completion
|
|
|
|
menu. The filtering text is the selected completion text or
|
|
|
|
the empty string if the original text was selected back.
|
|
|
|
|
2017-12-16 15:31:31 +01:00
|
|
|
*RawKey* `key`::
|
|
|
|
Triggered whenever a key is pressed by the user
|
2017-01-25 00:57:36 +01:00
|
|
|
|
2016-10-18 14:36:43 +02:00
|
|
|
When not specified, the filtering text is an empty string. Note that
|
|
|
|
some hooks will not consider underlying scopes depending on what context
|
|
|
|
they are bound to be run into, e.g. the `BufWritePost` hook is a buffer
|
|
|
|
hook, and will not consider the `window` scope.
|
2017-06-26 18:50:22 +02:00
|
|
|
|
2017-11-12 15:44:04 +01:00
|
|
|
While defining hook commands with a `%sh{}` block, some additional env
|
|
|
|
vars are available:
|
2017-06-26 18:50:22 +02:00
|
|
|
|
|
|
|
* `kak_hook_param`: filtering text passed to the currently executing hook
|
2017-11-28 12:40:07 +01:00
|
|
|
|
2017-06-26 18:50:22 +02:00
|
|
|
* `kak_hook_param_capture_N`: text captured by the hook filter regex capture N
|
|
|
|
|
2017-11-02 03:03:24 +01:00
|
|
|
== Disabling Hooks
|
2017-06-26 18:50:22 +02:00
|
|
|
|
2017-11-28 12:40:07 +01:00
|
|
|
Any normal mode command can be prefixed with `\ ` which will disable hook
|
2017-06-26 18:50:22 +02:00
|
|
|
execution for the duration for the command (including the duration of modes
|
|
|
|
the command could move to, so `\i` will disable hooks for the whole insert
|
|
|
|
session).
|
|
|
|
|
|
|
|
As autoindentation is implemented in terms of hooks, this can be used to
|
|
|
|
disable it when pasting text.
|
|
|
|
|
|
|
|
A less temporary alternative is to set the `disabled_hooks` option which
|
|
|
|
accepts a regex describing which hooks won't be executed.
|
|
|
|
For example indentation hooks can be disabled with '.*-indent'.
|
|
|
|
|
2017-11-08 18:38:31 +01:00
|
|
|
Finally, hook execution can be disabled while using the `execute-keys` or
|
|
|
|
`evaluate-commands` commands by using the `-no-hooks` switch.
|
|
|
|
(See <<execeval#,`:doc execeval`>>)
|