# I wrote a (hopefully) complete guide to writing your first kakrc

**URL:** <https://discuss.kakoune.com/t/i-wrote-a-hopefully-complete-guide-to-writing-your-first-kakrc/2214>\
**Category:** Resources\
**Created:** [April 23, 2023, 12:24am UTC](https://discuss.kakoune.com/t/i-wrote-a-hopefully-complete-guide-to-writing-your-first-kakrc/2214 "2023-04-23T00:24:02Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![Screwtapello](https://discuss.kakoune.com/user_avatar/discuss.kakoune.com/screwtapello/32/12_2.png) [@Screwtapello](https://discuss.kakoune.com/u/Screwtapello)\
**Post date:** [April 23, 2023, 7:50am UTC](https://discuss.kakoune.com/t/i-wrote-a-hopefully-complete-guide-to-writing-your-first-kakrc/2214/2 "2023-04-23T07:50:37Z")

</div>

Congratulations on making the switch, and thank you for taking the time to write about your experiences. Kakoune has a lot of documentation, but most of it’s reference material rather than tutorials, and it’s good to have instructions written by different people from different points of view.

I did see a few minor things I wanted to point out for completeness, though. I hope these can help you (and other people reading your article) understand Kakoune a little better.

> When ran, `kak` will search for a `kakrc` file in your configuration folder (usually `~/.config/kak/kakrc`), and load it up. Then, `kak` will search for the autoload folder(s) and recursively load all `.kak` files in it.

Actually, it’s the other way around: Kakoune loads the autoload contents _first_ and the `kakrc` file _last_, so that your `kakrc` can set any configuration for your plugins as well as configuration for Kakoune’s standard features.

> The `global` scope refers to every instance of `kak` currently running.

This is not entirely correct. Each UNIX user account on a given system can have multiple Kakoune “sessions” (listed in the output of `kak -l`), and each session can have multiple “clients” (launched with `:new` from inside Kakoune, or launched with `kak -c sessionname` from a terminal).

If you open a terminal, start `kak` and then do `:set-option global scrolloff 10` then it will be set for every client attached to that session, but it won’t affect clients attached to any other sessions that happen to be running.

If you put that command in your `kakrc` then it will affect every session you start _from then on_, but that’s not quite the same thing.

> The more astute among you may have noticed that the commands in that mapping have a space separating the : colon and the actual command. In Kakoune we do this when we don’t want the command saved in the history (access the history by typing : and pressing the up/down arrows).

I’m not sure it’s in the most recent stable version (yet) but at least the next version of Kakoune does not include commands typed by mappings or by `execute-keys` in the interactive command history, whether or not there’s a leading space.

> And one more
> 
> ```
> map -docstring "copy to system pboard" global user y ': nop %sh{printf "%s" "$kak_selection" | pbcopy}<ret>'
> 
> ```

A cleaner way to do this might be:

```
map -docstring "copy to system pboard" global user y '<a-|> pbcopy<ret>'

```

The difference is that the original version only copies the main selection to the clipboard, but it breaks if you have selected more text than can fit in an environment variable. The second version copies each selection to the clipboard one-by-one (so only the last selection will remain) but it should work even with very large selections.

You could also do:

```
map -docstring "copy to system pboard" global user y ': execute-keys -draft ",<a-|> pbcopy<lt>ret<gt>" <ret>'

```

- `execute-keys` takes a sequences of keys to press, just like the right-hand side of a mapping
- `-draft` (which is not available for mappings) causes the keys to be executed in a “draft context” which is somewhat hazily defined, but in this case means that any changes to which text is selected will be automatically undone when `execute-keys` finishes
- `,` drops all selections but the main one, so that they won’t be uselessly piped to `pbcopy`
- `<lt>ret<gt>` means that the mapping will type those literal keys, so that `execute-keys` will interpret them as an instruction to press Return.

> Here’s my `save-buffer` command:
> 
> ```
> ...
> info 'file saved at %sh{date}'
> ...
> 
> ```

Like shell, Kakoune does not expand things inside single quotes. You’ll want double-quotes instead:

```
info "file saved at %sh{date}"

```

> Another hook I have enabled is soft-wrapping text in `.md` files.
> 
> ```
> ...
> add-highlighter -override global/ wrap -word
> ...
> 
> ```

If you want to do the “automatically remove highlighters when the filetype changes” trick, you should explicitly name the highlighters you create, since Kakoune doesn’t guarantee any particular naming scheme. The current version of Kakoune will name this highlighter `global/wrap_-word` but the nested hook tries to remove `global/wrap` which probably doesn’t exist. Additionally, it’s not a good idea to set things at the global scope from within a Window hook - you could mess up things in other windows, or other buffers in this window. I recommend something like:

```
add-highlighter -override window/markdown-wrap wrap -word

```

Then you can remove it later with:

```
remove-highlighter window/markdown-wrap

```

I hope that all helps!

---

_[View the full topic](https://discuss.kakoune.com/t/i-wrote-a-hopefully-complete-guide-to-writing-your-first-kakrc/2214)._
