MacBook Proが届いたのでシェルの設定をする

ついにMacBook Proが僕の手に!!!! 矢印キーが小さいのほんまクソ。

ということで、せっかくなので秘伝のタレ(コピペ)と化していたシェルの設定をゼロから書き直すことにしました。ペチペチキーボードほんまクソ。

1. ログインシェルの変更

macOSだろうとUbuntuだろうとDebianだろうとCent OSだろうと、基本的にはデフォルトでbashが使われていると思います。bashはダサいしキモいし臭いので他のモダンなシェルに乗り換えましょう。今まではzshを使ってきましたが、せっかくなので他のシェルについてもサクっと調べてみました。

変更先の検討候補に上がったのは以下の3つ。

まずtcsh。こいつはcshとよばれるシェルを拡張したものです。cshはC Shellの略。システムのほとんどがC言語で書かれたUnixと親和性を高めるため、シェルにもCの概念を持ち込んだのがcshです。僕はC言語使いではないのでtcshは違うな、ということで候補から除外。

続いてfish。最近頭角を現してきたシェルで、使いやすい設定がデフォルトでセッティングされており、使いやすいことを売りにしているシェルです。僕も以前話題になったときに少し使ってみていました。このときは非常に快適に使えていたのですが、絵文字を含むコマンドが履歴に入った際に盛大にバグり散らかしたので、泣く泣く使用継続を断念しました。今ではそのバグも治っている(そもそも遭遇した不具合がバグだったのかも不明)かもしれませんが、zshの安定性を考えてzshを選択しました。

ということでログインシェルは(結局今までどおりの)zshに決定!

zshのインストールは

$ brew install zsh

でOK。

brewでインストールした場合、/usr/local/bin/zsh にインストールされるようです。 /etc/shells の末尾に /usr/local/bin/zsh を追記し、

$ sudo chsh -s /usr/local/bin/zsh

を実行すればログインシェルの変更は完了です。

2.プラグインマネージャのインストール

zshを入れたからには使わねばならない、プラグインマネージャ。

zshにはプラグイン機能があり、プラグインを突っ込んでいくことで機能を拡張することができます。このプラグインのインストール・アンインストール等の管理を楽にしてくれるのがプラグインマネージャです。プラグインマネージャによって、設定が非常に簡単なものがあったり、プラグインの読み込みが高速なものがあったりと、得意不得意があります。

プラグインマネージャは盛者必衰・諸行無常の世界で、次々と新しいものが登場しては古いものを駆逐し、あるいは古いものが再興しては新興勢力を薙ぎ払っています。僕は長らくoh-my-zshというものを使っていたのですが、こいつも大分古くなってきた上、あまり評判もよろしくないので、乗り替えることにしました。

シェル本体と同様、プラグインマネージャにも乗り換え候補はたくさんあって

  • zplug
  • Antigen
  • oh-my-zsh
  • zgen
  • prezto

などがあります。(こいつらの中には「俺はプラグインマネージャじゃなくて設定フレームワークだ!」と主張しているようなものも含まれていますが、大きなくくりで見れば同類です。たぶん。)

何を使うか5秒ほど迷ったのですが、日本人が開発していて応援したいなと思ったのでzplugに決めました。5秒で決めたzplugですが、他のプラグインマネージャ用のプラグインも簡単に導入できたり、設定ファイルの文法が非常に分かりやすかったりと、選んで良かった感が半端ないです。これから使っていくうちに致命的なバグに出会わないことを祈ります。

zplugのインストールは下記コマンドにて完了します。

Homebrewでのインストールも可能なようですが、やってみたところ何かが上手くいきませんでした。curlでやったらできてしまったので原因究明は特にしておりません。

$ curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

インストールが完了すると、ホームディレクトリに.zplugというディレクトリができます。この中にzplugの本体が入っています。シェルの起動時にzplugを設定する必要がありますので、zshの起動時設定ファイルである.zshrcに以下のように書きましょう。

# zplugの読み込み・初期化
source ~/.zplug/init.zsh

########################
# ここにzplugの設定を書く #
########################

# コマンドをリンクして、PATH に追加し、プラグインを読み込む
zplug load --verbose

######################################
# zplugに関係無い設定はここらへんに適当に #
######################################

ここまでできればzplugの設定は完了です。

3. zshテーマの設定

zshはテーマを設定できます。というか正直、テーマを設定できるからzshを選んでいるといっても過言ではありません。テーマというのは見た目のことです。機能には何ら影響を及ぼしませんが、現在の自分のディレクトリ上の位置やホスト名、gitの状態などを表示することができ、設定によっては作業効率爆上げ間違いなしです。

