ついに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
に以下のように書きましょう。
source ~/.zplug/init.zsh
zplug load --verbose
ここまでできればzplugの設定は完了です。
3. zshテーマの設定
zshはテーマを設定できます。というか正直、テーマを設定できるからzshを選んでいるといっても過言ではありません。テーマというのは見た目のことです。機能には何ら影響を及ぼしませんが、現在の自分のディレクトリ上の位置やホスト名、gitの状態などを表示することができ、設定によっては作業効率爆上げ間違いなしです。
zshのテーマは無限の民が作りまくっているので、ここで列挙することは避けます。ただ、個人的にはpowerlineに対応したテーマが見やすくて良いかなあと感じます。powerline対応テーマを使うとこんな感じの見た目になります。画面左側に見えている矢印みたいなやつがpowerlineの特徴です。かっこいいですね。
oh-my-zshでpowerline対応テーマといえばagnosterで、僕もoh-my-zsh時代はagnosterを使っていました。ただ今回はzplugに乗り換えたということで別のテーマを探し、Powerlevel9kというテーマを採用しました。
インストール
基本的な設定は以下の通りで終了です。.zshrcに追記してください。本稿の末尾で.zshrcを公開しますので、書く場所が分からなかったりしたら参考にしてください。
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)
ここらへんの設定は使っていく中で調整していきたいので、すぐに書き換わりそうですけどね。
追加の設定
さて、今回インストールした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系で動かすほうが都合が良くて……など様々が様々なのでお気持ち街道まっしぐらになりました。)
zsh-completions
.zshrcにzplug "zsh-users/zsh-completions"
と書くだけでOK。アプリケーションが対応していれば、良い具合にコマンドを補完してくれます。gitのコマンドを打つときなど、先頭の数文字だけ覚えていればタブキー連打で済んで非常に良いです。
アプリによっては補完の横にコマンドの説明も出してくれるので、使い方をうろ覚えなコマンドでもzsh-completionsさえ入れておけばなんとなく使えてしまいます。
zsh-autosuggestions
.zshrcにzplug "zsh-users/zsh-autosuggestions"
と書くだけでOK。以前打ったコマンドを保管する形で、入力の先に薄字で表示してくれます。
薄字状態で右矢印キーを押せばそのまま補完されます。
5. zsh本体の設定
さて、最後にzsh本体を設定していきます。と言っても大物は1つのみ。
上下矢印キー補完を使いやすくする
端末上では上下矢印キーで履歴を移動し、過去に使用したコマンドを再利用することができます。それを知っているだけでも十分なのですが、zshを少し設定すれば、「c
と打って上矢印キーを押したときは、c
から始まるコマンド履歴のみをさかのぼっていく」といったことも可能です。
どういったときに便利かといいますと、例えばrailsの開発ではこの機能が重宝します。railsの開発では、rails db:migrate
やrails generate model hoge
など、rails
コマンドを多用します。もちろんrails
コマンドを使う合間にcd
やls
も乱発しますから、普通にコマンド履歴を叩きまくるのはストレスフルです。しかしここで紹介する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
ls
コマンドには大きく分けてBSD版とGNU版が存在しますが、macOSのls
コマンドは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"
ところでこれはおまけですが、ls
の詳細表示版ls -la
のショートカットとしてla
を設定するのもデファクトスタンダードでしょうか。これもやっておきましょう。
alias la="ls -la"
これで充実したls
ライフを送れます。
その他の細々とした設定
コメントを付けていますので、参考にしてください。
setopt share_history
zstyle ":completion:*:default" menu select=2
setopt AUTO_CD
setopt AUTO_PARAM_KEYS
(今日の時点での)完成版.zshrc
source ~/.zplug/init.zsh
zplug "b4b4r07/enhancd", use:init.sh
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
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
setopt share_history
zstyle ':completion:*:default' menu select=2
setopt AUTO_CD
setopt AUTO_PARAM_KEYS
alias ls="gls --color=auto"
alias la="ls -la"
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
最後に
MacBook Proが届いたので初日の設定をまとめておきました。今はまだきれいなシェル設定も、今後僕に乱雑に扱われてえっちな姿になっていくのだと考えると、とても興奮しますね。
「こんな設定もおすすめだよ!」「お前の設定はクソだ!」「というかお前はクソだ!」「お前に人権はない!」「焼き肉に行こう!」などというご意見ご感想がございましたら、Twitterの@dev_sudameか@ITF_sudameにリプやDMを投げつけてください。