zshでfishライクなシェルをzplugで楽に作る
きっかけ
普段fish使ってる同僚に「shellの互換性上、zsh使いたいけど、fishっぽく使いたい。かつ管理めんどいので設定ファイル短めで」と相談されて一緒に書いてみた
ゴール
最終的にこんな感じ
上記で
- コマンド予測補完
- コマンドシンタックスハイライト
- コマンド履歴インクリメンタルサーチ
- ディレクトリ履歴インクリメンタルサーチ
をやってます。
今回使用するプラグインなどの紹介
zplug
今回は設定を少なくし、プラグインの導入を楽にしたいのでzshのプラグインマネージャであるzplugを入れてプラグインを管理する
こんな感じで定義したプラグインを入れてくれる。かっこいい。
zshのプラグインマネージャにはoh-my-zshや、zplugなどがあるが、zplugには以下の特徴がある。
- 軽い
- 依存関係を保ったインストールやブランチロック・リビジョンロックができる
- プラグインマネージャの範疇を超えることはしない
使い方は、zshrcに以下のようにプラグインを定義した後、zplug install
を打つと.zplug以下のディレクトリにプラグインをインストールしてくれる。
zplug 'felixr/docker-zsh-completion'
zsh-autosuggestions
zshをfishっぽくするエッセンスの1つ目で、fishのように途中まで文字を入力すると過去の入力履歴から補完が出てくる。
候補が出てきたら、C-fで補完を行の最後まで確定、Option-fで単語毎に確定できる。
Optionはターミナルの設定でOptionをmetaキーに割り当てないと効かないので別途設定。
zsh-users/zsh-syntax-highlighting
zshをfizhっぽくするエッセンスの2つ目でfishのように、コマンドのシンタックスハイライトをしてくれる。
(公式より引用)
これなら打っている途中でコマンドが間違っているかわかるので便利。
peco
標準入力から受けた行データをインクリメンタルサーチして、選択した行を標準出力に返すコマンド。
anyframe
pecoとzshの便利な関数は決まっているので、特に便利な以下の関数などを提供してくれるプラグイン
- コマンド履歴をpecoで選択して実行する
- ディレクトリ履歴をpecoで選択して実行する
- プロセスをpecoで選択後killする
- tmux sessionをpecoで選択する
- git checkoutをpecoで選択して実行する
- ghqコマンドで管理しているリポジトリに移動
プラグインを入れて、どの関数をどのショートカットで使うかを設定するだけ。 ちなみに他のインクリメンタルサーチコマンドであるpercol、fzfでも大丈夫で、インストールしてあるフィルタリングツールを勝手に選択して使ってくれる。
今回は特に便利な上記の太字の機能だけ入れていく。
導入方法
上記で紹介したものをインストールしていく。.zshrcに書く。
# 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ライクなシェルの設定を作って、かつ最低限で短く書いた。