You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
7.1 KiB
Plaintext

# 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<space>$index<ret> -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<space>$index<ret> -docstring \"# $name $(if [ "$modified" = true ]; then echo "[+]"; fi)\""
else
echo "map global pick-buffers ${keys:$index:1} :buffer-by-index<space>$index<ret> -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<ret> -docstring 'info'
map global buffers c :edit-kakrc<ret> -docstring 'config'
map global buffers d :delete-buffer<ret> -docstring 'delete'
map global buffers D :delete-buffers<ret> -docstring 'delete all'
map global buffers f :buffer<space> -docstring 'find'
map global buffers h :buffer-first<ret> -docstring 'first'
map global buffers l :buffer-last<ret> -docstring 'last'
map global buffers n :buffer-next<ret> -docstring 'next'
map global buffers o :buffer-only<ret> -docstring 'only'
map global buffers p :buffer-previous<ret> -docstring 'previous'
map global buffers s ':edit -scratch *scratch*<ret>' -docstring '*scratch*'
map global buffers u ':buffer *debug*<ret>' -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<ret>' -docstring 'buffers…'
#map global user B ':enter-user-mode -lock buffers<ret>' -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