166 lines
5.2 KiB
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
|