2018.2.18

zshでターミナルの快適な操作環境を設定する

ターミナルをGitやコーディング時に使用するという前提で今回の記事を作成しました。

数あるシェルの中のひとつzshを使い環境を構築していきます。

この記事に記載されている通りに設定をすると、

  • カレントディレクトリを分かりやすく表示させる
  • gitのbranchの状態を可視化出来る
  • gitを含め、コマンドの入力補完が可能になる

このようなターミナルにカスタマイズすることが出来ます。

初めに

zshがインストールされているかの確認

zsh --version

バージョンが表示されなかったらzshをインストールをします。

zshをインストールする

パッケージマネージャーの「Homebrew」でインストールをしたいので、インストールされていない方は以下のサイトを参考にインストールをして下さい。

参考:MacにHomebrewをインストールする

 

■ Homebrewでzshをインストールする

下記コマンドでインストールをします。

brew install zsh

 

■ zshを使えるようにパスを追加する

インストール後、/private/etc/shellsに以下を追記します。

/bin/zsh

 

■ ログインシェルをzshに変更する

下記コマンドでログインシェルをzshに変更します。

chsh -s /bin/zsh

 

最後に、ターミナルアプリを再起動して設定を適用させます。

zshの環境を構築していく

設定ファイルの作成

設定ファイルをホームディレクトリ(/Users/ユーザ名)に作成します。

ファイル名は.zshrcにして、下記のコードを貼り付けて下さい。

# --------------------------------------------------
#  カレントディレクトリ表示(左)
# --------------------------------------------------

PROMPT='
%F{green}%(5~,%-1~/.../%2~,%~)%f
%F{green}%B●%b%f'

# --------------------------------------------------
#  git branch状態を表示(右)
# --------------------------------------------------

autoload -Uz vcs_info
setopt prompt_subst

# true | false
# trueで作業ブランチの状態に応じて表示を変える
zstyle ':vcs_info:*' check-for-changes false
# addしてない場合の表示
zstyle ':vcs_info:*' unstagedstr "%F{red}%B+%b%f"
# commitしてない場合の表示
zstyle ':vcs_info:*' stagedstr "%F{yellow}★ %f"
# デフォルトの状態の表示
zstyle ':vcs_info:*' formats "%u%c%F{green}【 %b 】%f"
# コンフリクトが起きたり特別な状態になるとformatsの代わりに表示
zstyle ':vcs_info:*' actionformats '【%b | %a】'

precmd () { vcs_info }

RPROMPT=$RPROMPT'${vcs_info_msg_0_}'

# --------------------------------------------------
#  gitコマンド補完機能セット
# --------------------------------------------------

# autoloadの文より前に記述
fpath=(~/.zsh/completion $fpath)

# --------------------------------------------------
#  コマンド入力補完
# --------------------------------------------------

# 補完機能有効にする
autoload -U compinit
compinit -u

# 補完候補に色つける
autoload -U colors
colors
zstyle ':completion:*' list-colors "${LS_COLORS}"

# 単語の入力途中でもTab補完を有効化
setopt complete_in_word
# 補完候補をハイライト
zstyle ':completion:*:default' menu select=1
# キャッシュの利用による補完の高速化
zstyle ':completion::complete:*' use-cache true
# 大文字、小文字を区別せず補完する
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 補完リストの表示間隔を狭くする
setopt list_packed

# コマンドの打ち間違いを指摘してくれる
setopt correct
SPROMPT="correct: $RED%R$DEFAULT -> $GREEN%r$DEFAULT ? [Yes/No/Abort/Edit] => "

# --------------------------------------------------
#  $ cd 機能拡張
# --------------------------------------------------

# cdを使わずにディレクトリを移動できる
setopt auto_cd
# $ cd - でTabを押すと、ディレクトリの履歴が見れる
setopt auto_pushd

# --------------------------------------------------
#  $ tree でディレクトリ構成表示
# --------------------------------------------------

alias tree="pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g'"

# --------------------------------------------------
#  git エイリアス
# --------------------------------------------------

alias g="git"
compdef g=git

alias gs='git status --short --branch'
alias ga='git add -A'
alias gc='git commit -m'
alias gps='git push'
alias gpsu='git push -u origin'
alias gp='git pull origin'
alias gf='git fetch'
alias gfp='git fetch -p'

