fzfを使った便利ツール。快適なターミナル生活のためのfzf utility のメモ 快適に過ごしたいといいつつ沼化しがち。
fcd
インタラクティブなcd 階層をどんどん進みたいときに使う。
function fcd() {
if [[ "$#" != 0 ]]; then
builtin cd "$@";
return
fi
while true; do
local lsd=$(echo ".." && ls -p | grep '/$' | sed 's;/$;;')
local dir="$(printf '%s\n' "${lsd[@]}" |
fzf --reverse --preview '
__cd_nxt="$(echo {})";
__cd_path="$(echo $(pwd)/${__cd_nxt} | sed "s;//;/;")";
echo $__cd_path;
echo;
ls -p --color=always "${__cd_path}";
')"
[[ ${#dir} != 0 ]] || return 0
builtin cd "$dir" &> /dev/null
done
}
enhancd
履歴とか管理していい感じにcdできる。スコア高いところが表示されてfzfできる。 私はこれでデフォのcdを上書きしてしまっている。 ぶっちゃけfcdほぼ使わない。これ。 b4b4r07/enhancd
ftree_vim
カレントディレクトリ配下のファイルを選択して開く、
zleで登録してエイリアス貼っとくとショートカットで開けたりする。
vscodeと同じcmd + p
とかにしたりして使ってる。
function tree_select() {
tree -N -a --charset=o -f -I '.git|.idea|resolution-cache|target/streams|node_modules' | \
fzf | \
sed -e "s/ ->.*\$//g" | \
tr -d '\||`| ' | \
tr '\n' ' ' | \
sed -e "s/--//g" | \
xargs echo
}
# treeから選択したファイルをvimで開く
function ftree_vim(){
local selected_file=$(tree_select)
if [ -n "$selected_file" ]; then
BUFFER="vim $selected_file"
fi
zle accept-line
}
fvim
別にtreeじゃなくて良い用。
function fvim(){
local file=$(fzf)
if [ $file ]; then
vim $file
fi
}
git
fadd
インタラクティブにステージにあげる。
function fadd() {
local out q n addfiles
while out=$(
git status --short |
awk '{if (substr($0,2,1) !~ / /) print $2}' |
fzf-tmux --multi --exit-0 --expect=ctrl-d); do
q=$(head -1 <<< "$out")
n=$[$(wc -l <<< "$out") - 1]
addfiles=(`echo $(tail "-$n" <<< "$out")`)
[[ -z "$addfiles" ]] && continue
if [ "$q" = ctrl-d ]; then
git diff --color=always $addfiles | less -R
else
git add $addfiles
fi
done
}
fshow
gitの履歴を見る。
fshow() {
git log --graph --color=always \
--format="%C(auto)%h%d %s %C(black)%C(bold)%cr" "$@" |
fzf --ansi --no-sort --reverse --tiebreak=index --bind=ctrl-s:toggle-sort \
--bind "ctrl-m:execute:
(grep -o '[a-f0-9]\{7\}' | head -1 |
xargs -I % sh -c 'git show --color=always % | less -R') << 'FZF-EOF'
{}
FZF-EOF"
}
fbr
branchを切り替える。
fbr() {
local branches branch
branches=$(git branch -vv) &&
branch=$(echo "$branches" | fzf +m) &&
git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}
いろんなサイトを参考にしてもらったのだがリンクを忘れてしまった。 ネット上の皆様に感謝。