Skip to content
Adria Arrufat edited this page Nov 28, 2022 · 17 revisions

How to select all occurrences of the main selection?

map global user a '*%s<ret>' -docstring 'select all'

Explanation

  • * puts the content of the main selection in the search register /
  • % selects the whole buffer
  • s opens a prompt waiting for a regex which will be used to make sub-selections. If nothing is entered and the prompt is validated with <ret>, the content of the search register is used by default.

Movements

How to make x select lines downward and X select lines upward?

more here

def -params 1 extend-line-down %{
  exec "<a-:>%arg{1}X"
}
def -params 1 extend-line-up %{
  exec "<a-:><a-;>%arg{1}K<a-;>"
  try %{
    exec -draft ';<a-K>\n<ret>'
    exec X
  }
  exec '<a-;><a-X>'
}
map global normal x ':extend-line-down %val{count}<ret>'
map global normal X ':extend-line-up %val{count}<ret>'

Also checkout the vertical-selection plugin

How to make word keys discern camelCase or snake_case parts?

so when you want to select the word - you select it like a text-object, more here

def -hidden select-prev-word-part %{
  exec <a-/>[A-Z][a-z]+|[A-Z]+|[a-z]+<ret>
}
def -hidden select-next-word-part %{
  exec /[A-Z][a-z]+|[A-Z]+|[a-z]+<ret>
}
def -hidden extend-prev-word-part %{
  exec <a-?>[A-Z][a-z]+|[A-Z]+|[a-z]+<ret>
}
def -hidden extend-next-word-part %{
  exec ?[A-Z][a-z]+|[A-Z]+|[a-z]+<ret>
}
map global normal w :select-next-word-part<ret>
map global normal W :extend-next-word-part<ret>

See: https://github.com/delapouite/kakoune-hump

Mapping (transforming the content of each selection)

How to convert between common case conventions?

# foo_bar → fooBar
# foo-bar → fooBar
# foo bar → fooBar
def camelcase %{
  exec '`s[-_<space>]<ret>d~<a-i>w'
}

# fooBar → foo_bar
# foo-bar → foo_bar
# foo bar → foo_bar
def snakecase %{
  exec '<a-:><a-;>s-|[a-z][A-Z]<ret>;a<space><esc>s[-\s]+<ret>c_<esc><a-i>w`'
}

# fooBar → foo-bar
# foo_bar → foo-bar
# foo bar → foo-bar
def kebabcase %{
  exec '<a-:><a-;>s_|[a-z][A-Z]<ret>;a<space><esc>s[_\s]+<ret>c-<esc><a-i>w`'
}

See https://gitlab.com/FlyingWombat/case.kak

How to sort lines?

Pipe your selection into sort: |sort<ret> You can also deduplicate with the uniq command or reverse the letters of a word with rev using similar strategies.

How to prepend lines with their number?

To go from

foo
bar
qux

to

1foo
2bar
3qux

Make one selection per line (with <a-s> for instance), enter insert mode with I to move cursors at the beginning of each line and insert the content of the index register with <c-r>#.

Filtering (reducing the number of multiple selections)

How to keep selections which have more than 10 chars?

First solution using the keep regex primitive <a-k>:

<a-k>.{10,}

Second solution using the $ primitive. In this particular case it's longer to type but it's more generic and powerful since you can construct predicates based on any value:

$[ ${#kak_selection} -gt 10 ]<ret>

Here we use a combination of the shell test command [ and the # operator in the var expansion.

How to keep selection based on their index?

The following snippet keeps only "even" selections. So if you have 6 selections, it only keeps selection 2, 4 and 6 :

$[ $((kak_main_reg_hash % 2)) -eq 0 ]<ret>

Here we use a combination of the shell test command [ and the (()) shell arithmetic command.

Design more complex filters by using small wrappers in python or lua: https://discuss.kakoune.com/t/filter-your-selections-more-easily/1296

How to select the smallest single selection containing every selection?

def selection-hull %{
  eval -save-regs 'abc' %{
    exec '"aZ' '<space>"bZ' '"az<a-space>"cZ'
    eval -itersel %{ exec '"b<a-Z>u' }
    exec '"bz'
  }
}

See Also

Plugins dealing with selections :

  • vertical-selection copy the current selection up and downwards to all lines matching the current selection.
  • phantom-selection interactively iterate over the current selections one by one.
  • select-view select the visible part of a buffer.
  • auto-percent enhance some primitives with bigger selections
Clone this wiki locally