# logを見やすく
alias gl='git log --abbrev-commit --no-merges --date=short --date=iso'
# grep
alias glg='git log --abbrev-commit --no-merges --date=short --date=iso --grep'
# ローカルコミットを表示
alias glc='git log --abbrev-commit --no-merges --date=short --date=iso origin/html..html'

alias gd='git diff'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gb='git branch'
alias gba='git branch -a'
alias gbr='git branch -r'

alias gm='git merge'
alias gr='git reset'


# --------------------------------------------------
#  その他のエイリアス
# --------------------------------------------------

alias B='php ./build'
alias CB='cd ./build_company'

alias cw='compass watch --time'

# --------------------------------------------------
#  bindkey
# --------------------------------------------------

# bindkeyを任意のキー(commandとかoption)にする設定方法
# 1. iTerm2の環境設定>Keys>追加(+)
# 2. keyboard shortcut → 任意のキー | action → Send Escape Sequence | Esc+ → ●●●●●
# 3. bindekeyの設定で「bindkey '^[●●●●●' 関数名」にする

# コミット 3行用
function git_commit() {
	BUFFER='git commit -m "#'
	CURSOR=$#BUFFER
	BUFFER=$BUFFER'" -m "" -m ""'
}
zle -N git_commit
bindkey '^[git_commit' git_commit

# タブに名前を付ける
function tab_rename() {
	BUFFER="echo -ne \"\e]1;"
	CURSOR=$#BUFFER
	BUFFER=$BUFFER\\a\"
}
zle -N tab_rename
bindkey '^[tab_rename' tab_rename

# 単語単位で削除(前後)
# 前:option ,
# 後:option .
bindkey '^[word-remove-right' kill-word
bindkey '^[word-remove-left' backward-kill-word

gitで補完機能を使うための設定

