fzf Tiny Tools

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/.* //")
}

いろんなサイトを参考にしてもらったのだがリンクを忘れてしまった。 ネット上の皆様に感謝。