mirror of
https://github.com/mawww/kakoune.git
synced 2024-12-11 04:34:27 +03:00
1650 lines
65 KiB
Plaintext
1650 lines
65 KiB
Plaintext
= image:{logo}[K,30,30,link="{website}"] Kakoune image:{travis-img}[link="{travis-url}"] image:{irc-img}[link="{irc-url}"]
|
|
:logo: https://rawgit.com/mawww/kakoune/master/doc/kakoune_logo.svg
|
|
:website: http://kakoune.org
|
|
:travis-img: https://travis-ci.org/mawww/kakoune.svg?branch=master
|
|
:travis-url: https://travis-ci.org/mawww/kakoune
|
|
:irc-img: https://img.shields.io/badge/IRC-%23kakoune-blue.svg
|
|
:irc-url: https://webchat.freenode.net/?channels=kakoune
|
|
:icons: font
|
|
:toc: right
|
|
:pp: ++
|
|
|
|
TL;DR
|
|
-----
|
|
|
|
{website}
|
|
|
|
*Vim inspired* -- *Faster as in fewer keystrokes* --
|
|
*Multiple selections* -- *Orthogonal design*
|
|
|
|
---------------------------------------------
|
|
git clone http://github.com/mawww/kakoune.git
|
|
cd kakoune/src
|
|
make
|
|
./kak
|
|
---------------------------------------------
|
|
|
|
See http://github.com/mawww/golf for kakoune solutions to vimgolf challenges,
|
|
regularly beating the best vim solution.
|
|
|
|
See the link:doc/design.asciidoc[design document] for more information on
|
|
Kakoune philosophy and design.
|
|
|
|
:numbered:
|
|
|
|
Introduction
|
|
------------
|
|
|
|
Kakoune is a code editor heavily inspired by Vim, as such most of its
|
|
commands are similar to vi's ones, and it shares Vi's "keystrokes as
|
|
a text editing language" model.
|
|
|
|
Kakoune can operate in two modes, normal and insertion. In insertion mode,
|
|
keys are directly inserted into the current buffer. In normal mode, keys
|
|
are used to manipulate the current selection and to enter insertion mode.
|
|
|
|
Kakoune has a strong focus on interactivity, most commands provide immediate
|
|
and incremental results, while still being competitive (as in keystroke count)
|
|
with Vim.
|
|
|
|
Kakoune works on selections, which are oriented, inclusive range of characters,
|
|
selections have an anchor and a cursor character. Most commands move both of
|
|
them, except when extending selection where the anchor character stays fixed
|
|
and the cursor one moves around.
|
|
|
|
See http://vimeo.com/82711574
|
|
|
|
Join us on freenode IRC `#Kakoune`
|
|
|
|
Features
|
|
~~~~~~~~
|
|
|
|
* Multiple selections as a central way of interacting
|
|
* Powerful selection manipulation primitives
|
|
- Select all regex matches in current selections
|
|
- Keep selections containing/not containing a match for a given regex
|
|
- Split current selections with a regex
|
|
- Text objects (paragraph, sentence, nestable blocks)
|
|
* Powerful text manipulation primitives
|
|
- Align selections
|
|
- Rotate selection contents
|
|
- Case manipulation
|
|
- Indentation
|
|
- Piping each selection to external filter
|
|
* Client-Server architecture
|
|
- Multiple clients on the same editing session
|
|
- Use tmux or your X11 window manager to manage windows
|
|
* Simple interaction with external programs
|
|
* Automatic contextual help
|
|
* Automatic as you type completion
|
|
* Macros
|
|
* Hooks
|
|
* Syntax Highlighting
|
|
- Supports multiple languages in the same buffer
|
|
- Highlight a buffer differently in different windows
|
|
|
|
Screenshots
|
|
~~~~~~~~~~~
|
|
|
|
[[screenshot-i3]]
|
|
.Kakoune in i3
|
|
image::doc/screenshot-i3.gif[Kakoune in i3]
|
|
|
|
[[screenshot-tmux]]
|
|
.Kakoune in tmux
|
|
image::doc/screenshot-tmux.gif[Kakoune in tmux]
|
|
|
|
Getting started
|
|
---------------
|
|
|
|
Building
|
|
~~~~~~~~
|
|
|
|
Kakoune dependencies are:
|
|
|
|
* A {cpp}14 compliant compiler (GCC >= 5 or clang >= 3.6) along with its
|
|
associated {cpp} standard library (libstdc{pp} or libc{pp})
|
|
* boost (>= 1.50)
|
|
* ncurses with wide-characters support (>= 5.3, generally referred to as libncursesw)
|
|
* asciidoc (for the `a2k` tool), to generate man pages
|
|
|
|
To build, just type *make* in the src directory.
|
|
To generate man pages, type *make doc* in the src directory.
|
|
|
|
Kakoune can be built on Linux, MacOS, and Cygwin. Due to Kakoune relying heavily
|
|
on being in a Unix-like environment, no native Windows version is planned.
|
|
|
|
Installing
|
|
~~~~~~~~~~
|
|
|
|
In order to install kak on your system, rather than running it directly from
|
|
its source directory, type *make install*, you can specify the `PREFIX` and
|
|
`DESTDIR` if needed.
|
|
|
|
[TIP]
|
|
.Homebrew (OSX)
|
|
====
|
|
NOTE: The ncurses library that comes with OSX is not new enough to support some
|
|
mouse based features of Kakoune (only tested on OSX 10.11.3, where the
|
|
packaged ncurses library is version 5.4, whereas the latest version is 6.0).
|
|
Currently, a fresh Kakoune install requires that you install ncurses 6.0. You
|
|
can install ncurses 6.0 via Homebrew,
|
|
--------------------
|
|
brew install ncurses
|
|
--------------------
|
|
|
|
Then, to install,
|
|
---------------------------------------------------------------------------------------------
|
|
brew install --HEAD https://raw.githubusercontent.com/mawww/kakoune/master/contrib/kakoune.rb
|
|
---------------------------------------------------------------------------------------------
|
|
|
|
To update kakoune,
|
|
---------------------------------
|
|
brew upgrade --fetch-HEAD kakoune
|
|
---------------------------------
|
|
====
|
|
|
|
[TIP]
|
|
.Fedora 22/23/24/Rawhide
|
|
====
|
|
Use the https://copr.fedoraproject.org/coprs/jkonecny/kakoune/[copr]
|
|
repository.
|
|
|
|
---------------------------------
|
|
dnf copr enable jkonecny/kakoune
|
|
dnf install kakoune
|
|
---------------------------------
|
|
====
|
|
|
|
[TIP]
|
|
.Arch Linux
|
|
====
|
|
A PKGBUILD https://aur.archlinux.org/packages/kakoune-git[kakoune-git]
|
|
to install Kakoune is available in the
|
|
https://wiki.archlinux.org/index.php/Arch_User_Repository[AUR].
|
|
|
|
--------------------------------------------------
|
|
# For example build and install Kakoune via yaourt
|
|
yaourt -Sy kakoune-git
|
|
--------------------------------------------------
|
|
====
|
|
|
|
[TIP]
|
|
.Gentoo
|
|
====
|
|
Kakoune is found in portage as
|
|
https://packages.gentoo.org/packages/app-editors/kakoune[app-editors/kakoune]
|
|
====
|
|
|
|
[TIP]
|
|
.Exherbo
|
|
====
|
|
--------------------------------
|
|
cave resolve -x repository/mawww
|
|
cave resolve -x kakoune
|
|
--------------------------------
|
|
====
|
|
|
|
[TIP]
|
|
.openSUSE
|
|
====
|
|
kakoune can be found in the
|
|
https://build.opensuse.org/package/show/editors/kakoune[editors] devel
|
|
project. Make sure to adjust the link below to point to the repository of
|
|
your openSUSE version.
|
|
|
|
---------------------------------------------------------------------------------------------------
|
|
#Example for Tumbleweed:
|
|
sudo zypper addrepo http://download.opensuse.org/repositories/editors/openSUSE_Factory/editors.repo
|
|
sudo zypper refresh
|
|
sudo zypper install kakoune
|
|
---------------------------------------------------------------------------------------------------
|
|
====
|
|
|
|
[TIP]
|
|
.Ubuntu
|
|
====
|
|
Building on Ubuntu 16.04.
|
|
Make sure you have .local/bin in your path to make the kak binary available from your shell.
|
|
|
|
--------------------------------------------------------------------------
|
|
sudo apt install libncursesw5-dev libboost-regex-dev asciidoc libboost-dev
|
|
git clone https://github.com/mawww/kakoune.git && cd kakoune/src
|
|
make
|
|
PREFIX=$HOME/.local make install
|
|
--------------------------------------------------------------------------
|
|
====
|
|
|
|
Running
|
|
~~~~~~~
|
|
|
|
Just running *kak* launch a new kak session with a client on local terminal.
|
|
*kak* accepts some switches:
|
|
|
|
* `-c <session>`: connect to given session, sessions are unix sockets
|
|
`/tmp/kakoune/<user>/<session>`, `<user>/<session>` can be used
|
|
as well to connect to another user's session, provided the socket
|
|
permissions have been changed to allow it.
|
|
* `-e <commands>`: execute commands on startup
|
|
* `-n`: ignore kakrc file
|
|
* `-s <session>`: set the session name, by default it will be the pid
|
|
of the initial kak process.
|
|
* `-d`: run Kakoune in daemon mode, without user interface. This requires
|
|
the session name to be specified with -s. In this mode, the Kakoune
|
|
server will keep running even if there is no connected client, and
|
|
will quit when receiving SIGTERM.
|
|
* `-p <session>`: read stdin, and then send its content to the given session
|
|
acting as a remote control.
|
|
* `-f <keys>`: Work as a filter, read every file given on the command line
|
|
and stdin if piped in, and apply given keys on each.
|
|
* `-ui <userinterface>`: use given user interface, `<userinterface>` can be
|
|
- `ncurses`: default terminal user interface
|
|
- `dummy`: empty user interface not displaying anything
|
|
- `json`: json-rpc based user interface that writes json on stdout and
|
|
read keystrokes as json on stdin.
|
|
* `-l`: list existing sessions, and check the dead ones
|
|
* `-clear`: clear dead session's socket files
|
|
* `-ro`: prevent modifications to all buffers from being saved to disk
|
|
* `+line[:column]`: specify a target line and column for the first file
|
|
|
|
Configuration
|
|
^^^^^^^^^^^^^
|
|
|
|
There are two directories containing Kakoune's scripts:
|
|
|
|
* `runtime`: located in `../share/kak/` relative to the `kak` binary
|
|
contains the system scripts, installed with Kakoune.
|
|
* `userconf`: located in `$XDG_CONFIG_HOME/kak/`, which defaults
|
|
to `$HOME/.config/kak/` on most systems, containing the user
|
|
configuration.
|
|
|
|
Unless `-n` is specified, Kakoune will load its startup script located
|
|
at `${runtime}/kakrc` relative to the `kak` binary. This startup script
|
|
is responsible for loading the user configuration.
|
|
|
|
First, Kakoune will search recursively for `.kak` files in the `autoload`
|
|
directory. It will first look for an `autoload` directory at
|
|
`${userconf}/autoload` and will fallback to `${runtime}/autoload` if
|
|
it does not exist.
|
|
|
|
Once all those files are loaded, Kakoune will try to source
|
|
`${runtime}/kakrc.local` which is expected to contain distribution provided
|
|
configuration.
|
|
|
|
And finally, the user configuration will be loaded from `${userconf}/kakrc`.
|
|
|
|
NOTE: If you create a user `autoload` directory in `${userconf}/autoload`,
|
|
the system one at `${runtime}/autoload` will not be loaded anymore. You can
|
|
add a symbolic link to it (or to individual scripts) inside
|
|
`${userconf}/autoload` to keep loading system scripts.
|
|
|
|
Basic Interaction
|
|
-----------------
|
|
|
|
Selections
|
|
~~~~~~~~~~
|
|
|
|
The main concept in Kakoune is the selection. A selection is an inclusive,
|
|
directed range of character. A selection has two ends, the anchor and the
|
|
cursor.
|
|
|
|
There is always at least one selection, and a selection is always at least
|
|
one character (in which case the anchor and cursor of the selections are
|
|
on the same character).
|
|
|
|
Normal Mode
|
|
~~~~~~~~~~~
|
|
|
|
In normal mode, keys are not inserted directly inside the buffer, but are editing
|
|
commands. These commands provide ways to manipulate either the selections themselves,
|
|
or the selected text.
|
|
|
|
Insert Mode
|
|
~~~~~~~~~~~
|
|
|
|
When entering insert mode, keys are now directly inserted before each
|
|
selection's cursor. Some additional keys are recognised in insert mode:
|
|
|
|
* `<esc>`: leave insert mode
|
|
* `<backspace>`: delete characters before cursors
|
|
* `<del>`: delete characters under cursors
|
|
* `<left>, <right>, <up>, <down>`: move the cursors in given direction
|
|
* `<home>`: move cursors to line begin
|
|
* `<end>`: move cursors to end of line
|
|
|
|
* `<c-n>`: select next completion candidate
|
|
* `<c-p>`: select previous completion candidate
|
|
* `<c-x>`: explicit insert completion query, followed by:
|
|
- `f`: explicit file completion
|
|
- `w`: explicit word completion
|
|
- `l`: explicit line completion
|
|
* `<c-o>`: disable automatic completion for this insert session
|
|
|
|
* `<c-r>`: insert contents of the register given by next key
|
|
* `<c-v>`: insert next keystroke directly into the buffer,
|
|
without interpreting it.
|
|
|
|
* `<c-u>`: commit changes up to now as a single undo group.
|
|
|
|
* `<a-;>`: escape to normal mode for a single command
|
|
|
|
Movement
|
|
~~~~~~~~
|
|
|
|
* `h`: select the character on the left of selection end
|
|
* `j`: select the character below the selection end
|
|
* `k`: select the character above the selection end
|
|
* `l`: select the character on the right of selection end
|
|
|
|
* `w`: select the word and following whitespaces on the right of selection end
|
|
* `b`: select preceding whitespaces and the word on the left of selection end
|
|
* `e`: select preceding whitespaces and the word on the right of selection end
|
|
* `<a-[wbe]>`: same as [wbe] but select WORD instead of word
|
|
|
|
* `f`: select to the next occurence of given character
|
|
* `t`: select until the next occurence of given character
|
|
* `<a-[ft]>`: same as [ft] but in the other direction
|
|
|
|
* `m`: select to matching character
|
|
* `M`: extend selection to matching character
|
|
|
|
* `x`: select line on which selection end lies (or next line when end lies on
|
|
an end-of-line)
|
|
* `X`: similar to `x`, except the current selection is extended
|
|
* `<a-x>`: expand selections to contain full lines (including end-of-lines)
|
|
* `<a-X>`: trim selections to only contain full lines (not including last
|
|
end-of-line)
|
|
|
|
* `%`: select whole buffer
|
|
|
|
* `<a-h>`: select to line begin
|
|
* `<a-l>`: select to line end
|
|
|
|
* `/`: search (select next match)
|
|
* `<a-/>`: search (select previous match)
|
|
* `?`: search (extend to next match)
|
|
* `<a-?>`: search (extend to previous match)
|
|
* `n`: select next match
|
|
* `N`: add a new selection with next match
|
|
* `<a-n>`: select previous match
|
|
* `<a-N>`: add a new selection with previous match
|
|
|
|
* `pageup`: scroll up
|
|
* `pagedown`: scroll down
|
|
|
|
* `'`: rotate selections (the main selection becomes the next one)
|
|
* `<a-'>`: rotate selections backwards
|
|
|
|
* `;`: reduce selections to their cursor
|
|
* `<a-;>`: flip the selections' direction
|
|
* `<a-:>`: ensure selections are in forward direction (cursor after anchor)
|
|
|
|
* `<a-.>`: repeat last object or `f`/`t` selection command.
|
|
|
|
|
|
A word is a sequence of alphanumeric characters or underscore, a WORD is a
|
|
sequence of non whitespace characters.
|
|
|
|
Appending
|
|
~~~~~~~~~
|
|
|
|
for most selection commands, using shift permits extending current selection
|
|
instead of replacing it. for example, `wWW` selects 3 consecutive words
|
|
|
|
Using Counts
|
|
~~~~~~~~~~~~
|
|
|
|
Most selection commands also support counts, which are entered before the
|
|
command itself.
|
|
|
|
For example, `3W` selects 3 consecutive words and `3w` select the third word on
|
|
the right of selection end.
|
|
|
|
Disabling Hooks
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Any normal mode command can be prefixed with `\` which will disable hook 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.
|
|
|
|
Changes
|
|
~~~~~~~
|
|
|
|
* `i`: enter insert mode before current selection
|
|
* `a`: enter insert mode after current selection
|
|
* `d`: yank and delete current selection
|
|
* `c`: yank and delete current selection and enter insert mode
|
|
* `.`: repeat last insert mode change (`i`, `a`, or `c`, including
|
|
the inserted text)
|
|
|
|
* `<a-d>`: delete current selection
|
|
* `<a-c>`: delete current selection and enter insert mode
|
|
|
|
* `I`: enter insert mode at current selection begin line start
|
|
* `A`: enter insert mode at current selection end line end
|
|
* `o`: enter insert mode in one (or given count) new lines below
|
|
current selection end
|
|
* `O`: enter insert mode in one (or given count) new lines above
|
|
current selection begin
|
|
|
|
* `<a-o>`: add an empty line below cursor
|
|
* `<a-O>`: add an empty line above cursor
|
|
|
|
* `y`: yank selections
|
|
* `p`: paste after current selection end
|
|
* `P`: paste before current selection begin
|
|
* `<a-p>`: paste all after current selection end, and
|
|
select each pasted string.
|
|
* `<a-P>`: paste all before current selection begin, and
|
|
select each pasted string.
|
|
* `R`: replace current selection with yanked text
|
|
* `<a-R>`: replace current selection with every yanked text
|
|
|
|
* `r`: replace each character with the next entered one
|
|
|
|
* `<a-j>`: join selected lines
|
|
* `<a-J>`: join selected lines and select spaces inserted
|
|
in place of line breaks
|
|
* `<a-m>`: merge contiguous selections together (works across lines as well)
|
|
|
|
* `<gt> (>)`: indent selected lines
|
|
* `<a-gt>`: indent selected lines, including empty lines
|
|
* `<lt> (<)`: deindent selected lines
|
|
* `<a-lt>`: deindent selected lines, do not remove incomplete
|
|
indent (3 leading spaces when indent is 4)
|
|
|
|
* `|`: pipe each selection through the given external filter program
|
|
and replace the selection with it's output.
|
|
* `<a-|>`: pipe each selection through the given external filter program
|
|
and ignore its output
|
|
|
|
* `!`: insert command output before selection
|
|
* `<a-!>`: append command output after selection
|
|
|
|
* `u`: undo last change
|
|
* `<a-u>`: move backward in history
|
|
* `U`: redo last change
|
|
* `<a-U>`: move forward in history
|
|
|
|
* `&`: align selection, align the cursor of selections by inserting
|
|
spaces before the first character of the selection
|
|
* `<a-&>`: copy indent, copy the indentation of the main selection
|
|
(or the count one if a count is given) to all other ones
|
|
|
|
* ```: to lower case
|
|
* `~`: to upper case
|
|
* `<a-`>`: swap case
|
|
|
|
* `@`: convert tabs to spaces in current selections, uses the buffer
|
|
tabstop option or the count parameter for tabstop.
|
|
* `<a-@>`: convert spaces to tabs in current selections, uses the buffer
|
|
tabstop option or the count parameter for tabstop.
|
|
|
|
* `<a-">`: rotate selections content, if specified, the count groups
|
|
selections, so `3<a-">` rotate (1, 2, 3) and (3, 4, 6)
|
|
independently.
|
|
|
|
Goto Commands
|
|
~~~~~~~~~~~~~
|
|
|
|
Commands beginning with g are used to goto certain position and or buffer:
|
|
|
|
* `gh`: select to line begin
|
|
* `gl`: select to line end
|
|
* `gi`: select to line begin (non blank)
|
|
|
|
* `gg`, `gk`: go to the first line
|
|
* `gj`: go to the last line
|
|
* `ge`: go to last char of last line
|
|
|
|
* `gt`: go to the first displayed line
|
|
* `gc`: go to the middle displayed line
|
|
* `gb`: go to the last displayed line
|
|
|
|
* `ga`: go to the previous (alternate) buffer
|
|
* `gf`: open the file whose name is selected
|
|
|
|
* `g.`: go to last buffer modification position
|
|
|
|
If a count is given prior to hitting `g`, `g` will jump to the given line.
|
|
Using `G` will extend the selection rather than jump.
|
|
|
|
View commands
|
|
~~~~~~~~~~~~~
|
|
|
|
Some commands, all beginning with v permit to manipulate the current
|
|
view.
|
|
|
|
* `vv` or `vc`: center the main selection in the window
|
|
* `vt`: scroll to put the main selection on the top line of the window
|
|
* `vb`: scroll to put the main selection on the bottom line of the window
|
|
* `vh`: scroll the window count columns left
|
|
* `vj`: scroll the window count line downward
|
|
* `vk`: scroll the window count line upward
|
|
* `vl`: scroll the window count columns right
|
|
|
|
Using `V` will lock view mode until `<esc>` is hit
|
|
|
|
Marks
|
|
~~~~~
|
|
|
|
Current selections position can be saved in a register and restored later on.
|
|
By default, marks use the '^' register, but using the register can be set
|
|
using `"<reg>` prefix.
|
|
|
|
`Z` will save the current selections to the register.
|
|
`<a-Z>` will combine the current selections to the register.
|
|
`z` will restore the selections from the register.
|
|
`<a-z>` will combine the selections from the register with the existing ones.
|
|
|
|
When combining selections, kakoune will prompt for a combining mode:
|
|
|
|
`+` will append selections from both lists into a single list
|
|
`<` will select the selection with the leftmost cursor for each pair
|
|
`>` will select the selection with the rightmost cursor for each pair
|
|
|
|
Jump list
|
|
~~~~~~~~~
|
|
|
|
Some commands, like the goto commands, buffer switch or search commands,
|
|
push the previous selections to the client's jump list. It is possible
|
|
to forward or backward in the jump list using:
|
|
|
|
* `<c-i>`: Jump forward
|
|
* `<c-o>`: Jump backward
|
|
* `<c-s>`: save current selections
|
|
|
|
Multi Selection
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Kak was designed from the start to handle multiple selections.
|
|
One way to get a multiselection is via the `s` key.
|
|
|
|
For example, to change all occurrences of word 'roger' to word 'marcel'
|
|
in a paragraph, here is what can be done:
|
|
|
|
* select the paragraph with enough `x`
|
|
* press `s` and enter roger, then enter
|
|
* now paragraph selection was replaced with multiselection of each roger in
|
|
the paragraph
|
|
* press `c` and marcel<esc> to replace rogers with marcels
|
|
|
|
A multiselection can also be obtained with `S`, which splits the current
|
|
selection according to the regex entered. To split a comma separated list,
|
|
use `S` then ', *'
|
|
|
|
The regex syntax supported by Kakoune is the Perl one and is described
|
|
here <<Regex syntax>>.
|
|
|
|
`s` and `S` share the search pattern with `/`, and hence entering an empty
|
|
pattern uses the last one.
|
|
|
|
As a convenience, `<a-s>` allows you to split the current selections on
|
|
line boundaries.
|
|
|
|
To clear multiple selections, use `space`. To keep only the nth selection
|
|
use `n` followed by `space`, in order to remove a selection, use `<a-space>`.
|
|
|
|
`<a-k>` allows you to enter a regex and keep only the selections that
|
|
contains a match for this regex. Using `<a-K>` you can keep the selections
|
|
not containing a match.
|
|
|
|
`C` copies the current selection to the next line (or lines if a count is given)
|
|
`<a-C>` does the same to previous lines.
|
|
|
|
`$` allows you to enter a shell command and pipe each selection to it.
|
|
Selections whose shell command returns 0 will be kept, other will be dropped.
|
|
|
|
Object Selection
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
Some keys allow you to select a text object:
|
|
|
|
* `<a-a>`: selects the whole object
|
|
* `<a-i>`: selects the inner object, that is the object excluding its surrounder.
|
|
For example, for a quoted string, this will not select the quote, and
|
|
for a word this will not select trailing spaces.
|
|
* `[`: selects to object start
|
|
* `]`: selects to object end
|
|
* `{`: extends selections to object start
|
|
* `}`: extends selections to object end
|
|
|
|
After this key, you need to enter a second key in order to specify which
|
|
object you want.
|
|
|
|
* `b`, `(` or `)`: select the enclosing parenthesis
|
|
* `B`, `{` or `}`: select the enclosing {} block
|
|
* `r`, `[` or `]`: select the enclosing [] block
|
|
* `a`, `<` or `>`: select the enclosing <> block
|
|
* `"` or `Q`: select the enclosing double quoted string
|
|
* `'` or `q`: select the enclosing single quoted string
|
|
* ``` or `g`: select the enclosing grave quoted string
|
|
* `w`: select the whole word
|
|
* `W`: select the whole WORD
|
|
* `s`: select the sentence
|
|
* `p`: select the paragraph
|
|
* `␣`: select the whitespaces
|
|
* `i`: select the current indentation block
|
|
* `n`: select the number
|
|
* `u`: select the argument
|
|
* `:`: select user defined object, will prompt
|
|
for open and close text.
|
|
|
|
For nestable objects, a count can be used in order to specify which surrounding
|
|
level to select.
|
|
|
|
Commands
|
|
--------
|
|
|
|
When pressing `:` in normal mode, Kakoune will open a prompt to enter a command.
|
|
|
|
Commands are used for non editing tasks, such as opening a buffer, writing the
|
|
current one, quitting, etc.
|
|
|
|
A few keys are recognized by prompt mode to help edit a command:
|
|
|
|
* `<ret>`: validate prompt
|
|
* `<esc>`: abandon without
|
|
|
|
* `<left> or <a-h>`: move cursor to previous character
|
|
* `<right> or <a-l>`: move cursor to previous character
|
|
* `<home>`: move cursor to first character
|
|
* `<end>`: move cursor past the last character
|
|
* `<backspace> or <a-x>`: erase character before cursor
|
|
* `<del> or <a-d>`: erase character under cursor
|
|
|
|
* `<c-w>`: advance to next word begin
|
|
* `<c-a-w>`: advance to next WORD begin
|
|
* `<c-b>`: go back to previous word begin
|
|
* `<c-a-b>`: go back to previous WORD begin
|
|
* `<c-e>`: advance to next word end
|
|
* `<c-a-e>`: advance to next word end
|
|
|
|
* `<up> or <c-p>`: select previous entry in history
|
|
* `<down> or <c-n>`: select next entry in history
|
|
|
|
* `<tab>`: select next completion candidate
|
|
* `<backtab>`: select previous completion candidate
|
|
|
|
* `<c-r>`: insert then content of the register given by next key.
|
|
* `<c-v>`: insert next keystroke without interpreting it
|
|
|
|
* `<c-o>`: disable auto completion for this prompt
|
|
|
|
|
|
Commands starting with horizontal whitespace (e.g. a space) will not be
|
|
saved in the command history.
|
|
|
|
Basic Commands
|
|
~~~~~~~~~~~~~~
|
|
|
|
Some commands take an exclamation mark (`!`), which can be used to force
|
|
the execution of the command (i.e. to quit a modified buffer, the
|
|
command `q!` has to be used).
|
|
|
|
* `cd [<directory>]`: change the current directory to `<directory>`, or the home directory is unspecified
|
|
* `doc <topic>`: display documentation about a topic. The completion list
|
|
displays the available topics.
|
|
* `e[dit][!] <filename> [<line> [<column>]]`: open buffer on file, go to given
|
|
line and column. If file is already opened, just switch to this file.
|
|
Use edit! to force reloading.
|
|
* `w[rite][!] [<filename>]`: write buffer to <filename> or use its name if
|
|
filename is not given. If the file is write-protected, its
|
|
permissions are temporarily changed to allow saving the buffer and
|
|
restored afterwards when the write! command is used.
|
|
* `w[rite]a[ll]`: write all buffers that are associated to a file.
|
|
* `q[uit][!] [<exit status>]`: exit Kakoune, use quit! to force quitting even
|
|
if there is some unsaved buffers remaining. If specified, the client exit
|
|
status will be set to <exit status>.
|
|
* `w[a]q[!] [<exit status>]`: write the current buffer (or all buffers when
|
|
`waq` is used) and quit. If specified, the client exit status will be set
|
|
to <exit status>.
|
|
* `kill[!]`: terminate the current session, all the clients as well as the server,
|
|
use kill! to ignore unsaved buffers
|
|
* `b[uffer] <name>`: switch to buffer <name>
|
|
* `b[uffer]n[ext]`: switch to the next buffer
|
|
* `b[uffer]p[rev]`: switch to the previous buffer
|
|
* `d[el]b[uf][!] [<name>]`: delete the buffer <name>
|
|
* `source <filename>`: execute commands in <filename>
|
|
* `colorscheme <name>`: load named colorscheme.
|
|
* `rename-client <name>`: set current client name
|
|
* `rename-buffer <name>`: set current buffer name
|
|
* `rename-session <name>`: set current session name
|
|
* `echo [options] <text>`: show <text> in status line, with the following options:
|
|
** `-markup`: expand the markup strings in <text>
|
|
** `-debug`: print the given text to the `\*debug*` buffer
|
|
* `nop`: does nothing, but as with every other commands, arguments may be
|
|
evaluated. So nop can be used for example to execute a shell command
|
|
while being sure that it's output will not be interpreted by kak.
|
|
`:%sh{ echo echo tchou }` will echo tchou in Kakoune, whereas
|
|
`:nop %sh{ echo echo tchou }` will not, but both will execute the
|
|
shell command.
|
|
|
|
Multiple commands
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
Multiple commands can be separated either by new lines or by semicolons,
|
|
as such a semicolon must be escaped with `\;` to be considered as a literal
|
|
semicolon argument.
|
|
|
|
String syntax
|
|
~~~~~~~~~~~~~
|
|
|
|
When entering a command, parameters are separated by whitespace (shell like),
|
|
if you want to give parameters with spaces, you should quote them.
|
|
|
|
Kakoune support three string syntax:
|
|
|
|
* `'strings'`: uninterpreted strings, you can use `\'` to escape the separator,
|
|
every other char is itself.
|
|
|
|
* `"strings"`: expanded strings, % strings (see <<Expansions>>) contained
|
|
are expended. Use \% to escape a % inside them, and \\ to escape a slash.
|
|
|
|
* `%{strings}`: these strings are very useful when entering commands
|
|
|
|
- the `{` and `}` delimiters are configurable: you can use any non
|
|
alphanumeric character, e.g. `%[string]`, `%<string>`, `%(string)`,
|
|
`%\~string~`, `%!string!`.
|
|
- if the character following the % is one of {[(<, then the closing one is
|
|
the matching }])> and the delimiters are not escapable but are nestable.
|
|
For example `%{ roger {}; }` is a valid string, `%{ marcel \}` as well.
|
|
|
|
Expansions
|
|
^^^^^^^^^^
|
|
|
|
A special kind of `%{strings}` can be used, with a type between
|
|
`%` and the opening delimiter (which cannot be alphanumeric). These
|
|
strings are expanded according to their type.
|
|
|
|
For example `%opt{autoinfo}` is of type 'opt'. 'opt' expansions are replaced
|
|
by the value of the given option (here `autoinfo`).
|
|
|
|
Supported types are:
|
|
|
|
* `sh`: shell expansion, similar to posix shell $(...) construct, see
|
|
<<Shell expansion>> for more details.
|
|
* `reg`: register expansion, will be replaced by the content of the given
|
|
register.
|
|
* `opt`: option expansion, will be replaced with the value of the given
|
|
option
|
|
* `val`: value expansion, gives access to the environment variable available
|
|
to the Shell expansion. The `kak_` prefix is not used there.
|
|
* `arg`: argument expansion, gives access to the arguments of the current
|
|
command, the content can be a number, or `@` for all arguments.
|
|
|
|
For example, you can display last search pattern with
|
|
|
|
-------------
|
|
:echo %reg{/}
|
|
-------------
|
|
|
|
Shell expansion
|
|
^^^^^^^^^^^^^^^
|
|
|
|
The `%sh{...}` expansion replaces its content with the output of the shell
|
|
commands in it. It is similar to the shell $(...) syntax and is evaluated
|
|
only when needed.
|
|
|
|
For example: `%sh{ ls }` is replaced with the output of the ls command.
|
|
|
|
Some of Kakoune state is available through environment variables:
|
|
|
|
* `kak_selection`: content of the main selection
|
|
* `kak_selections`: content of the selection separated by colons, colons and backslashes in
|
|
the selection contents are escaped with a backslash.
|
|
* `kak_selection_desc`: range of the main selection, represented as `anchor,cursor`;
|
|
anchor and cursor are in this format: `line.column`
|
|
* `kak_selections_desc`: range of the selections separated by colons
|
|
* `kak_bufname`: name of the current buffer
|
|
* `kak_buffile`: full path of the file or same as `kak_bufname` when
|
|
there's no associated file
|
|
* `kak_buflist`: the current buffer list, each buffer separated by a colon
|
|
* `kak_buf_line_count`: the current buffer line count
|
|
* `kak_timestamp`: timestamp of the current buffer, the timestamp is an
|
|
integer value which is incremented each time the buffer is modified.
|
|
* `kak_history_id`: history id of the current buffer, the history id is an integer value
|
|
which is used to reference a specific buffer version in the undo tree
|
|
* `kak_runtime`: directory containing the kak binary
|
|
* `kak_count`: count parameter passed to the command
|
|
* `kak_opt_<name>`: value of option <name>
|
|
* `kak_reg_<r>`: value of register <r>
|
|
* `kak_session`: name of the current session
|
|
* `kak_client`: name of current client
|
|
* `kak_client_pid`: pid of the current client
|
|
* `kak_modified`: buffer has modifications not saved
|
|
* `kak_source`: path of the file currently getting executed (through the source command)
|
|
* `kak_cursor_line`: line of the end of the main selection
|
|
* `kak_cursor_column`: column of the end of the main selection (in byte)
|
|
* `kak_cursor_char_value`: unicode value of the codepoint under the cursor
|
|
* `kak_cursor_char_column`: column of the end of the main selection (in character)
|
|
* `kak_cursor_byte_offset`: offset of the main selection from the beginning of the buffer (in byte).
|
|
* `kak_window_width`: width of the current kakoune window
|
|
* `kak_window_height`: height of the current kakoune window
|
|
* `kak_hook_param`: filtering text passed to the currently executing hook
|
|
* `kak_hook_param_capture_N`: text captured by the hook filter regex capture N
|
|
* `kak_client_env_<name>`: value of the <name> variable in the client environment.
|
|
Example: $kak_client_env_SHELL is the SHELL variable
|
|
|
|
Note that in order to make only needed information available, Kakoune needs
|
|
to find the environment variable reference in the shell script executed.
|
|
Hence, `%sh{ ./script.sh }` with `script.sh` referencing an environment
|
|
variable will not work.
|
|
|
|
For example, you can print informations on the current file in the status
|
|
line using:
|
|
|
|
------------------------------------
|
|
:echo -- "%sh{ ls -l $kak_bufname }"
|
|
------------------------------------
|
|
|
|
Markup strings
|
|
^^^^^^^^^^^^^^
|
|
|
|
In certain context, kakoune can take a markup string, which is a string containing
|
|
formatting informations. In these strings, syntax `{facename}` will enable the
|
|
face _facename_ until another face gets activated (or the end of the string.
|
|
Literal `{` shall be written `\{`, and literal `\` that precede a `{` shall
|
|
be written `\\`
|
|
|
|
Configuration & Autoloading
|
|
---------------------------
|
|
|
|
Kakrc
|
|
~~~~~
|
|
|
|
If not launched with the `-n` switch, Kakoune will source the
|
|
`../share/kak/kakrc` file relative to the `kak` binary, which
|
|
will source additional files:
|
|
|
|
If the `$XDG_CONFIG_HOME/kak/autoload` directory exists, load every
|
|
`*.kak` files in it, and load recursively any subdirectory.
|
|
|
|
If it does not exist, falls back to the site wide autoload directory
|
|
in `../share/kak/autoload/`.
|
|
|
|
After that, if it exists, source the `$XDG_CONFIG_HOME/kak/kakrc` file
|
|
which should be used for user configuration.
|
|
|
|
In order to continue autoloading site-wide files with a local autoload
|
|
directory, just add a symbolic link to `../share/kak/autoload/` into
|
|
your local autoload directory.
|
|
|
|
Color Schemes
|
|
~~~~~~~~~~~~~
|
|
|
|
Kakoune ships with some color schemes that are installed to
|
|
`../share/kak/colors/`. If `$XDG_CONFIG_HOME/kak/colors/` is present
|
|
the builtin command `colorscheme` will offer completion for those
|
|
color schemes. If a scheme is duplicated in userspace, it will take
|
|
precedence.
|
|
|
|
Options
|
|
-------
|
|
|
|
For user configuration, Kakoune supports options.
|
|
|
|
Options are typed, their type can be
|
|
|
|
* `int`: an integer number
|
|
* `bool`: a boolean value, `yes/true` or `no/false`
|
|
* `str`: a string, some freeform text
|
|
* `coord`: a line,column pair (separated by comma)
|
|
* `regex`: as a string but the `set` commands will complain
|
|
if the entered text is not a valid regex.
|
|
* `{int,str}-list`: a list, elements are separated by a colon (:)
|
|
if an element needs to contain a colon, it can be escaped with a
|
|
backslash.
|
|
* `range-specs`: a `:` separated list of a pair of a buffer range
|
|
(`<begin line>.<begin column>,<end line>.<end column>` or
|
|
`<begin line>.<end line>+<length>`) and a string (separated by `|`),
|
|
except for the first element which is just the timestamp of the buffer.
|
|
* `line-flags`: a `:` separated list of a line number and a corresponding
|
|
flag (`<line>|<flag text>`), except for the first element which is just
|
|
the timestamp of the buffer.
|
|
* `completions`: a `:` separated list of `<text>|<docstring>|<menu text>`
|
|
candidates, except for the first element which follows the
|
|
`<line>.<column>[+<length>]@<timestamp>` format to define where the
|
|
completion apply in the buffer. Markup can be used in the menu text.
|
|
* `enum(value1|value2|...)`: an enum, taking on of the given values
|
|
* `flags(value1|value2|...)`: a set of flags, taking a combination
|
|
of the given values joined by `|`.
|
|
|
|
Options value can be changed using the `set` commands:
|
|
|
|
------------------------------------------------------------------------------
|
|
:set [global,buffer,window] <option> <value> # buffer, window, or global scope
|
|
------------------------------------------------------------------------------
|
|
|
|
Option values can be different by scope, an option can have a global
|
|
value, a buffer value and a window value. The effective value of an
|
|
option depends on the current context. If we have a window in the
|
|
context (interactive edition for example), then the window value
|
|
(if any) is used, if not we try the buffer value (if we have a buffer
|
|
in the context), and if not we use the global value.
|
|
|
|
That means that two windows on the same buffer can use different options
|
|
(like different filetype, or different tabstop). However, some options
|
|
might end up ignored if their scope is not in the command context:
|
|
|
|
Writing a file never uses the window options for example, so any
|
|
options related to writing won't be taken into account if set in the
|
|
window scope (`BOM` or `eolformat` for example).
|
|
|
|
New options can be declared using the `:decl` command:
|
|
|
|
---------------------------------------
|
|
:decl [-hidden] <type> <name> [<value>]
|
|
---------------------------------------
|
|
|
|
The `-hidden` parameter makes the option invisible in completion, but
|
|
still modifiable.
|
|
|
|
Some options are built in Kakoune, and can be used to control its behaviour:
|
|
|
|
* `tabstop` _int_: width of a tab character.
|
|
* `indentwidth` _int_: width (in spaces) used for indentation.
|
|
0 means a tab character.
|
|
* `scrolloff` _coord_: number of lines,columns to keep visible around
|
|
the cursor when scrolling.
|
|
* `eolformat` _enum(lf|crlf)_: the format of end of lines when
|
|
writing a buffer, this is autodetected on load; values of this option
|
|
assigned to the `window` scope are ignored
|
|
* `BOM` _enum(none|utf8)_: define if the file should be written
|
|
with a unicode byte order mark. Values of this option assigned to the
|
|
`window` scope are ignored
|
|
* `readonly` _bool_: prevent modifications from being saved to disk, all
|
|
buffers if set to `true` in the `global` scope, or current buffer if set in
|
|
the `buffer` scope; values of this option assigned to the `window` scope are
|
|
ignored
|
|
* `incsearch` _bool_: execute search as it is typed
|
|
* `aligntab` _bool_: use tabs for alignment command
|
|
* `autoinfo` _flags(command|onkey|normal)_: display automatic information
|
|
box in the enabled contexts.
|
|
* `autoshowcompl` _bool_: automatically display possible completions when
|
|
editing a prompt.
|
|
* `ignored_files` _regex_: filenames matching this regex won't be considered
|
|
as candidates on filename completion (except if the text being completed
|
|
already matches it).
|
|
* `disabled_hooks` _regex_: hooks whose group matches this regex won't be
|
|
executed. For example indentation hooks can be disabled with '.*-indent'.
|
|
* `filetype` _str_: arbitrary string defining the type of the file
|
|
filetype dependant actions should hook on this option changing for
|
|
activation/deactivation.
|
|
* `path` _str-list_: directories to search for gf command.
|
|
* `completers` _str-list_: completion systems to use for insert mode
|
|
completion. The given completers are tried in order until one generate some
|
|
completion candidates. Existing completers are:
|
|
- `word=all` or `word=buffer` which complete using words in all buffers
|
|
(`word=all`) or only the current one (`word=buffer`)
|
|
- `filename` which tries to detect when a filename is being entered and
|
|
provides completion based on local filesystem.
|
|
- `option=<opt-name>` where <opt-name> is a _completions_ option.
|
|
* `static_words` _str-list_: list of words that are always added to completion
|
|
candidates when completing words in insert mode.
|
|
* `extra_word_chars` _codepoint-list_: list of all additional codepoints
|
|
that should be considered as word character for the purpose of insert mode
|
|
completion.
|
|
* `autoreload` _enum(yes|no|ask)_: auto reload the buffers when an external
|
|
modification is detected.
|
|
* `debug` _flags(hooks|shell|profile|keys|commands)_: dump various debug information in
|
|
the `*debug*` buffer.
|
|
* `idle_timeout` _int_: timeout, in milliseconds, with no user input that will
|
|
trigger the `PromptIdle`, `InsertIdle` and `NormalIdle` hooks.
|
|
* `fs_checkout_timeout` _int_: timeout, in milliseconds, between checks in
|
|
normal mode of modifications of the file associated with the current buffer
|
|
on the filesystem.
|
|
* `modelinefmt` _string_: A format string used to generate the mode line, that
|
|
string is first expanded as a command line would be (expanding `%...{...}`
|
|
strings), then markup tags are applied (see <<Markup strings>>). Two special
|
|
atom are available as markup: `{{mode_info}}` with information about the current
|
|
mode (example `insert 3 sel`), and `{{context_info}}` with information such as
|
|
if the file has been modified (with `[+]`), or if it is new (with `[new file]`).
|
|
* `ui_options`: colon separated list of key=value pairs that are forwarded to
|
|
the user interface implementation. The NCurses UI support the following options:
|
|
- `ncurses_set_title`: if `yes` or `true`, the terminal emulator title will
|
|
be changed.
|
|
- `ncurses_status_on_top`: if `yes`, or `true` the status line will be placed
|
|
at the top of the terminal rather than at the bottom.
|
|
- `ncurses_assistant`: specify the nice assistant you get in info boxes, can
|
|
be 'clippy' (the default), 'cat', 'dilbert' or 'none'
|
|
- `ncurses_enable_mouse`: boolean option that enables mouse support
|
|
- `ncurses_change_colors`: boolean option that can disable color palette
|
|
changing if the terminfo enables it but the terminal does not support it.
|
|
- `ncurses_wheel_down_button` and `ncurses_wheel_up_button`: specify which
|
|
button send for wheel down/up events.
|
|
|
|
Faces
|
|
-----
|
|
|
|
A Face refers how the specified text is displayed. A face has a foreground
|
|
color, a background color, and some attributes.
|
|
|
|
Faces can be defined and modified with the face command:
|
|
|
|
-----------------------
|
|
:face <name> <facespec>
|
|
-----------------------
|
|
|
|
Any place requiring a face can take either a face name defined with the `face`
|
|
command or a direct face description (called _facespec_) with the following
|
|
syntax:
|
|
|
|
--------------------------------
|
|
fg_color[,bg_color][+attributes]
|
|
--------------------------------
|
|
|
|
fg_color and bg_color can be:
|
|
|
|
* A named color: `black, red, green, yellow, blue, magenta, cyan, white`.
|
|
* `default`, which keeps the existing color
|
|
* An rgb color: `rgb:RRGGBB`, with RRGGBB the hexadecimal value of the color.
|
|
|
|
Not specifying bg_color uses `default`
|
|
|
|
`attributes` is a string of letters each defining an attribute:
|
|
|
|
* `u`: Underline
|
|
* `r`: Reverse
|
|
* `b`: Bold
|
|
* `B`: Blink
|
|
* `d`: Dim
|
|
* `i`: Italic
|
|
* `e`: Exclusive, override previous faces instead of merging with them
|
|
|
|
Using named faces instead of facespec permits to change the effective faces
|
|
afterwards.
|
|
|
|
There are some builtins faces used by internal Kakoune functionalities:
|
|
|
|
* `Default`: default colors
|
|
* `PrimarySelection`: main selection face for every selected character except
|
|
the cursor
|
|
* `SecondarySelection`: secondary selection face for every selected character
|
|
except the cursor
|
|
* `PrimaryCursor`: cursor of the primary selection
|
|
* `SecondaryCursor`: cursor of the secondary selection
|
|
* `LineNumbers`: face used by the number_lines highlighter
|
|
* `LineNumberCursor`: face used to highlight the line number of the main
|
|
selection
|
|
* `LineNumbersWrapped`: face used to highlight the line number of wrapped
|
|
lines
|
|
* `MenuForeground`: face for the selected element in menus
|
|
* `MenuBackground`: face for the not selected elements in menus
|
|
* `Information`: face for the information windows and information messages
|
|
* `Error`: face of error messages
|
|
* `StatusLine`: face used for the status line
|
|
* `StatusCursor`: face used for the status line cursor
|
|
* `Prompt`: face used prompt displayed on the status line
|
|
* `MatchingChar`: face used by the show_matching highlighter
|
|
* `Search`: face used to highlight search results
|
|
* `BufferPadding`: face applied on the characters that follow the last line of a buffer
|
|
* `Whitespace`: face used by the show_whitespaces highlighter
|
|
|
|
Advanced topics
|
|
---------------
|
|
|
|
Registers
|
|
~~~~~~~~~
|
|
|
|
Registers are named lists of text. They are used for various purposes, like
|
|
storing the last yanked text, or the captured groups associated with the
|
|
selections.
|
|
|
|
Yanking and pasting uses the register `"`, however most commands using a register
|
|
can have their default register overridden by using the `"` key followed by the
|
|
register. For example `"sy` will yank (`y` command) in the `s` register. `"sp`
|
|
will paste from the `s` register.
|
|
|
|
While in insert mode or in a prompt, `<c-r>` followed by a register name
|
|
(one character) inserts it.
|
|
|
|
For example, `<c-r>` followed by " will insert the currently yanked text.
|
|
`<c-r>` followed by 2 will insert the second capture group from the last regex
|
|
selection.
|
|
|
|
Registers are lists, instead of simply text in order to interact well with
|
|
multiselection. Each selection has its own captures or yank buffer.
|
|
|
|
Alternate names
|
|
^^^^^^^^^^^^^^^
|
|
|
|
Non alphanumeric registers have an alternative name that can be used
|
|
in contexts where only alphanumeric identifiers are possible.
|
|
|
|
Special registers
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
Some registers are not general purposes, they cannot be written to, but they
|
|
contain some special data:
|
|
|
|
* `%` (`percent`): current buffer name
|
|
* `.` (`dot`): current selection contents
|
|
* `#` (`hash`): selection indices (first selection has 1, second has 2, ...)
|
|
* `_` (`underscore`): null register, always empty
|
|
* `:` (`colon`): last entered command
|
|
|
|
Default registers
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
Most commands using a register default to a specific one if not specified:
|
|
|
|
* `"` (`dquote`): default yank register, used by yanking and pasting commands like `y`, `p` and `R`
|
|
* `/` (`slash`): default search register, used by regex based commands like `s`, `*` or `/`
|
|
* `@` (`arobase`): default macro register, used by `q` and `Q`
|
|
* `^` (`caret`): default mark register, used by `z` and `Z`
|
|
* `|` (`pipe`): default shell command register, used by command that spawn a subshell such as `|`, `<a-|>`, `!` or `<a-!>`
|
|
|
|
Macros
|
|
~~~~~~
|
|
|
|
Kakoune can record and replay a sequence of key presses.
|
|
|
|
Macros are recorded with the `Q` key, and are stored by default in the `@`
|
|
register. Another register can be chosen by with hitting `"<reg>` before
|
|
the `Q` key.
|
|
|
|
To replay a macro, use the `q` key.
|
|
|
|
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 the current selection
|
|
begins and/or ends at word boundaries and set the search pattern accordingly.
|
|
|
|
With `<a-*>` you can set the search pattern to the current selection without
|
|
Kakoune trying to be smart.
|
|
|
|
Regex syntax
|
|
~~~~~~~~~~~~
|
|
|
|
The regex syntax supported by Kakoune is the Perl syntax currently provided
|
|
by Boost :
|
|
http://www.boost.org/doc/libs/release/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html[Perl Regular Expression Syntax].
|
|
|
|
Exec and Eval
|
|
~~~~~~~~~~~~~
|
|
|
|
The `:exec` and `:eval` commands can be used for running Kakoune commands.
|
|
`:exec` runs keys as if they were pressed, whereas `:eval` executes its given
|
|
parameters as if they were entered in the command prompt. By default,
|
|
they do their execution in the context of the current client.
|
|
|
|
These two commands also save the following registers, who are then restored
|
|
when the commands have been executed: `/`, `"`, `|`, `^`, `@`.
|
|
|
|
Some parameters provide a way to change the context of execution:
|
|
|
|
* `-client <name>`: execute in the context of the client named <name>
|
|
* `-try-client <name>`: execute in the context of the client named
|
|
<name> if such client exists, or else in the current context.
|
|
* `-draft`: execute in a copy of the context of the selected client
|
|
modifications to the selections or input state will not affect
|
|
the client. This permits to make some modification to the buffer
|
|
without modifying the user's selection.
|
|
* `-itersel` (requires `-draft`): execute once per selection, in a
|
|
context with only the considered selection. This permits avoiding
|
|
cases where the selections may get merged.
|
|
* `-buffer <names>`: execute in the context of each buffers in the
|
|
comma separated list <names>, '*' as a name can be used to iterate
|
|
on all buffers.
|
|
* `-no-hooks`: disable hook execution while executing the keys/commands
|
|
* `-with-maps`: use user key mapping in `:exec` instead of built in keys.
|
|
* `-save-regs <regs>`: regs is a string of registers to be restored after
|
|
execution (overwrites the list of registers saved by default)
|
|
|
|
The execution stops when the last key/command is reached, or an error
|
|
is raised.
|
|
|
|
Key parameters get concatenated, so the following commands are equivalent:
|
|
|
|
----------------------
|
|
:exec otest<space>1
|
|
:exec o test <space> 1
|
|
----------------------
|
|
|
|
Insert mode completion
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Kakoune can propose completions while inserting text, the `completers` option
|
|
controls automatic completion, which kicks in when a certain idle timeout is
|
|
reached (100 milliseconds). Insert mode completion can be explicitly triggered
|
|
using `<c-x>`, followed, by:
|
|
|
|
* *f* : filename completion
|
|
* *w* : buffer word completion
|
|
* *l* : buffer line completion
|
|
|
|
Completion candidates can be selected using `<c-n>` and `<c-p>`.
|
|
|
|
Escape to normal mode
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
From insert mode, pressing `<a-;>` allows you to execute a single normal mode
|
|
command. This provides a few advantages:
|
|
|
|
* The selections are not modified: when leaving insert mode using `<esc>` the
|
|
selections can change, for example when insert mode was entered with `a` the
|
|
cursor will go back one char. Or if on an end of line the cursor will go back
|
|
left (if possible).
|
|
|
|
* The modes are nested: that means the normal mode can enter prompt (with `:`),
|
|
or any other modes (using `:on-key` or `:menu` for example), and these modes
|
|
will get back to the insert mode afterwards.
|
|
|
|
This feature is tailored for scripting/macros, as it provides a more predictable
|
|
behaviour than leaving insert mode with `<esc>`, executing normal mode command
|
|
and entering back insert mode (with which binding ?)
|
|
|
|
Highlighters
|
|
~~~~~~~~~~~~
|
|
|
|
Manipulation of the displayed text is done through highlighters, which can be added
|
|
or removed with the command
|
|
|
|
---------------------------------------------------------------
|
|
:add-highlighter <highlighter_name> <highlighter_parameters...>
|
|
---------------------------------------------------------------
|
|
|
|
and
|
|
|
|
------------------------------------
|
|
:remove-highlighter <highlighter_id>
|
|
------------------------------------
|
|
|
|
`highlighter_id` is a name generated by the highlighter specified with `highlighter_name`,
|
|
possibly dependent on the parameters. Use command completion on remove-highlighter to see the existing
|
|
highlighters' id.
|
|
|
|
General highlighters are:
|
|
|
|
* `regex <ex> <capture_id>:<face>...`: highlight a regex, takes the regex as
|
|
first parameter, followed by any number of face parameters.
|
|
For example: `:add-highlighter regex //\h*(TODO:)[^\n]* 0:cyan 1:yellow,red`
|
|
will highlight C++ style comments in cyan, with an eventual 'TODO:' in
|
|
yellow on red background.
|
|
* `dynregex`: Similar to regex, but expand (like a command parameter would) the
|
|
given expression before building a regex from the result.
|
|
* `flag_lines <face> <option_name>`: add a column in front of the buffer,
|
|
and display the flags specified in <option_name>, using <face>
|
|
* `show_matching`: highlight matching char of the character under the selections'
|
|
cursor using `MatchingChar` face.
|
|
* `show_whitespaces \<-tab <separator> \<-tabpad <separator> \<-lf <separator> \<-spc <separator> \<-nbsp <separator>`: display symbols on top of whitespaces to make them more explicit using the Whitespace face.
|
|
* `number_lines \<-relative> \<-hlcursor> \<-separator <separator text>`: show line numbers.
|
|
The -relative switch will show line numbers relative to the main cursor line, the
|
|
-hlcursor switch will highlight the cursor line with a separate face. With the
|
|
-separator switch one can specify a string to separate the line numbers column with
|
|
the rest of the buffer, default is `|`.
|
|
* `wrap \<-word> \<-width <max_width>`: Soft wrap buffer content to the smallest of window width and
|
|
max_width. Wrap at word boundaries if `-word` is specified.
|
|
* `fill <face>`: fill using given face, mostly useful with <<regions-highlighters,Regions highlighters>>
|
|
* `ranges <option_name>`: use the data in the range-specs option of the given name to highlight the buffer.
|
|
The string part of the is interpretted as a face to apply to the range.
|
|
* `replace-ranges <option_name>`: use the data in the range-specs option of the given name to highlight the buffer.
|
|
The string part of the is interpretted as a display line to display in place of the range.
|
|
* `column <number> <face>`: highlight column 'number' with the given face
|
|
* `line <number> <face>`: highlight line 'number' with the given face
|
|
|
|
Highlighting Groups
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
The `group` highlighter is a container for other highlighters. You can add
|
|
a group to the current window using
|
|
|
|
----------------------------
|
|
add-highlighter group <name>
|
|
----------------------------
|
|
|
|
and then the `-group` switch of `add-highlighter` provides a mean to add highlighters
|
|
inside this group.
|
|
|
|
------------------------------------------------
|
|
add-highlighter -group <name> <type> <params>...
|
|
------------------------------------------------
|
|
|
|
Groups can contain other groups, the `-group` switch can be used to define a path.
|
|
|
|
----------------------------------------------------------
|
|
add-highlighter -group <name> group <subname>
|
|
add-highlighter -group <name>/<subname> <type> <params>...
|
|
----------------------------------------------------------
|
|
|
|
[[regions-highlighters]]
|
|
Regions highlighters
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
A special highlighter provides a way to segment the buffer into regions, which are
|
|
to be highlighted differently.
|
|
|
|
A region is defined by 4 parameters:
|
|
|
|
------------------------------------
|
|
<name> <opening> <closing> <recurse>
|
|
------------------------------------
|
|
|
|
`name` is user defined, `opening`, `closing` and `recurse` are regexes.
|
|
|
|
* `opening` defines the region start text
|
|
* `closing` defines the region end text
|
|
* `recurse` defines the text that matches recursively an end token into the region.
|
|
|
|
`recurse` is useful for regions that can be nested, for example the `%sh{ ... }`
|
|
construct in kakoune accept nested `{ ... }` so `%sh{ ... { ... } ... }` is valid.
|
|
This region can be defined with:
|
|
|
|
------------------------
|
|
shell_expand %sh\{ \} \{
|
|
------------------------
|
|
|
|
Regions are used in the `regions` highlighter which can take any number
|
|
of regions.
|
|
|
|
---------------------------------------------------------------------------------
|
|
add-highlighter regions <name> <region_name1> <opening1> <closing1> <recurse1> \
|
|
<region_name2> <opening2> <closing2> <recurse2>...
|
|
---------------------------------------------------------------------------------
|
|
|
|
The above command defines multiple regions in which other highlighters can be added as follows:
|
|
|
|
-----------------------------------------------
|
|
add-highlighter -group <name>/<region_name> ...
|
|
-----------------------------------------------
|
|
|
|
Regions are matched using the left-most rule: the left-most region opening starts
|
|
a new region. When a region closes, the closest next opening start another region.
|
|
|
|
That matches the rule governing most programming language parsing.
|
|
|
|
`regions` also supports a `-default <default_region>` switch to define the
|
|
default region, when no other region matches the current buffer range.
|
|
|
|
Most programming languages can then be properly highlighted using a `regions`
|
|
highlighter as root:
|
|
|
|
-----------------------------------------------------------------
|
|
add-highlighter regions -default code <lang> \
|
|
string <str_opening> <str_closing> <str_recurse> \
|
|
comment <comment_opening> <comment_closing> <comment_recurse>
|
|
|
|
add-highlighter -group <lang>/code ...
|
|
add-highlighter -group <lang>/string ...
|
|
add-highlighter -group <lang>/comment ...
|
|
-----------------------------------------------------------------
|
|
|
|
Shared Highlighters
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
Highlighters are often defined for a specific filetype, and it makes then sense to
|
|
share the highlighters between all the windows on the same filetypes.
|
|
|
|
A shared highlighter can be defined with the `:add-highlighter` command
|
|
|
|
----------------------------------------
|
|
add-highlighter -group /<group_name> ...
|
|
----------------------------------------
|
|
|
|
When the group switch values starts with a '/', it references a group in the
|
|
shared highlighters, rather than the window highlighters.
|
|
|
|
The common case would be to create a named shared group, and then fill it
|
|
with highlighters:
|
|
|
|
--------------------------------------
|
|
add-highlighter -group / group <name>
|
|
add-highlighter -group /name regex ...
|
|
--------------------------------------
|
|
|
|
It can then be referenced in a window using the `ref` highlighter.
|
|
|
|
--------------------------
|
|
add-highlighter ref <name>
|
|
--------------------------
|
|
|
|
The `ref` can reference any named highlighter in the shared namespace.
|
|
|
|
Hooks
|
|
~~~~~
|
|
|
|
Commands can be registered to be executed when certain events arise.
|
|
To register a hook use the hook command.
|
|
|
|
-----------------------------------------------------------------------
|
|
:hook [-group <group>] <scope> <hook_name> <filtering_regex> <commands>
|
|
-----------------------------------------------------------------------
|
|
|
|
`<scope>` can be either global, buffer or window (or any of their prefixes).
|
|
Scopes are hierarchical, meaning that a Window calling a hook will
|
|
execute its own, the buffer ones and the global ones.
|
|
|
|
`<command>` is a string containing the commands to execute when the hook is
|
|
called.
|
|
|
|
For example to automatically use line numbering with .cc files,
|
|
use the following command:
|
|
|
|
---------------------------------------------------------------
|
|
:hook global WinCreate .*\.cc %{ add-highlighter number_lines }
|
|
---------------------------------------------------------------
|
|
|
|
If `<group>` is given, make this hook part of the named group. groups
|
|
are used for removing hooks with the `remove-hooks` command:
|
|
|
|
----------------------------
|
|
remove-hooks <scope> <group>
|
|
----------------------------
|
|
|
|
The above remove every hooks in `<scope>` that are part of the given group.
|
|
|
|
Existing hooks are:
|
|
|
|
* `NormalIdle`: A certain duration has passed since last key was pressed in
|
|
normal mode.
|
|
* `NormalBegin`: Entering normal mode
|
|
* `NormalEnd`: Leaving normal mode
|
|
* `NormalKey`: A key is received in normal mode, the key is used for filtering
|
|
* `InsertIdle`: A certain duration has passed since last key was pressed in
|
|
insert mode.
|
|
* `InsertBegin`: Entering insert mode
|
|
* `InsertEnd`: Leaving insert mode
|
|
* `InsertKey`: A key is received in insert mode, the key is used for filtering
|
|
* `InsertChar`: A character is inserted in insert mode, the character is used
|
|
for filtering
|
|
* `InsertDelete`: A character is deleted in insert mode, the character deleted
|
|
by the main selection is used for filtering
|
|
* `InsertMove`: The cursor moved (without inserting) in insert mode, the key
|
|
that triggered the move is used for filtering
|
|
* `PromptIdle`: A certain duration has passed since last key was pressed in
|
|
prompt mode.
|
|
* `WinCreate`: A window was created, the filtering text is the buffer name
|
|
* `WinClose`: A window was destroyed, the filtering text is the buffer name
|
|
* `WinDisplay`: A window was bound a client, the filtering text is the buffer
|
|
name
|
|
* `WinResize`: A window resized, the filtering text is '<line>.<column>'
|
|
* `WinSetOption`: An option was set in a window context, the filtering text
|
|
is '<option_name>=<new_value>'
|
|
* `BufSetOption`: An option was set in a buffer context, the filtering text
|
|
is '<option_name>=<new_value>'
|
|
* `BufNewFile`: A buffer for a new file has been created, filename is used
|
|
for filtering
|
|
* `BufOpenFile`: A buffer for an existing file has been created, filename is
|
|
used for filtering
|
|
* `BufCreate`: A buffer has been created, filename is used for filtering
|
|
* `BufWritePre`: Executed just before a buffer is written, filename is
|
|
used for filtering.
|
|
* `BufWritePost`: Executed just after a buffer is written, filename is
|
|
used for filtering.
|
|
* `BufClose`: Executed when a buffer is deleted, while it is still valid.
|
|
* `BufOpenFifo`: Executed when a buffer opens a fifo.
|
|
* `BufReadFifo`: Executed after some data has been read from a fifo and
|
|
inserted in the buffer.
|
|
* `BufCloseFifo`: Executed when a fifo buffer closes its fifo file descriptor
|
|
either because the buffer is being deleted, or because the writing
|
|
end has been closed.
|
|
* `RuntimeError`: an error was encountered while executing a user command
|
|
the error message is used for filtering
|
|
* `KakBegin`: Kakoune started, this is called just after reading the user
|
|
configuration files
|
|
* `KakEnd`: Kakoune is quitting.
|
|
* `FocusIn`: On supported clients, triggered when the client gets focused.
|
|
The filtering text is the client name.
|
|
* `FocusOut`: On supported clients, triggered when the client gets unfocused.
|
|
The filtering text is the client name.
|
|
* `InsertCompletionShow`: Triggered when the insert completion menu gets
|
|
displayed.
|
|
* `InsertCompletionHide`: Triggered when the insert completion menu gets
|
|
hidden.
|
|
* `RawKey`: Triggered whenever a key is pressed by the user, the key is
|
|
used for filtering.
|
|
|
|
When not specified, the filtering text is an empty string.
|
|
|
|
Key Mapping
|
|
~~~~~~~~~~~
|
|
|
|
You can redefine a key's meaning using the map command:
|
|
|
|
--------------------------------
|
|
:map <scope> <mode> <key> <keys>
|
|
--------------------------------
|
|
|
|
`scope` can be one of `global`, `buffer` or `window` (or any prefix),
|
|
mode one of `insert`, `normal`, `prompt`, `menu` or `user` (or any prefix),
|
|
`key` a single key name and `keys` a list of keys.
|
|
|
|
`user` mode allows for user mapping behind the `,` key. Keys will be
|
|
executed in normal mode.
|
|
|
|
An optional *-docstring* switch followed by a string can be used to
|
|
describe what the mapping does. This docstring will be used in autoinfo
|
|
boxes.
|
|
|
|
Mappings can be removed with the unmap command
|
|
|
|
----------------------------------------
|
|
:unmap <scope> <mode> <key> [<expected>]
|
|
----------------------------------------
|
|
|
|
If `<expected>` is specified, unmapping will only proceed if the current
|
|
mapping matches the expected keys.
|
|
|
|
Defining Commands
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
New commands can be defined using the `:def` command.
|
|
|
|
------------------------------
|
|
:def <command_name> <commands>
|
|
------------------------------
|
|
|
|
`<commands>` is a string containing the commands to execute.
|
|
|
|
`def` can also take some flags:
|
|
|
|
* `-params <num>`: the command accept <num> parameters, with <num>
|
|
either a number, or of the form <min>..<max>, with both <min> and
|
|
<max> omittable.
|
|
* `-file-completion`: try file completion on any parameter passed
|
|
to this command
|
|
* `-client-completion`: try client name completion on any parameter
|
|
passed to this command
|
|
* `-buffer-completion`: try buffer name completion on any parameter
|
|
passed to this command
|
|
* `-shell-completion`: following string is a shell command which takes
|
|
parameters as positional params and output one completion candidate
|
|
per line.
|
|
* `-allow-override`: allow the new command to replace an existing one
|
|
with the same name.
|
|
* `-hidden`: do not show the command in command name completions
|
|
* `-docstring`: define the documentation string for the command
|
|
|
|
Using shell expansion permits defining complex commands or accessing
|
|
Kakoune state:
|
|
|
|
------------------------------------------------------
|
|
:def print_selection %{ echo %sh{ ${kak_selection} } }
|
|
------------------------------------------------------
|
|
|
|
Some helper commands can be used to define composite commands:
|
|
|
|
* `prompt <prompt> <command>`: prompt the user for a string, when the user validates,
|
|
executes <command>. The entered text is available in the `text` value
|
|
accessible through `$kak_text` in shells or `%val{text}` in commands.
|
|
* `on-key <command>`: wait for next key from user, then execute <command>,
|
|
the key is available through the `key` value, accessible through `$kak_key`.
|
|
* `menu <label1> <commands1> <label2> <commands2>...`: display a menu using
|
|
labels, the selected label's commands are executed.
|
|
`menu` can take a -auto-single argument, to automatically run commands
|
|
when only one choice is provided. And a -select-cmds argument, in which
|
|
case menu takes three argument per item, the last one being a command
|
|
to execute when the item is selected (but not validated).
|
|
* `info <text>`: display text in an information box, at can take a -anchor
|
|
option, which accepts `left`, `right` and `cursor` as value, in order to
|
|
specify where the info box should be anchored relative to the main selection.
|
|
* `try <commands> catch <on_error_commands>`: prevent an error in <commands>
|
|
from aborting the command execution, execute <on_error_commands>
|
|
instead. If nothing is to be done on error, the catch part can be ommitted.
|
|
* `reg <name> <content>`: set register <name> to <content>
|
|
* `select <anchor_line>.<anchor_column>,<cursor_line>.<cursor_column>:...`:
|
|
replace the current selections with the one described in the argument
|
|
* `debug {info,buffers,options,memory,shared-strings,profile-hash-maps,faces}`:
|
|
print some debug information in the `*debug*` buffer
|
|
|
|
Note that these commands are available in interactive command mode, but are
|
|
not that useful in this context.
|
|
|
|
Aliases
|
|
~~~~~~~
|
|
|
|
With `:alias` commands can be given additional names. Aliases are scoped, so
|
|
that an alias can refer to one command for a buffer, and to another for another
|
|
buffer. The following command defines `<alias>` as an alias for `<command>`:
|
|
|
|
--------------------------------
|
|
:alias <scope> <alias> <command>
|
|
--------------------------------
|
|
|
|
`<scope>` can be one of `global`, `buffer` or `window`.
|
|
|
|
-------------------------------------
|
|
:unalias <scope> <alias> [<expected>]
|
|
-------------------------------------
|
|
|
|
Will remove the given alias in the given scope. If `<expected>` is specified
|
|
the alias will only be removed if its current value is `<expected>`.
|
|
|
|
FIFO Buffer
|
|
~~~~~~~~~~~
|
|
|
|
The `:edit` command can take a `-fifo` parameter:
|
|
|
|
---------------------------------------------
|
|
:edit -fifo <filename> [-scroll] <buffername>
|
|
---------------------------------------------
|
|
|
|
In this case, a buffer named `<buffername>` is created which reads its content
|
|
from fifo `<filename>`. When the fifo is written to, the buffer is automatically
|
|
updated.
|
|
|
|
If the `-scroll` switch is specified, the initial cursor position will be made
|
|
such as the window displaying the buffer will scroll as new data is read.
|
|
|
|
This is very useful for running some commands asynchronously while displaying
|
|
their result in a buffer. See `rc/make.kak` and `rc/grep.kak` for examples.
|
|
|
|
When the buffer is deleted, the fifo will be closed, so any program writing
|
|
to it will receive `SIGPIPE`. This is useful as it permits to stop the writing
|
|
program when the buffer is deleted.
|
|
|
|
Menus
|
|
~~~~~
|
|
|
|
When a menu is displayed, you can use `j`, `<c-n>` or `<tab>` to select the next
|
|
entry, and `k`, `<c-p>` or `<shift-tab>` to select the previous one.
|
|
|
|
Using the `/` key, you can enter some regex in order to restrict available choices
|
|
to the matching ones.
|