diff options
Diffstat (limited to 'autoload')
| -rw-r--r-- | autoload/+init.kak | 8 | ||||
| -rw-r--r-- | autoload/marks.kak | 74 |
2 files changed, 82 insertions, 0 deletions
diff --git a/autoload/+init.kak b/autoload/+init.kak index c3987f9..5e99424 100644 --- a/autoload/+init.kak +++ b/autoload/+init.kak @@ -31,6 +31,14 @@ add-highlighter global/ show-matching -previous # add-highlighter global/search dynregex '%reg{/}' 0:search hook global RegisterModified '/' %{ add-highlighter -override global/search regex "%reg{/}" 0:search } map global user '<esc>' ':set-register slash ""<ret>' +map global user '/' '/(?i)' + +# TODO: Reset count on modechange? +declare-option -hidden int user_mode_count 0 +define-command enter-user-mode-with-count -params 1 %{ + set-option window user_mode_count %val{count} + enter-user-mode %arg{1} +} # Mode cursors set-face global InsertCursor default,red+B diff --git a/autoload/marks.kak b/autoload/marks.kak new file mode 100644 index 0000000..e99e3bf --- /dev/null +++ b/autoload/marks.kak @@ -0,0 +1,74 @@ +declare-option str marks_path +declare-option str marks_name + +hook global KakBegin .* %{ + set-option global marks_path %sh{ echo "$XDG_DATA_HOME/kak/marks" } +} + +hook global EnterDirectory .* %{ evaluate-commands %sh{ + if [ -z "$kak_marks_name" ]; then + name=$(pwd | tr '/' '-' | tr ' ' '_') + echo "set-option global marks_name $name" + fi +} } + +define-command marks-add -params 1..2 %{ + nop %sh{ + [ -z "$kak_opt_marks_path" ] && exit 1 + mkdir -p "$kak_opt_marks_path" + path="$kak_opt_marks_path/$kak_opt_marks_name" + [ -f "$path" ] || touch "$path" + newfile="$1" + pos="$2" + if [ -z "$pos" ] || [ "$pos" = "0" ]; then pos="99"; else pos=$(($pos-1)); fi + function append() { cat; echo -e "$pos\t$newfile"; } + newfiles=$(grep -v "$newfile" "$path" \ + | nl | sed 's/^\s*//' \ + | append | sort -k 2 | uniq -f1 | sort \ + | sed 's/^\s*[-0-9]\+\s\+//') + echo -e "$newfiles" > "$path.tmp" + mv "$path.tmp" "$path" || true + rm -f "$path.tmp" || true + } + marks-show +} + +define-command marks-delete -params 1 %{ + nop %sh{ + path="$kak_opt_marks_path/$kak_opt_marks_name" + [ -f "$path" ] && sed -i "/$(echo "$1" | tr '/' '.')/d" "$path" || true + } + delete-buffer %arg{1} + marks-show +} + +define-command marks-show %{ + info -title 'marks' -markup %sh{ + path="$kak_opt_marks_path/$kak_opt_marks_name" + [ -f "$path" ] || exit 0 + echo -n "{Default}" + cat "$path" | while IFS= read file; do + short_path=$(echo "$file" | awk -F/ '{if (NF >= 2) {print $(NF-1) "/" $NF} else {print $NF}}') + hl=$([ "$file" = "$kak_buffile" ] && echo "{keyword}" || echo "{Default}") + echo "${hl}${short_path} {comment}$(realpath -s --relative-to="$PWD" "$file"){Default}" + done | nl | sed 's/^\s*//' + } +} + +define-command marks-switch -params 1 %{ + evaluate-commands %sh{ + path="$kak_opt_marks_path/$kak_opt_marks_name" + [ -f "$path" ] || exit 0 + count="${1:-0}" + [ "$count" = "0" ] && exit 0 + file=$(cat "$path" | sed -n "${count}p") + [ -z "$file" ] || echo "edit $file" + } + marks-show +} + +declare-user-mode marks +map global user a ':enter-user-mode-with-count marks<ret>' -docstring 'Marks mode' +map global user <space> ':marks-switch %val{count}<ret>' -docstring 'Switch marks' +map global marks a ':marks-add %val{buffile} %opt{user_mode_count}<ret>' -docstring 'Create new mark from buffer' +map global marks d ':marks-delete %val{buffile}<ret>' -docstring 'Delete mark' |
