# buflist++: names AND modified bool # debug buffers (like *debug*, *lint*…) are excluded declare-option -hidden str-list buffers_info declare-option int buffers_total # keys to use for buffer picking declare-option str buffer_keys "1234567890qwertyuiopasdfghjklzxcvbnm" # used to handle [+] (modified) symbol in list define-command -hidden refresh-buffers-info %{ set-option global buffers_info set-option global buffers_total 0 # iteration over all buffers (except debug ones) evaluate-commands -no-hooks -buffer * %{ set-option -add global buffers_info "%val{bufname}_%val{modified}" } evaluate-commands %sh{ total=$(printf '%s\n' "$kak_opt_buffers_info" | tr ' ' '\n' | wc -l) printf '%s\n' "set-option global buffers_total $total" } } # used to handle # (alt) symbol in list declare-option str alt_bufname declare-option str current_bufname # adjust this number to display more buffers in info declare-option int max_list_buffers 42 hook global WinDisplay .* %{ set-option global alt_bufname %opt{current_bufname} set-option global current_bufname %val{bufname} } define-command info-buffers -docstring 'populate an info box with a numbered buffers list' %{ refresh-buffers-info evaluate-commands %sh{ # info title printf "info -title '$kak_opt_buffers_total buffers' -- %%^" index=0 eval "set -- $kak_opt_buffers_info" while [ "$1" ]; do # limit lists too big index=$(($index + 1)) if [ "$index" -gt "$kak_opt_max_list_buffers" ]; then printf ' …' break fi name=${1%_*} if [ "$name" = "$kak_bufname" ]; then printf "> %s" "$index - $name" elif [ "$name" = "$kak_opt_alt_bufname" ]; then printf "# %s" "$index - $name" else printf " %s" "$index - $name" fi modified=${1##*_} if [ "$modified" = true ]; then printf " [+]" fi echo shift done printf ^\\n } } declare-user-mode pick-buffers define-command pick-buffers -docstring 'enter buffer pick mode' %{ refresh-buffers-info unmap global pick-buffers evaluate-commands %sh{ index=0 keys=" $kak_opt_buffer_keys" num_keys=$(($(echo "$kak_opt_buffer_keys" | wc -m) - 1)) eval "set -- $kak_opt_buffers_info" while [ "$1" ]; do # limit lists too big index=$(($index + 1)) if [ "$index" -gt "$num_keys" ]; then break fi name=${1%_*} modified=${1##*_} if [ "$name" = "$kak_bufname" ]; then echo "map global pick-buffers ${keys:$index:1} :buffer-by-index$index -docstring \"> $name $(if [ "$modified" = true ]; then echo "[+]"; fi)\"" elif [ "$name" = "$kak_opt_alt_bufname" ]; then echo "map global pick-buffers ${keys:$index:1} :buffer-by-index$index -docstring \"# $name $(if [ "$modified" = true ]; then echo "[+]"; fi)\"" else echo "map global pick-buffers ${keys:$index:1} :buffer-by-index$index -docstring \" $name $(if [ "$modified" = true ]; then echo "[+]"; fi)\"" fi shift done } enter-user-mode pick-buffers } define-command buffer-first -docstring 'move to the first buffer in the list' 'buffer-by-index 1' define-command buffer-last -docstring 'move to the last buffer in the list' %{ buffer-by-index %opt{buffers_total} } define-command -hidden -params 1 buffer-by-index %{ refresh-buffers-info evaluate-commands %sh{ target=$1 index=0 eval "set -- $kak_opt_buffers_info" while [ "$1" ]; do index=$(($index+1)) name=${1%_*} if [ $index = $target ]; then echo "buffer $name" fi shift done } } define-command delete-buffers -docstring 'delete all saved buffers' %{ evaluate-commands %sh{ deleted=0 eval "set -- $kak_buflist" while [ "$1" ]; do echo "try 'delete-buffer $1'" echo "echo -markup '{Information}$deleted buffers deleted'" deleted=$((deleted+1)) shift done } } define-command buffer-only -docstring 'delete all saved buffers except current one' %{ evaluate-commands %sh{ deleted=0 eval "set -- $kak_buflist" while [ "$1" ]; do if [ "$1" != "$kak_bufname" ]; then echo "try 'delete-buffer $1'" echo "echo -markup '{Information}$deleted buffers deleted'" deleted=$((deleted+1)) fi shift done } } define-command buffer-only-force -docstring 'delete all buffers except current one' %{ evaluate-commands %sh{ deleted=0 eval "set -- $kak_buflist" while [ "$1" ]; do if [ "$1" != "$kak_bufname" ]; then echo "delete-buffer! $1" echo "echo -markup '{Information}$deleted buffers deleted'" deleted=$((deleted+1)) fi shift done } } define-command buffer-only-directory -docstring 'delete all saved buffers except the ones in the same current buffer directory' %{ evaluate-commands %sh{ deleted=0 current_buffer_dir=$(dirname "$kak_bufname") eval "set -- $kak_buflist" while [ "$1" ]; do dir=$(dirname "$1") if [ $dir != "$current_buffer_dir" ]; then echo "try 'delete-buffer $1'" echo "echo -markup '{Information}$deleted buffers deleted'" deleted=$((deleted+1)) fi shift done } } define-command edit-kakrc -docstring 'open kakrc in a new buffer' %{ evaluate-commands %sh{ printf '%s\n' "edit $kak_config/kakrc" } } declare-user-mode buffers map global buffers a ga -docstring 'alternate' map global buffers b :info-buffers -docstring 'info' map global buffers c :edit-kakrc -docstring 'config' map global buffers d :delete-buffer -docstring 'delete' map global buffers D :delete-buffers -docstring 'delete all' map global buffers f :buffer -docstring 'find' map global buffers h :buffer-first -docstring 'first' map global buffers l :buffer-last -docstring 'last' map global buffers n :buffer-next -docstring 'next' map global buffers o :buffer-only -docstring 'only' map global buffers p :buffer-previous -docstring 'previous' map global buffers s ':edit -scratch *scratch*' -docstring '*scratch*' map global buffers u ':buffer *debug*' -docstring '*debug*' # trick to access count, 3b → display third buffer define-command -hidden enter-buffers-mode %{ evaluate-commands %sh{ if [ "$kak_count" -eq 0 ]; then echo 'enter-user-mode buffers' else echo "buffer-by-index $kak_count" fi } } # Suggested hook #hook global WinDisplay .* info-buffers # Suggested mappings #map global user b ':enter-buffers-mode' -docstring 'buffers…' #map global user B ':enter-user-mode -lock buffers' -docstring 'buffers (lock)…' # Suggested aliases #alias global bd delete-buffer #alias global bf buffer-first #alias global bl buffer-last #alias global bo buffer-only #alias global bo! buffer-only-force