gitで「補完機能を使わない」という方は、先程貼り付けたコードのfpath=(~/.zsh/completion $fpath)の箇所をコメントアウト(行頭に#を付ける)をするか削除をして下さい。

そして、このセクションの操作はする必要はなく、これでzshの環境設定は終了です。

gitの補完機能を使いたい方は、下記の手順を行って下さい。

 

■ 現在適用されているgitのバージョンの確認

git --version

 

■ gitがhomebrewでインストールされているかの確認

brew list

gitが表示されなかったらhomebrewではなく、違う方法でインストールされているので、下記の手順に従ってhomebrewでgitをインストールして下さい。

 

■ homebrewでgitをインストール

brew install git

インストール後、brew listgitが表示されていればhomebrewでのインストールは成功です。

再び、git --versionで現在適用されているgitのバージョンを確認します。

バージョンに (Apple Git-◯◯)が表示されていたり、バージョンが先程確認したままの場合、homebrew以外でインストールしたgitが適用されています。

その場合、/private/etc/pathsに記載されている/usr/local/binを一番上の行に移動させます。

 

■ 補完ファイルの確認

下記コマンドを実行します。

ls -l `brew --prefix`/share/zsh/site-functions/

以下のように、〜_git〜git-completion.bashが表示されていれば問題ありません。

total 24
lrwxr-xr-x 1 ユーザ名 admin 56 2 17 22:03 _git -> ../../../Cellar/git/2.16.2/share/zsh/site-functions/_git
lrwxr-xr-x 1 ユーザ名 admin 71 2 17 22:03 git-completion.bash -> ../../../Cellar/git/2.16.2/share/zsh/site-functions/git-completion.bash

もし表示されなかった場合は下記コマンドを実行後、もう一度確認をしてみて下さい。

brew link git

それでもダメな場合、下記コマンドを実行して下さい。

brew link --overwrite git

このコマンドはHomebrewにシンボリックリンクを再作成させるコマンドで、--overwriteを付けることで強制的にリンクを上書きしています。

シンボリックリンクとは

 

■ zcompdumpをリビルド

最後に、下記コマンドを実行します。

rm -f ~/.zcompdump; compinit

 

以上で、gitで補完機能を使うための設定は終了です。そして、今回の記事で設定しなければいけないことも全て終了です。

また、これより下では設定ファイルのコードの説明しておりますので、カスタマイズする際に少しでもお役に立てて頂ければと思います。

設定ファイルの説明

カレントディレクトリ表示

PROMPT='
%F{green}%(5~,%-1~/.../%2~,%~)%f
%F{green}%B●%b%f '

以下画像のbeforeが設定前の状態、afterが上記コードの設定後の表示になります。

PROMPT=' 'でターミナルの左側に指定した内容を表示させています。
' 'の中で改行をすれば、それもターミナル上で反映されます。上記のコードでは一行目を改行のみにすることで、コマンドとコマンドの間を一行分空けて見やすくしています。

 

%(5~,%-1~/.../%2~,%~)でカレントディレクトリのパスを表示しており、フルパスにすると長くなり過ぎることがあるので、ホームディレクトリからカレントディレクトリまで3階層以上ある場合、そのパスを...で代替表示させています。

フルパスを表示させたい場合は%(5~,%-1~/.../%2~,%~)%d%~にします。

また、%の後の文字を変えると、様々な情報を表示することが出来ます。下記は表示できる情報の一例です。

  • ユーザー名:%n
  • ホスト名:%M
  • 日付:%D または %W
  • 時間:%* または %T

 

%F{green}%B●%b%f 'は「●」のテキストを緑色かつ太字にしています。

テキストの文字色を変えるには%F{color}%fでテキストを挟みます。colorには「red」「yellow」などの単語を入れることが出来ます。

文字を太字にするには%Bb%でテキストを挟みます。

gitのbranchの状態を可視化

autoload -Uz vcs_info
setopt prompt_subst
# true | false
# trueで作業ブランチの状態に応じて表示を変える
zstyle ':vcs_info:*' check-for-changes true
# addしてない場合の表示
zstyle ':vcs_info:*' unstagedstr "%F{red}%B+%b%f"
# commitしてない場合の表示
zstyle ':vcs_info:*' stagedstr "%F{yellow}★ %f"
# デフォルトの状態の表示
zstyle ':vcs_info:*' formats "%u%c%F{green}【%b】%f"
# コンフリクトが起きたり特別な状態になるとformatsの代わりに表示
zstyle ':vcs_info:*' actionformats '【%b | %a】'

precmd () { vcs_info }

RPROMPT=$RPROMPT'${vcs_info_msg_0_}'

適応後の状態が以下画像です。

また、ブランチ名の左のマークの意味は以下の通りです。

  • addしていないファイルがある場合:+
  • indexにcommitしていないファイルがある場合:★

 

zstyle ':vcs_info:*' check-for-changes trueでブランチの状態を取得して「add」や「commit」しているかどうかを判断しています。

gitのリポジトリが重いとターミナルの操作も重くなってしまうので、その場合falseにしてこの機能をオフにしましょう。

gitコマンド補完機能をセット

fpath=(~/.zsh/completion $fpath)を記述することでgitコマンドの補完機能の準備は完了です。後は、ターミナル自体のコマンド補完機能を有効にすれば、gitコマンドを入力時、補完機能を使うことが出来ます。

※ターミナルのコマンド補完機能を有効にする記述はこの下の項目の「コマンド入力補完」で紹介しています。

補完機能の使い方の例です。

  • git checkoutと入力した後にTabキーを押すと、リモートブランチ一覧が表示されTabキーや↑↓キーでブランチを選択出来ます。
  • git log -- と入力した後にTabキーを押すと、do you wish to see all 101 possibilities (26 lines)?と聞かれるので、もう一度Tabキーを押します。すると、git logのオプション一覧が表示されるので、さらにTabキーを押すとオプションを選択出来ます。

コマンド入力補完

# 補完機能有効にする
autoload -U compinit
compinit -u

# 補完候補に色つける
autoload -U colors
colors
zstyle ':completion:*' list-colors "${LS_COLORS}"

# 単語の入力途中でもTab補完を有効化
setopt complete_in_word
# 補完候補をハイライト
zstyle ':completion:*:default' menu select=1
# キャッシュの利用による補完の高速化
zstyle ':completion::complete:*' use-cache true
# 大文字、小文字を区別せず補完する
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 補完リストの表示間隔を狭くする
setopt list_packed

# コマンドの打ち間違いを指摘してくれる
setopt correct
SPROMPT="correct: $RED%R$DEFAULT -> $GREEN%r$DEFAULT ? [Yes/No/Abort/Edit] => "

autoload -U compinitcompinit -uを記述することで補完機能を有効にします。

 

compinit -uより下の記述は補完機能をより便利にするものです。

 

setopt correctを設定していると、コマンドを打ち間違えた状態で実行してしまった場合、正しいコマンドを予測して実行するかどうかなど、選択肢を与えてくれます。

以下の場合、cdと入力するつもりがceと入力して実行してしまった時の例です。

correct: ce -> cd ? [Yes/No/Abort/Edit] =>

この場合、「"ce"と入力したけど"cd"の間違えではないですか?」のように聞かれており、この状態で任意のキー(Yesなら"y"、Noなら"n")を入力することでそれぞれの処理を行ってくれます。

任意のキー行う処理
y(Yes)cdを実行
n(No)ceを実行
a(Abort)何も実行しない
e(Edit)ceと入力した状態に戻す

$ cd 機能拡張

# cdを使わずにディレクトリを移動できる
setopt auto_cd
# $ cd - でTabを押すと、ディレクトリの履歴が見れる
setopt auto_pushd

通常、カレントディレクトリを移動する場合、cdの後にパスを入力しますが、setopt auto_cdを記述しているとcdを省略することが出来ます。

setopt auto_pushdを記述することで、cd -を実行したら自分が移動したディレクトリの履歴が表示され、そこから移動先をTabキーで選択することが出来ます。

$ tree でディレクトリ構成を表示

以下の記事で紹介している通りです。

ターミナルの覚えておきたい操作方法まとめ

gitコマンドのエイリアス

alias g="git"
compdef g=git

alias gs='git status --short --branch'
alias ga='git add -A'
alias gc='git commit -m'
alias gps='git push'
alias gpsu='git push -u origin'
alias gp='git pull origin'
alias gf='git fetch'
alias gfp='git fetch -p'

# logを見やすく
alias gl='git log --abbrev-commit --no-merges --date=short --date=iso'
# grep
alias glg='git log --abbrev-commit --no-merges --date=short --date=iso --grep'
# ローカルコミットを表示
alias glc='git log --abbrev-commit --no-merges --date=short --date=iso origin/html..html'

alias gd='git diff'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gb='git branch'
alias gba='git branch -a'
alias gbr='git branch -r'

alias gm='git merge'
alias gr='git reset'

gitコマンドのエイリアスを定義しています。

ターミナルでのエイリアスとは、指定したコマンドを任意のキーで実行出来るようにするものです。

  • gsを入力するとgit statusを実行してくれます。
  • エイリアスの後にオプション等を追記して実行することも出来ます。gc "#12345 test"を入力するとgit commit -m "#12345 test"を実行してくれます。
  • エイリアスのコマンドと同時に補完機能を使うことも出来ます。gd --と入力してTabキーを押すと、diffのオプション一覧を表示してくれます

bindkey

# コミット 3行用
function git_commit() {
BUFFER='git commit -m "#'
CURSOR=$#BUFFER
BUFFER=$BUFFER'" -m "" -m ""'
}
zle -N git_commit
bindkey '^[git_commit' git_commit

# タブに名前を付ける
function tab_rename() {
BUFFER="echo -ne \"\e]1;"
CURSOR=$#BUFFER
BUFFER=$BUFFER\\a\"
}
zle -N tab_rename
bindkey '^[tab_rename' tab_rename

# 単語単位で削除(前後)
# 前:option ,
# 後:option .
bindkey '^[word-remove-right' kill-word
bindkey '^[word-remove-left' backward-kill-word

このbindkeyiTrem2というターミナルアプリとセットで使える設定になります。詳しくは以下の記事を読んでみて下さい。

参考:zshとiTerm2でキーボードショートカットを自由に作る

まとめ

今回は、Gitやコーディング時に使用する必要な機能のみを設定していきましたが、「Oh-my-zsh」「Prezto」といったプラグインを利用すれば一気に設定することも可能です。しかし、個人的にこれらのプラグイン(特にOh-my-zsh)は、機能が多すぎて持て余してしまうという印象が強いです。機能が多いとその分、動作が重くなることもあります。

自分なりに使いやすいように設定をして、少しでもストレスフリーな作業環境を作りましょう。

シェアする
フォローする
Web-Guided - web業界で働く方を少しだけ手助けするメディア