Preztoを使ってzshrcをシンプルに作りなおした

追記

ここ10ヶ月ほど本家リポジトリのmasterブランチの更新が無く,先行きが不透明なのでforkを探してみました。

kujira16.hateblo.jp

はじめに

研究室にzshのヘビーユーザーがいたので,それに触発されてzshの設定を作りなおしました。

私がzshを使い始めたころ(5年くらい前?)はoh-my-zshのような設定管理フレームワークが有名になる直前だったので,よく書かれているzshrcを探してコピーしてくるのが普通だったのですが,今ではoh-my-zshやPreztoのような設定管理フレームワークを使うことで,よく書かれた設定を手軽に利用することが出来ます。

oh-my-zshと比較してPreztoのほうが後発で動作も軽いということだったので今回はPreztoを利用してみました。

github.com

zpreztorc

.zpreztorc はPreztoの設定ファイルで,読み込むプラグインの指定や,プラグイン固有の設定を行います。私は以下の点に気をつけて編集しました。

directory を無効化

初期設定では directory というモジュールが有効になっています。このプラグインでは AUTO_CDcd を入力せずにディレクトリ移動ができる機能)やディレクトリスタック(カレントディレクトリをブックマークできる機能)に関する設定が行われるのですが,私はこれらの機能は使わないし,ディレクトリスタックを簡単に使えるようにするために 12 といったaliasが定義されてしまうのが嫌なので無効にしました。

MULTIOSEXTENDED_GLOB はよく使うので,この2つはzshrcのほうで有効にしました。

archive を有効化

archivelsarchiveunarchive というシェル関数を有効にするプラグインです。要するに extractコマンド です。

history-substring-search を有効化

history-substring-search は適当に文字列を入力してから↑キーやCtrl-Pを押すと,入力した文字列を部分文字列に持つ過去のコマンドを列挙してくれるプラグインで,zsh標準のhistory-beginning-searchの強化版といえます。

確かに便利なこともあるのですが,history-beginning-searchと比べて副作用が大きすぎると感じることが多くなってしまいました。今ではhistory-substring-searchは無効にして,history-beginning-searchでCtrl-PとCtrl-Nで前方一致検索を使えるようにする設定をzshrcに書いています。

# Ctrl-PとCtrl-Nで前方一致検索
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end

command-not-found を有効化

command-not-foundDebian系のディストリビューションやArch Linuxなどでaptやpacmanに含まれているけどもインストールされていないコマンドを実行しようとした時に,どのパッケージをインストールすればいいか教えてくれる機能です。

git を無効化

git はGit連携のためのプラグインで,右プロンプトの設定などが行われるので有効にしている人も多いのですが,定義されるaliasがキモイ ので無効にしました。右プロンプトにブランチ名などを表示するための設定は別のところでやっています(後述)。

osx を無効化

osxMacのFinderやPreview.appとの連携のためのプラグインで,有効にしている人も多いのですが,ほとんど使うことが無さそうなので有効にしませんでした。

まとめ

# .zpreztorc

# Color output (auto set to 'no' on dumb terminals).
zstyle ':prezto:*:*' color 'yes'

# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'spectrum' \
  'utility' \
  'completion' \
  'prompt' \
  'archive' \
  'command-not-found'

# Set the key mapping style to 'emacs' or 'vi'.
zstyle ':prezto:module:editor' key-bindings 'emacs'

# Set the prompt theme to load.
zstyle ':prezto:module:prompt' theme 'sorin'

zshrc

これだけは欠かせないと思った設定は以前のzshrcから引き継ぎました。

correctを無効化

愛好家の方には申し訳ないのですが,便利だと思ったことがありません…

MAGIC_EQUAL_SUBSTを有効化

./configure --prefix=の後でディレクトリ名の補完を有効にします。どうしてPreztoの初期設定で有効になっていないのかよく分かりません。副作用があるんでしょうか?

確かにMAGIC_EQUAL_SUBSTはPreztoの初期設定で有効になっていないのですが,なぜか同等の機能が使えるようになっています。

Ctrl+^で親ディレクトリにcdする

以前のzshrcからコピーしてきたのですが,移動後に左プロンプトのディレクトリ表示が更新されない不具合があったので,prompt_${prompt_theme}_precmd の設定をしました。

https://github.com/arael/configs/blob/57650c837500ad916f7f7f18903070db354ec58b/zsh/zshrc.prezto#L140

右プロンプトにvcs_infoを表示する

以下の設定を読み込んでいます。

http://www.slideshare.net/mollifier/vcsinfo/33

まとめ

# .zshrc

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

### modules/utility/init.zsh ###

# https://github.com/sorin-ionescu/prezto/issues/622
unsetopt CORRECT

### modules/directory/init.zsh ###
setopt MULTIOS              # Write to multiple descriptors.
setopt EXTENDED_GLOB        # Use extended globbing syntax.

# Ctrl-PとCtrl-Nで前方一致検索
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end

# Ctrl-^ で cd ..
# https://github.com/arael/configs/blob/57650c837500ad916f7f7f18903070db354ec58b/zsh/zshrc.prezto#L140
function cdup() {
  echo
  cd ..
  prompt_${prompt_theme}_precmd
  zle reset-prompt
  return 0
}
zle -N cdup
bindkey '^\^' cdup

# Use `pbcopy` in modules/utility/init.zsh
clip() {
  cat $1 | pbcopy
}

if [[ -s "${ZDOTDIR:-$HOME}/.zshrc.vcs_info" ]]; then
  source "${ZDOTDIR:-$HOME}/.zshrc.vcs_info"
fi