2019-12-06 [長年日記]

zshを導入した

業務の切り替わりで時間ができたので、ブートドライブをHDDからSSDに切り替えたところPCの応答がかなり良くなったので、zshを入れることにした。

色々試行錯誤したのだけど、最終的にzplugをベースにpreztoとその他便利そうなユーティリティーを入れることに。

  • prezto
  • zsh-completions
  • zsh-autosuggestions
  • zsh-syntax-highlighting
  • fzf

テーマはせっかくだしちょっと派手めにということで、Powerlevel10kにしてアイコンがもりもり表示されるようにした。

軽く使ってみた感じ、zsh-autosuggestionsとfzfがかなり便利で、VSCodeのgitプラグインが微妙に使いにくい感じのところが(VSCode内の)terminalを立ち上げてCUIで操作するのがよさそうな感触がある。

fzfに関しては、gitについていろいろなサンプルがあるのだけど、いまいちフィットする感じではなかったので結局ほぼフルスクラッチで書いてしまった。

function check-git-repository {
  git remote > /dev/null
  return $?
}

function fzf-git-add {
  check-git-repository || return $?

  local selected=$(git status -s -uall | awk '{if (substr($0,2,1) !~ / /) print $0}' |
    fzf -m --reverse --preview-window up:20 --exit-0 \
      --preview="[[ {} == '??'* ]] && echo {} | awk '{print \$2 }' | xargs colordiff -u /dev/null || 
    awk '{print $2}')
  if [[ -n "$selected" ]]; then
    selected=$(tr "\n" " " <<< $selected)
    git add $(echo $selected)
    echo "Completed"
  fi
}

function fzf-git-checkout {
  check-git-repository || return $?

  local branches=$(git branch -a)
  local branch=$(echo $branches | fzf --exit-0 --reverse \
    --preview-window up:20 \
    --preview="echo {} | awk '{print substr(\$0, 3)}' | xargs git log --color --graph --decorate=full
  [[ $branch == "" ]] && return
  branch=$(echo $branch | awk '{print substr($0,3)}')
  if [[ $branch == "remotes/"* ]];then
    # remote branch
    branch=$(echo $branch | sed "s#remotes/[^/]*/##")
    echo $branches | grep "^$branch$" > /dev/null
    if [[ $? == 0 ]]; then
      echo "$branch is already exist."
    fi
  fi
  git checkout $branch
}

git addはstage済みのファイルがリストアップされないようにとか、untracked fileは/dev/nullとdiffを取ることによってプレビューをそれっぽくするというのがポイント。

git checkoutはリモートブランチをチェックアウトしたときにエラーになったりdetachedにならないようにというのがポイントだけど、複数リモートリポジトリが存在する場合にどこまで正しく動作するかはチェックしていない。

実際はaliasに設定して3文字のコマンドで実行できるようにしてある。あとはdotfilesでの管理に置き換えたい。