- Notifications
You must be signed in to change notification settings - Fork750
zsh zle
matthias-hmb edited this pageOct 2, 2022 ·13 revisions
The Kakoune mode forzsh uses the vi (visual) mode of the zsh to emulate Kakoune select and edit mode.
How to use:
- put the snippet directly into .zshrc
- source it from .zshrc (. /home/user/.zsh/kak.zsh )
- put it in ${FPATH}/kakinit and load it in .zshrc (autoload -U kakinit; kakinit)
Recommendation to change the selection highlighter:
zle_highlight=(region:bg=BACKGROUND_COLOR,fg=COLOR)
more info in zshzle.1 man page
To open the command-line directly in Kakoune for editing, ^V is set in cmd mode (end of snippet):
bindkey -M vicmd '^V' edit-command-line
load the snippet from your ~/.zshrc
# kak mode for zsh#emulate -L zsh# use instead of up/down-line-or-history autoload -Uz up-line-or-beginning-search down-line-or-beginning-searchzle -N up-line-or-beginning-searchzle -N down-line-or-beginning-search# switch to vi (kak) modebindkey -v# bindkey - visual# don't use visual keymap - only visual modebindkey -N visual# commonkak-remove-visual() { test 1 -eq ${REGION_ACTIVE} && zle visual-mode}zle -N kak-remove-visualkak-reset-visual() { # restart, if already active zle kak-remove-visual zle visual-mode}zle -N kak-reset-visualkak-accept-line() { zle kak-remove-visual zle accept-line}zle -N kak-accept-line# viinskak-cmd-mode() { zle vi-cmd-mode zle kak-reset-visual}zle -N kak-cmd-mode# bindkey - viins# reuse viins keymapbindkey -M viins "^J" kak-accept-linebindkey -M viins "^L" clear-screenbindkey -M viins "^M" kak-accept-linebindkey -M viins "^N" menu-completebindkey -M viins "^P" reverse-menu-completebindkey -M viins "^[" kak-cmd-mode# vicmd# history (search)kak-down-line() { # default is just history, not search #zle down-line-or-history zle down-line-or-beginning-search zle vi-end-of-line zle kak-reset-visual}zle -N kak-down-linekak-up-line() { # default is just history, not search #zle up-line-or-history zle up-line-or-beginning-search zle vi-end-of-line zle kak-reset-visual}zle -N kak-up-line# indent (4 spaces)kak-indent() { CS=${CURSOR} BUFFER=" ${BUFFER}" CURSOR=$(( ${CS} + 4 )) zle kak-reset-visual}zle -N kak-indentkak-unindent() { CS=${CURSOR} BS=${#BUFFER} BUFFER="${BUFFER# }" test "${BS}" = "${#BUFFER}" || CURSOR=$(( ${CS} - 4 )) zle kak-reset-visual}zle -N kak-unindent# forward direction for selectionkak-mark-point() { test ${CURSOR} -lt ${MARK} && zle exchange-point-and-mark}zle -N kak-mark-pointkak-repeat-find() { zle kak-reset-visual zle vi-repeat-find}zle -N kak-repeat-find# swap casekak-up-case() { C=${CURSOR} M=${MARK} zle vi-up-case zle kak-reset-visual MARK=${M} CURSOR=${C}}zle -N kak-up-casekak-down-case() { C=${CURSOR} M=${MARK} zle vi-down-case zle kak-reset-visual MARK=${M} CURSOR=${C}}zle -N kak-down-case# delete/yank/append/insert/pastekak-delete() { zle vi-delete zle kak-reset-visual}zle -N kak-deletekak-yank() { M=${MARK} zle vi-yank zle kak-reset-visual MARK=${M}}zle -N kak-yankkak-add-eol() { zle kak-remove-visual zle vi-add-eol}zle -N kak-add-eolkak-insert-bol() { zle kak-remove-visual zle vi-insert-bol}zle -N kak-insert-bolkak-insert() { zle kak-remove-visual zle vi-insert}zle -N kak-insertkak-add-next() { zle kak-remove-visual zle vi-add-next}zle -N kak-add-nextkak-put-before() { CS=${CURSOR} zle vi-put-before zle kak-reset-visual MARK=${CS}}zle -N kak-put-beforekak-put-after() { CS=${CURSOR} zle vi-put-after zle kak-reset-visual MARK=$(( ${CS} + 1 ))}zle -N kak-put-after# line beginn/endkak-beginning-of-line() { zle vi-beginning-of-line zle kak-reset-visual}zle -N kak-beginning-of-linekak-first-non-blank() { zle vi-first-non-blank zle kak-reset-visual}zle -N kak-first-non-blankkak-end-of-line() { zle vi-end-of-line zle kak-reset-visual}zle -N kak-end-of-line# cursor charkak-backward-char() { zle vi-backward-char zle kak-reset-visual}zle -N kak-backward-charkak-forward-char() { zle vi-forward-char zle kak-reset-visual}zle -N kak-forward-char# cursor wordkak-backward-word() { if test 1 -lt ${NUMERIC:-0}; then zle vi-backward-word -n $(( ${NUMERIC} - 1 )) fi zle kak-reset-visual zle vi-backward-word -n 1 CS=${CURSOR} MS=${MARK} zle vi-forward-word -n 1 test ${MS} -eq ${CURSOR} && MARK=$(( ${CURSOR} - 1 )) || MARK=${MS} CURSOR=${CS}}zle -N kak-backward-wordkak-backward-blank-word() { if test 1 -lt ${NUMERIC:-0}; then zle vi-backward-blank-word -n $(( ${NUMERIC} - 1 )) fi zle kak-reset-visual zle vi-backward-blank-word -n 1 CS=${CURSOR} MS=${MARK} zle vi-forward-blank-word -n 1 test ${MS} -eq ${CURSOR} && MARK=$(( ${CURSOR} - 1 )) || MARK=${MS} CURSOR=${CS}}zle -N kak-backward-blank-wordkak-forward-word-end() { CS=${CURSOR} if test 1 -lt ${NUMERIC:-0}; then zle select-in-word -n 1 if test ${CS} -eq ${CURSOR}; then zle vi-forward-word-end -n $(( ${NUMERIC} - 1 )) else test 2 -lt ${NUMERIC} && zle vi-forward-word-end -n $(( ${NUMERIC} -2 )) fi CS=${CURSOR} fi zle kak-reset-visual zle select-in-word -n 1 if test ${CS} -eq ${CURSOR}; then zle kak-reset-visual zle vi-forward-word-end -n 1 MARK=$(( ${CS} + 1 )) else MARK=${CS} fi}zle -N kak-forward-word-endkak-forward-blank-word-end() { CS=${CURSOR} zle vi-forward-blank-word -n 1 test $(( ${CS} + 2 )) -eq ${CURSOR} && CURSOR=$(( ${CS} + 1 )) || CURSOR=${CS} if test 1 -lt ${NUMERIC:-0}; then zle vi-forward-blank-word-end -n $(( ${NUMERIC} - 1 )) CURSOR=$(( ${CURSOR} + 1 )) fi zle kak-reset-visual zle vi-forward-blank-word-end -n 1}zle -N kak-forward-blank-word-endkak-sel-forward-word() { CS=${CURSOR} zle vi-forward-word -n 1 test $(( ${CS} + 1 )) = ${CURSOR} && zle vi-forward-word -n 1 if test 1 -lt ${NUMERIC:-0}; then zle vi-forward-word -n $(( ${NUMERIC} - 1 )) fi zle vi-backward-char -n 1}zle -N kak-sel-forward-wordkak-sel-forward-blank-word() { CS=${CURSOR} zle vi-forward-blank-word -n 1 test $(( ${CS} + 1 )) = ${CURSOR} && zle vi-forward-blank-word -n 1 if test 1 -lt ${NUMERIC:-0}; then zle vi-forward-blank-word -n $(( ${NUMERIC} - 1 )) fi zle vi-backward-char -n 1}zle -N kak-sel-forward-blank-wordkak-forward-word() { CS=${CURSOR} zle kak-reset-visual zle vi-forward-word -n 1 CE=${CURSOR} if test 1 -lt ${NUMERIC:-0}; then test 2 -lt ${NUMERIC} && zle vi-forward-word -n $(( ${NUMERIC} - 2 )) zle kak-reset-visual zle vi-forward-word -n 1 fi if test $(( ${CS} + 1 )) = ${CE}; then zle kak-reset-visual zle vi-forward-word -n 1 fi zle vi-backward-char -n 1}zle -N kak-forward-wordkak-forward-blank-word() { CS=${CURSOR} zle kak-reset-visual zle vi-forward-blank-word -n 1 CE=${CURSOR} if test 1 -lt ${NUMERIC:-0}; then test 2 -lt ${NUMERIC} && zle vi-forward-blank-word -n $(( ${NUMERIC} - 2 )) zle kak-reset-visual zle vi-forward-blank-word -n 1 fi if test $(( ${CS} + 1 )) = ${CE}; then zle kak-reset-visual zle vi-forward-blank-word -n 1 fi zle vi-backward-char -n 1}zle -N kak-forward-blank-word# bindkey - vicmdbindkey -N vicmdbindkey -M vicmd -R 0-9 digit-argumentbindkey -M vicmd "^[" vi-cmd-modebindkey -M vicmd "^L" clear-screenbindkey -M vicmd "^M" kak-accept-linebindkey -M vicmd "^J" kak-accept-linebindkey -M vicmd "<" kak-unindentbindkey -M vicmd ">" kak-indentbindkey -M vicmd ";" kak-reset-visualbindkey -M vicmd "\e;" exchange-point-and-markbindkey -M vicmd "\e:" kak-mark-pointbindkey -M vicmd "." vi-repeat-changebindkey -M vicmd "\e." kak-repeat-findbindkey -M vicmd "~" kak-up-casebindkey -M vicmd "\`" kak-down-casebindkey -M vicmd "A" kak-add-eolbindkey -M vicmd "I" kak-insert-bolbindkey -M vicmd "\eJ" vi-joinbindkey -M vicmd "O" vi-open-line-abovebindkey -M vicmd "P" kak-put-beforebindkey -M vicmd "U" redobindkey -M vicmd "X" visual-line-modebindkey -M vicmd "a" kak-add-nextbindkey -M vicmd "c" vi-changebindkey -M vicmd "d" kak-deletebindkey -M vicmd "f" vi-find-next-charbindkey -M vicmd "\ef" vi-find-prev-charbindkey -M vicmd "i" kak-insertbindkey -M vicmd "o" vi-open-line-belowbindkey -M vicmd "p" kak-put-afterbindkey -M vicmd "r" vi-replace-charsbindkey -M vicmd "t" vi-find-next-char-skipbindkey -M vicmd "\et" vi-find-prev-char-skipbindkey -M vicmd "u" undobindkey -M vicmd "x" visual-line-modebindkey -M vicmd "y" kak-yankbindkey -M vicmd "k" kak-up-linebindkey -M vicmd "j" kak-down-linebindkey -M vicmd "H" vi-backward-charbindkey -M vicmd "h" kak-backward-char# cannot distinguish between Alt and Escape#bindkey -M vicmd "\eh" vi-beginning-of-linebindkey -M vicmd "L" vi-forward-charbindkey -M vicmd "l" kak-forward-char#bindkey -M vicmd "\el" vi-end-of-linebindkey -M vicmd "Gh" vi-beginning-of-linebindkey -M vicmd "gh" kak-beginning-of-linebindkey -M vicmd "gi" kak-first-non-blankbindkey -M vicmd "Gl" vi-end-of-linebindkey -M vicmd "gl" kak-end-of-linebindkey -M vicmd "b" kak-backward-wordbindkey -M vicmd "B" vi-backward-wordbindkey -M vicmd "\eb" kak-backward-blank-wordbindkey -M vicmd "\eB" vi-backward-blank-wordbindkey -M vicmd "e" kak-forward-word-endbindkey -M vicmd "E" vi-forward-word-endbindkey -M vicmd "\ee" kak-forward-blank-word-endbindkey -M vicmd "\eE" vi-forward-blank-word-endbindkey -M vicmd "w" kak-forward-wordbindkey -M vicmd "W" kak-sel-forward-wordbindkey -M vicmd "\ew" kak-forward-blank-wordbindkey -M vicmd "\eW" kak-sel-forward-blank-word# edit-command-lineautoload -Uz edit-command-linezle -N edit-command-linekak-edit-command-line() { zle kak-remove-visual zle edit-command-line}zle -N kak-edit-command-linebindkey -M vicmd '^V' kak-edit-command-line
- Normal mode commands
- Avoid the escape key
- Implementing user mode (Leader key)
- Kakoune explain
- Kakoune TV