dotfiles/dot_fzf-marks/fzf-marks.plugin.fish

166 lines
5.2 KiB
Fish

# MIT License
# Copyright (c) 2019 Marcel Patzwahl
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
command -v fzf > /dev/null 2>&1 or return
if test -z "$FZF_MARKS_FILE"
set FZF_MARKS_FILE "$HOME/.fzf-marks"
end
if test ! -f "$FZF_MARKS_FILE"
touch "$FZF_MARKS_FILE"
end
if test -z "$FZF_MARKS_COMMAND"
set -l fzf_version (fzf --version | awk -F. '{ print $1 * 1e6 + $2 * 1e3 + $3 }')
set -l minimum_version 16001
if test $fzf_version -gt $minimum_version
set FZF_MARKS_COMMAND fzf --height 40% --reverse --header='ctrl-y:jump, ctrl-t:toggle, ctrl-d:delete'
else if test $FZF_TMUX -eq 1
set -l tmux_height $FZF_TMUX_HEIGHT
set -lq tmux_height[1]; or set tmux_height[1] 40
set FZF_MARKS_COMMAND "fzf-tmux -d$tmux_height"
else
set FZF_MARKS_COMMAND "fzf"
end
end
function mark
set -l mark_to_add "$argv : "(pwd)
if grep -qxFe "$mark_to_add" "$FZF_MARKS_FILE"
echo "** The following mark already exists **"
else
echo "$mark_to_add" >> "$FZF_MARKS_FILE"
echo "** The following mark has been added **"
end
echo "$mark_to_add" | _color_marks
end
function _handle_symlinks
if test -L $FZF_MARKS_FILE
set -l link (readlink "$FZF_MARKS_FILE")
switch $link
case '/*'
echo $link
case '*'
echo (dirname $FZF_MARKS_FILE)/$link
end
else
echo $FZF_MARKS_FILE
end
end
function _color_marks
if test "$FZF_MARKS_NO_COLORS" = "1"
cat
else
set -l esc (printf '\033')
set -l c_lhs $FZF_MARKS_COLOR_LHS
set -lq c_lhs[1]; or set c_lhs[1] 39
set -l c_rhs $FZF_MARKS_COLOR_RHS
set -lq c_rhs[1]; or set c_rhs[1] 36
set -l c_colon $FZF_MARKS_COLOR_COLON
set -lq c_colon[1]; or set c_colon[1] 33
sed "s/^\\(.*\\) : \\(.*\\)\$/"$esc"["$c_lhs"m\\1"$esc"[0m "$esc"["$c_colon"m:"$esc"[0m "$esc"["$c_rhs"m\\2"$esc"[0m/"
end
end
function fzm
set -l marks_del $FZF_MARKS_DELETE
set -lq marks_del[1]; or set marks_del[1] "ctrl-d"
set lines (_color_marks < $FZF_MARKS_FILE | $FZF_MARKS_COMMAND \
--ansi \
--expect="$marks_del" \
--multi \
--bind=ctrl-y:accept,ctrl-t:toggle \
--query=$argv \
--select-1 \
--tac)
if test -z "$lines"
commandline -f repaint
return 1
end
set -l key (echo "$lines" | head -1 | string split " ")
if test $marks_del = $key[1]
dmark "-->-->-->" (echo "$key[2..-1]")
else
jump "-->-->-->" (echo "$lines" | tail -1)
end
end
function jump
if test $argv[1] = "-->-->-->"
set jumpline $argv[2]
else
set jumpline (_color_marks < $FZF_MARKS_FILE | $FZF_MARKS_COMMAND \
--ansi \
--bind=ctrl-y:accept \
--query="$argv" \
--select-1 \
--tac)
end
if test -n $jumpline
set -l jumpdir (echo "$jumpline" | sed 's/.*: \(.*\)$/\1/' | sed "s#~#$HOME#")
set -l bookmarks (_handle_symlinks)
cd $jumpdir
commandline -f repaint
end
end
function dmark
if test $argv[1] = "-->-->-->"
set marks_to_delete $argv[2]
else
set marks_to_delete (_color_marks < $FZF_MARKS_FILE | $FZF_MARKS_COMMAND \
-m \
--ansi \
--bind=ctrl-y:accept,ctrl-t:toggle \
--query="$argv" \
--tac)
end
set -l bookmarks (_handle_symlinks)
for line in $marks_to_delete
set -l line (string replace -a "/" "\/" $line)
perl -n -i -e "print unless /^\Q$line\E\$/" "$bookmarks"
end
if test (echo $marks_to_delete | wc -l) = 1
echo "** The following mark has been deleted **"
echo "$marks_to_delete" | _color_marks
else
echo "** The following marks have been deleted **"
echo "$marks_to_delete" | _color_marks
end
commandline -f repaint
end
set -q FZF_MARKS_JUMP; or set FZF_MARKS_JUMP \cg
bind -M insert $FZF_MARKS_JUMP fzm
bind $FZF_MARKS_JUMP fzm
if test -n "$FZF_MARKS_DMARK"
bind -M insert "$FZF_MARKS_DMARK" dmark
bind "$FZF_MARKS_DMARK" dmark
end