zshのテーマは無限の民が作りまくっているので、ここで列挙することは避けます。ただ、個人的にはpowerlineに対応したテーマが見やすくて良いかなあと感じます。powerline対応テーマを使うとこんな感じの見た目になります。画面左側に見えている矢印みたいなやつがpowerlineの特徴です。かっこいいですね。

f:id:sudame:20190403194708p:plain

oh-my-zshでpowerline対応テーマといえばagnosterで、僕もoh-my-zsh時代はagnosterを使っていました。ただ今回はzplugに乗り換えたということで別のテーマを探し、Powerlevel9kというテーマを採用しました。

インストール

基本的な設定は以下の通りで終了です。.zshrcに追記してください。本稿の末尾で.zshrcを公開しますので、書く場所が分からなかったりしたら参考にしてください。

# zshテーマの設定
# powerline-fontを導入するのを忘れずに
zplug "bhilburn/powerlevel9k", use:powerlevel9k.zsh-theme, as:theme

また、powerline用のフォントもインストールしなければなりません。これは $ brew cask install font-noto-mono-for-powerline でインストールできました。

表示の設定

デフォルトの表示でも十分きれいなのですが、せっかくなので最近流行りの「2行表示」を採用してみました。1行目にはカレントディレクトリを表示し、2行目にはgit配下ならgitステータスを、git配下でなければ空白を表示します。

2行表示の良いところは、コマンドの区切りが見やすいところ(実質的に1行空くので)や、細いウィンドウ領域でも情報量を落とさずきれいに端末を見られるところでしょうか。最近僕も画面分割を頻繁に使うようになってきたので、細いウィンドウで快適なのは重要です。

この設定は以下を.zshrcに加えれば完了です。

POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir newline vcs)

f:id:sudame:20190403195015p:plain f:id:sudame:20190403195225p:plain

ここらへんの設定は使っていく中で調整していきたいので、すぐに書き換わりそうですけどね。

追加の設定

さて、今回インストールしたpowerlevel9kというテーマは、powerlineだけでなくawesome-powerlineにも対応しているというではありませんか。awesome-powerlineは文字面からしてpowerlineの拡張の様子。今回始めて扱いますが、チャレンジしてみました。

先に説明したとおり、awesome-powerlineはpowerlineの拡張です。powerlineで指定されていない文字コードにアイコンフォントを割り当て、端末上にリッチな表示をしようとするものであるようです。

したがって、作業工程は2つ。まずawesome-powerlineに対応したフォントをダウンロードすること、次にpowerlevel9k上でawesome-powerlineを有効化することが必要です。

awesome-powerlineフォントは、既存のフォントと絵文字フォントを組み合わせることで生成できます。すでに生成済みのフォントを使っても良いですし、自分好みに生成しても構いません。

生成済みのフォントを使用する場合、Nerd Fontsというプロジェクトのものを利用することが想定されています。リンク先のpatched_fontの中に生成されたフォントが入っていますので、好みのフォントを探してください。好みのフォントをダウンロードして適用したあと、.zshrcにPOWERLEVEL9K_MODE='nerdfont-complete'と追記すれば動作するはずです。

ところで、Nerd Fontsにあるものは(Noto Monoだけかもしれませんが)アイコンの大きさが何故かやたらと小さいです。これでは見にくいので、僕は手元で生成してみることにしました。フォントの生成についてはこれだけで1記事書けてしまうので、割愛します。(フォントの生成にはFontForgeが必要で、FontForgeを動かすにはLinuxのほうが都合が良くて、しかもFontForgeはPython2.x系で動かすほうが都合が良くて……など様々が様々なのでお気持ち街道まっしぐらになりました。)

4. テーマ以外のzshプラグイン導入

zsh-completions

.zshrcにzplug "zsh-users/zsh-completions"と書くだけでOK。アプリケーションが対応していれば、良い具合にコマンドを補完してくれます。gitのコマンドを打つときなど、先頭の数文字だけ覚えていればタブキー連打で済んで非常に良いです。

f:id:sudame:20190403195345p:plain

アプリによっては補完の横にコマンドの説明も出してくれるので、使い方をうろ覚えなコマンドでもzsh-completionsさえ入れておけばなんとなく使えてしまいます。

zsh-autosuggestions

.zshrcにzplug "zsh-users/zsh-autosuggestions"と書くだけでOK。以前打ったコマンドを保管する形で、入力の先に薄字で表示してくれます。

f:id:sudame:20190403195453p:plain

薄字状態で右矢印キーを押せばそのまま補完されます。

