Macに開発環境を構築する:ターミナル編(iTerm2 + zsh + prezto + peco)

はじめに

最近プライベートでのアプリケーション開発用に MacBook Pro を購入しました。
改めて Rails の開発環境構築をしたので、セットアップ手順を備忘録としてもアウトプットして残しておきます。

手元のMac環境はこちら

  • MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
  • macOS Mojava バージョン 10.14.6

手順①:iTerm2 のセットアップ

ターミナルのシェルを iTerm2 にするために公式サイトからインストールします。

インストールが終わったら、フォントも設定してあげましょう。
僕は ricty for powerline を用いていますが、Homebrew からインストールが必要です。

# インストール
$ brew tap sanemat/font
$ brew install ricty --with-powerline
$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf

# iTerm 上でフォント変更
iTerm2 >> Preferences >> Profiles >> Text >> 一番下の Font で指定

また、カラーテーマも設定してあげましょう。
僕は iceberg を用いていますが、同じくインストールが必要です。

# インストール
$ curl -O https://raw.githubusercontent.com/Arc0re/Iceberg-iTerm2/master/iceberg.itermcolors

# iTerm 上でフォント変更
iTerm2 >> Preferences >> Profiles >> Colors tab >> 右下の Color Presets.. で指定

手順②:zsh のセットアップ

インストール

bash も zsh もシェルのひとつで、シェルとはプログラムを実行するためのカーネルに命令を伝える役割です。

  • bash:ベーシック
  • zsh:軽い、カスタマイズ幅がある

という差があり、macOS Catalina からは標準搭載シェルが bash から zsh に変更になっています。
僕の macOS は Mojava なので乗り換えを行いました。

最近の Mac には既に zsh がインストールされている可能性があります。
以下のコマンドで最新の安定バージョンとの差分があればインストールしましょう。

$ zsh --version
zsh [ここにインストールされているバージョンが表示されます]

$ brew info zsh
zsh: stable 5.7.1 (bottled), HEAD

# これらバージョンに差があればインストール
$ brew install zsh

ログインシェルの変更

/etc/shells に Homebrew でインストールした zsh のパスを追加します。

$ sudo vi /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh    # この行を追加

chsh コマンドでログインシェルを bash から zsh に変更します。

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

ターミナルを再起動すると以下のメッセージが表示されると思います。

This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---

僕は (1) をタイプしました。すると以下のような表示になります。

Please pick one of the following options:

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

(2)  Configure the new completion system.  (Recommended.)

(3)  Configure how keys behave when editing command lines.  (Recommended.)

(4)  Pick some of the more common shell options.  These are simple "on"
     or "off" switches controlling the shell's features.

(0)  Exit, creating a blank ~/.zshrc file.

(a)  Abort all settings and start from scratch.  Note this will overwrite
     any settings from zsh-newuser-install already in the startup file.
     It will not alter any of your other settings, however.

(q)  Quit and do nothing else.  The function will be run again next time.
--- Type one of the keys in parentheses ---

この表示で (0) をタイプすると、コメントのみの ~/.zshrc が作成され、zsh を利用する準備が整います。

手順③:prezto のセットアップ

prezto は zsh の設定フレームワークのひとつです。

# インストール
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# ~/.zshrc の削除
# 次の手順で~/.zshrcファイルを作成するため。
$ rm ~/.zshrc

# Preztoの設定ファイル作成
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

ここまで来てターミナルを再起動すると、見た目が格好良くなっていると思います!!

更にテーマを変える事ができます。僕は paradox を採用していますが、テーマ一覧はこちらのサイトが参考になるので、気に入ったテーマを設定してみると良いでしょう。設定箇所は下の方です。

$ vi ~/.zpreztorc
・・・
#
# Prompt
#

# Set the prompt theme to load.
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
zstyle ':prezto:module:prompt' theme 'paradox'

ついでに git と補完、シンタックスハイライトのモジュールも有効にしておきます。設定箇所は上の方です。

# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'git' \                  # この行を追加
  'syntax-highlighting' \  # この行を追加
  'autosuggestions' \      # この行を追加
  'prompt'

最後に編集した .zpreztorc を以下のコマンドで読み込みましょう。

$ source ~/.zpreztorc

手順④:zsh-completion のセットアップ

zsh-completion は zsh の補完機能を強化するものです。

# インストール
$ brew install zsh-completion

# zsh 起動時に zsh-completion を読み込む
$ echo 'fpath=(/usr/local/share/zsh-completions $fpath)' >> .zshrc

なお、僕は ~/.zshrc で補完機能を以下のように設定しています。

# -------------------------------------
# 補完機能
# -------------------------------------
# 補完機能の強化
autoload -U compinit
compinit

#補完に関するオプション
setopt auto_param_slash      # ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt mark_dirs             # ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt list_types            # 補完候補一覧でファイルの種別を識別マーク表示 (訳注:ls -F の記号)
setopt auto_menu             # 補完キー連打で順に補完候補を自動で補完
setopt auto_param_keys       # カッコの対応などを自動的に補完
setopt interactive_comments  # コマンドラインでも # 以降をコメントと見なす
setopt magic_equal_subst     # コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt complete_in_word      # 語の途中でもカーソル位置で補完
setopt always_last_prompt    # カーソル位置は保持したままファイル名一覧を順次その場で表示
setopt print_eight_bit       # 日本語ファイル名等8ビットを通す
setopt extended_glob         # 拡張グロブで補完(~とか^とか。例えばless *.txt~memo.txt ならmemo.txt 以外の *.txt にマッチ)
setopt globdots              # 明確なドットの指定なしで.から始まるファイルをマッチ
setopt list_packed           # リストを詰めて表示
bindkey "^I" menu-complete   # 展開する前に補完候補を出させる(Ctrl-iで補完するようにする)

# 補完候補を ←↓↑→ でも選択出来るようにする
zstyle ':completion:*:default' menu select=2

# 補完関数の表示を過剰にする編
zstyle ':completion:*' verbose yes
zstyle ':completion:*' completer _expand _complete _match _prefix _approximate _list _history
zstyle ':completion:*:messages' format $YELLOW'%d'$DEFAULT
zstyle ':completion:*:warnings' format $RED'No matches for:'$YELLOW' %d'$DEFAULT
zstyle ':completion:*:descriptions' format $YELLOW'completing %B%d%b'$DEFAULT
zstyle ':completion:*:corrections' format $YELLOW'%B%d '$RED'(errors: %e)%b'$DEFAULT
zstyle ':completion:*:options' description 'yes'

# グループ名に空文字列を指定すると,マッチ対象のタグ名がグループ名に使われる。
# したがって,すべての マッチ種別を別々に表示させたいなら以下のようにする
zstyle ':completion:*' group-name ''

手順⑤:peco のセットアップ

peco はターミナルで今まで実行したコマンドの履歴を呼び出せるようにするために使います。

$ $ brew install peco

.zshrc に下記を追加して、 『control + R』を押せばコマンド履歴を呼び出せます。

function peco-history-selection() {
    BUFFER=$(history 1 | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\*?\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$LBUFFER")
    CURSOR=${#BUFFER}
    zle reset-prompt
}
zle -N peco-history-selection
bindkey '^R' peco-history-selection

開発環境構築第3回はボリューム感がありましたが、これでターミナルは使い勝手が格段に上がるはずです!カスタマイズ幅が大きいので色々と試してみてください。
次回は『postgresql』について取り上げたいと思います。

それでは、良いターミナルライフを!

この記事の内容が役に立ったと思いましたら、SNSで記事を共有していただけますと幸いです。