zshでfishライクなシェルをzplugで楽に作る

きっかけ

普段fish使ってる同僚に「shellの互換性上、zsh使いたいけど、fishっぽく使いたい。かつ管理めんどいので設定ファイル短めで」と相談されて一緒に書いてみた

ゴール

  1. zshでfishライクなシェルを作る

  2. 履歴検索などはpecoなどを使いインタラクティブにフィルタリングし、コマンド履歴をフル活用する

  3. 設定はできるだけ少なく

最終的にこんな感じ

f:id:dais0n:20200712231214g:plain

上記で

をやってます。

今回使用するプラグインなどの紹介

zplug

今回は設定を少なくし、プラグインの導入を楽にしたいのでzshプラグインマネージャであるzplugを入れてプラグインを管理する

こんな感じで定義したプラグインを入れてくれる。かっこいい。

f:id:dais0n:20200712230930g:plain

zshプラグインマネージャにはoh-my-zshや、zplugなどがあるが、zplugには以下の特徴がある。

  • 軽い
  • 依存関係を保ったインストールやブランチロック・リビジョンロックができる
  • プラグインマネージャの範疇を超えることはしない

使い方は、zshrcに以下のようにプラグインを定義した後、zplug installを打つと.zplug以下のディレクトリにプラグインをインストールしてくれる。

zplug 'felixr/docker-zsh-completion'

zsh-autosuggestions

zshをfishっぽくするエッセンスの1つ目で、fishのように途中まで文字を入力すると過去の入力履歴から補完が出てくる。

f:id:dais0n:20200712231026g:plain

候補が出てきたら、C-fで補完を行の最後まで確定、Option-fで単語毎に確定できる。

Optionはターミナルの設定でOptionをmetaキーに割り当てないと効かないので別途設定。

zsh-users/zsh-syntax-highlighting

zshをfizhっぽくするエッセンスの2つ目でfishのように、コマンドのシンタックスハイライトをしてくれる。

f:id:dais0n:20200712231034p:plain

(公式より引用)

これなら打っている途中でコマンドが間違っているかわかるので便利。

peco

標準入力から受けた行データをインクリメンタルサーチして、選択した行を標準出力に返すコマンド。

anyframe

pecoとzshの便利な関数は決まっているので、特に便利な以下の関数などを提供してくれるプラグイン

  • コマンド履歴をpecoで選択して実行する
  • ディレクトリ履歴をpecoで選択して実行する
  • プロセスをpecoで選択後killする
  • tmux sessionをpecoで選択する
  • git checkoutをpecoで選択して実行する
  • ghqコマンドで管理しているリポジトリに移動

プラグインを入れて、どの関数をどのショートカットで使うかを設定するだけ。 ちなみに他のインクリメンタルサーチコマンドであるpercol、fzfでも大丈夫で、インストールしてあるフィルタリングツールを勝手に選択して使ってくれる。

今回は特に便利な上記の太字の機能だけ入れていく。

導入方法

上記で紹介したものをインストールしていく。.zshrcに書く。

  • zplugで上記で定義したプラグインを入れます
    • zsh-autosuggestions
    • zsh-syntax-highlighting
    • peco
    • anyframe
# zplugがなければzplugをインストール後zshを再起動
if [ ! -e "${HOME}/.zplug/init.zsh" ]; then
  curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh
fi
source ${HOME}/.zplug/init.zsh
# ここに入れたいプラグインを書く
zplug 'zsh-users/zsh-syntax-highlighting'
zplug 'zsh-users/zsh-autosuggestions'
zplug "peco/peco", as:command, from:gh-r
zplug "mollifier/anyframe"
# プラグインがまだインストールされてないならインストールするか聞く
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi
# .zplug以下にパスを通す。プラグイン読み込み
zplug load --verbose

zsh-autosuggestionsとzsh-syntax-highlightingは入れるだけで機能します。

上記に書いてあるようにpecoもzplugで入れられる。

# --------------
# cdr関連の設定
# --------------
setopt AUTO_PUSHD # cdしたら自動でディレクトリスタックする
setopt pushd_ignore_dups # 同じディレクトリは追加しない
DIRSTACKSIZE=100 # スタックサイズ
# cdr, add-zsh-hook を有効にする
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs

# --------------
# 履歴関連の設定
# --------------
HISTFILE=~/.zsh_history #履歴ファイルの設定
HISTSIZE=1000000 # メモリに保存される履歴の件数。(保存数だけ履歴を検索できる)
SAVEHIST=1000000 # ファイルに何件保存するか
setopt extended_history # 実行時間とかも保存する
setopt share_history # 別のターミナルでも履歴を参照できるようにする
setopt hist_ignore_all_dups # 過去に同じ履歴が存在する場合、古い履歴を削除し重複しない
setopt hist_ignore_space # コマンド先頭スペースの場合保存しない
setopt hist_verify # ヒストリを呼び出してから実行する間に一旦編集できる状態になる
setopt hist_reduce_blanks #余分なスペースを削除してヒストリに記録する
setopt hist_save_no_dups # histryコマンドは残さない
setopt hist_expire_dups_first # 古い履歴を削除する必要がある場合、まず重複しているものから削除
setopt hist_expand # 補完時にヒストリを自動的に展開する
setopt inc_append_history # 履歴をインクリメンタルに追加

# --------------
# anyframeの設定
# --------------
# anyframeで明示的にpecoを使用するように定義
zstyle ":anyframe:selector:" use peco
# C-zでcd履歴検索後移動
bindkey '^Z' anyframe-widget-cdr
# C-rでコマンド履歴検索後実行
bindkey '^R' anyframe-widget-put-history

これで設定完了!100行程度で短い。

gistに今回の設定+おすすめ設定を書いたzshrcをおいておくので、どうぞ。

まとめ

今回はzshでfishライクなシェルの設定を作って、かつ最低限で短く書いた。

参考