5. zsh本体の設定

さて、最後にzsh本体を設定していきます。と言っても大物は1つのみ。

上下矢印キー補完を使いやすくする

端末上では上下矢印キーで履歴を移動し、過去に使用したコマンドを再利用することができます。それを知っているだけでも十分なのですが、zshを少し設定すれば、「cと打って上矢印キーを押したときは、cから始まるコマンド履歴のみをさかのぼっていく」といったことも可能です。

どういったときに便利かといいますと、例えばrailsの開発ではこの機能が重宝します。railsの開発では、rails db:migraterails generate model hogeなど、railsコマンドを多用します。もちろんrailsコマンドを使う合間にcdlsも乱発しますから、普通にコマンド履歴を叩きまくるのはストレスフルです。しかしここで紹介するzshの設定をしておけば、railsと打って上下矢印キーを押せば、railsから始まるコマンド履歴のみを遡ることができます。

bashから乗り換えて良かったな〜〜と心の底から思ったtipsです。

設定は下記の通り。

# 入力した文字から始まるコマンドを履歴から検索し、上下矢印で補完
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search

macOSのlsを駆逐する

lsコマンドには大きく分けてBSD版とGNU版が存在しますが、macOSlsコマンドはBSD版です。僕が長らくUbuntuユーザだった(Ubuntuは当然ながあらGNU版)こともあり、基本的なコマンドはGNU版を使いたいです。一般的にも、UnixコマンドといえばGNU版のことを指す方が多いんじゃないかなぁ……?[要出典]

まず、GNU版のユーティリティをインストールします。このユーティリティにはls以外にもいくつかのGNU版コマンドが同梱されていますが、とりあえずlsの設定だけやっておきます。

$ brew install coreutils

インストールが完了すると、GNU版のlsコマンドはglsコマンドで実行できるようになります。今回はlsコマンドをGNU版に置き換えたいので、.zshrcに以下のように設定します。ついでに、カラー表示するようにしました。

alias ls="gls --color=auto"

f:id:sudame:20190403195655p:plain

ところでこれはおまけですが、lsの詳細表示版ls -laのショートカットとしてlaを設定するのもデファクトスタンダードでしょうか。これもやっておきましょう。

alias la="ls -la"

f:id:sudame:20190403195743p:plain

これで充実したlsライフを送れます。

その他の細々とした設定

コメントを付けていますので、参考にしてください。

# 他のzshと履歴を共有
setopt share_history

# 選択されたテキストの背景色を変更し、ハイライトする
zstyle ":completion:*:default" menu select=2

# パスを直接入力してもcdする
setopt AUTO_CD

# 環境変数を補完
setopt AUTO_PARAM_KEYS

(今日の時点での)完成版.zshrc

# zplugを使ってzshのプラグイン管理
source ~/.zplug/init.zsh

# cdを強化する
# https://github.com/b4b4r07/enhancd
zplug "b4b4r07/enhancd", use:init.sh


# zshテーマの設定
# powerline-fontを導入するのを忘れずに
zplug "bhilburn/powerlevel9k", use:powerlevel9k.zsh-theme, as:theme

### テーマの設定 ###
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir newline vcs)
POWERLEVEL9K_MODE='awesome-patched'
##################

# 補完の強化
zplug "zsh-users/zsh-completions"

# 履歴補完の強化
zplug "zsh-users/zsh-autosuggestions"

# ここまでに書いたプラグインのロード
zplug load --verbose

#####################################################
################# ここから下はzshの設定 ################
#####################################################

# 入力した文字から始まるコマンドを履歴から検索し、上下矢印で補完
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search

# 他のzshと履歴を共有
setopt share_history

# 選択されたテキストの背景色を変更し、ハイライトする
zstyle ':completion:*:default' menu select=2

# パスを直接入力してもcdする
setopt AUTO_CD

# 環境変数を補完
setopt AUTO_PARAM_KEYS


### 永続的なalias ###
alias ls="gls --color=auto"
alias la="ls -la"

### ここから下は環境設定 ###

### なんかiTerm2が勝手に書いたやつ ###
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"

最後に

MacBook Proが届いたので初日の設定をまとめておきました。今はまだきれいなシェル設定も、今後僕に乱雑に扱われてえっちな姿になっていくのだと考えると、とても興奮しますね。

「こんな設定もおすすめだよ!」「お前の設定はクソだ!」「というかお前はクソだ!」「お前に人権はない!」「焼き肉に行こう!」などというご意見ご感想がございましたら、Twitter@dev_sudame@ITF_sudameにリプやDMを投げつけてください。