Mac: ターミナルとプロンプトをカスタマイズする(zsh)

はじめに

今回はmacOSにおけるターミナルとzshプロンプトのカスタマイズ方法についてまとめる。※本記事はすべて個人の好みです。

環境情報

macOS Big Sur
バージョン 11.6.2

Before→After

なんということでしょう

Before

カスタマイズ前のターミナル

After

カスタマイズ後のターミナル

用語の解説

ターミナル、シェル、カーネルの関係
※引用元: シェルの概念と機能

カーネルとは:

CPUやメモリなどのハードウェアを管理するとともに、コマンド実行を処理するプロセス管理も行なっているOSの中核となる部分のこと。直接ユーザがカーネルを操作することはできないため、操作する際はユーザとカーネルを仲介するインターフェースであるシェルが必要になる。

シェルとは:

カーネルのインターフェースとなっているソフトウェアのこと。ユーザから見てカーネルの周りを覆っている「殻」(shell) のように見えることからシェルと呼ばれるが、実際はユーザとカーネルのメッセンジャーのような働きをする。シェルの種類として、bash, dash, zshなどがある。

ターミナルとは:

昔は「ユーザがコンピュータへ入出力する際に利用する専用のハードウェア」の意味で用いられていたが、現在では、物理的なターミナルをソフトウェアによって実装したターミナルエミュレータの意図で用いられることが多い。ターミナルエミュレータは入出力のための画面を提供するソフトウェアであり、OSごとに多くのターミナルエミュレータが開発されている。 ターミナルエミュレータという画面の中で、カーネルのインターフェースであるシェルが動いており、両者は全く異なるソフトウェアである点に注意する。

OS ターミナルエミュレータ例
Windows PuTTY, Tera Term
macOS ターミナル, iTerm2
Linux Konsole

プロンプトとは:

シェルが表示している「コマンド入力待ち状態であることを表す記号」のこと。

プロンプト例

カスタマイズ方法

以下4箇所のカスタマイズを行う。

  1. ターミナルのテーマをIcebergに変更
  2. フォントをMenlo 14ppに変更
  3. プロンプトの変更
  4. zshプラグインの追加

1. ターミナルのテーマをIcebergに変更

(1) 公式ページからIcebergをダウンロードする
cocopon.github.io

(2) ダウンロードしたプロファイルを読み込み、デフォルトプロファイルに設定する

環境設定を押下して、プロファイルの設定画面を表示
「読み込む」からIcebergを読み込み、デフォルトに設定
※ちなみに「ターミナルは半透明の方がクールだ説」があるが、見にくかったので今回は不採用。もし設定したければ、「ターミナル > 環境設定 > プロファイル」から背景の「カラーとエフェクト」で設定可能。

2. フォントをMenlo 14ppに変更

(1) プロファイル設定画面からフォントの変更を押下する
(2) フォントをMenloに変更し、サイズを14に設定する

変更を押下
フォントをMenlo、サイズを14に変更

3. プロンプトの変更

(1) .zshrcプロファイルを作成する

 touch ~/.zshrc

(2) .zshrcプロファイルを開く

cd ~
vim .zshrc

(3) 以下を.zshrcプロファイルにコピペする
※引用元: macOSマシンを購入した際に最初にやるセットアップまとめ【エンジニア向け?】 | HIRO LAB BLOG

# License : MIT
# http://mollifier.mit-license.org/
 
########################################
# 環境変数
export LANG=ja_JP.UTF-8
 
# 色を使用出来るようにする
autoload -Uz colors
colors
 
# emacs 風キーバインドにする
bindkey -e
 
# ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# 改変箇所_1
# 時間表記の追加
setopt extended_history
alias history='history -t "%F %T"'

# プロンプト
# 1行表示
# PROMPT="%~ %# "

# 改変箇所_2
PROMPT="%{${fg[blue]}%}%n:%{${reset_color}%} %c/ %# "
# 2行表示
# PROMPT="%{${fg[green]}%}[%n@%m]%{${reset_color}%} %~
# %# " 

# 改変箇所_3
# 出力の後に改行を入れる
function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'
 
# 単語の区切り文字を指定する
autoload -Uz select-word-style
select-word-style default
# ここで指定した文字は単語区切りとみなされる
# / も区切りと扱うので、^W でディレクトリ1つ分を削除できる
zstyle ':zle:*' word-chars " /=;@:{},|"
zstyle ':zle:*' word-style unspecified
 
########################################
# 補完
# 補完機能を有効にする
autoload -Uz compinit
compinit
 
# 補完で小文字でも大文字にマッチさせる
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
 
# ../ の後は今いるディレクトリを補完しない
zstyle ':completion:*' ignore-parents parent pwd ..
 
# sudo の後ろでコマンド名を補完する
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
                   /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
 
# ps コマンドのプロセス名補完
zstyle ':completion:*:processes' command 'ps x -o pid,s,args'
 
########################################
# vcs_info
autoload -Uz vcs_info
autoload -Uz add-zsh-hook
 
zstyle ':vcs_info:*' formats '%F{green}(%s)-[%b]%f'
zstyle ':vcs_info:*' actionformats '%F{red}(%s)-[%b|%a]%f'
 
function _update_vcs_info_msg() {
    LANG=en_US.UTF-8 vcs_info
    RPROMPT="${vcs_info_msg_0_}"
}
add-zsh-hook precmd _update_vcs_info_msg
 
########################################
# オプション
# 日本語ファイル名を表示可能にする
setopt print_eight_bit
 
# beep を無効にする
setopt no_beep
 
# フローコントロールを無効にする
setopt no_flow_control
 
# Ctrl+Dでzshを終了しない
setopt ignore_eof
 
# '#' 以降をコメントとして扱う
setopt interactive_comments
 
# ディレクトリ名だけでcdする
setopt auto_cd
 
# cd したら自動的にpushdする
setopt auto_pushd
# 重複したディレクトリを追加しない
setopt pushd_ignore_dups
 
# 同時に起動したzshの間でヒストリを共有する
setopt share_history
 
# 同じコマンドをヒストリに残さない
setopt hist_ignore_all_dups
 
# スペースから始まるコマンド行はヒストリに残さない
setopt hist_ignore_space
 
# ヒストリに保存するときに余分なスペースを削除する
setopt hist_reduce_blanks
 
# 高機能なワイルドカード展開を使用する
setopt extended_glob
 
########################################
# キーバインド
 
# ^R で履歴検索をするときに * でワイルドカードを使用出来るようにする
bindkey '^R' history-incremental-pattern-search-backward
 
########################################
# エイリアス
 
alias la='ls -a'
alias ll='ls -l'
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
 
alias mkdir='mkdir -p'
 
# sudo の後のコマンドでエイリアスを有効にする
alias sudo='sudo '
 
# グローバルエイリアス
alias -g L='| less'
alias -g G='| grep'
 
# C で標準出力をクリップボードにコピーする
# mollifier delta blog : http://mollifier.hatenablog.com/entry/20100317/p1
if which pbcopy >/dev/null 2>&1 ; then
    # Mac
    alias -g C='| pbcopy'
elif which xsel >/dev/null 2>&1 ; then
    # Linux
    alias -g C='| xsel --input --clipboard'
elif which putclip >/dev/null 2>&1 ; then
    # Cygwin
    alias -g C='| putclip'
fi
 
########################################
# OS 別の設定
case ${OSTYPE} in
    darwin*)
        #Mac用の設定
        export CLICOLOR=1
        alias ls='ls -G -F'
        ;;
    linux*)
        #Linux用の設定
        alias ls='ls -F --color=auto'
        ;;
esac

# vim:set ft=zsh:

記事元から以下の3箇所を追記/変更している。

・ヒストリーコマンドに時間表記の追加

setopt extended_history
alias history='history -t "%F %T"'

ヒストリーコマンドに時間表記の追加

・プロンプト表示の変更
表示形式: <ユーザ名>:<カレントディレクトリ(相対パス)><ユーザ種別>
※ユーザ種別: #(root), %(root以外)

PROMPT="%{${fg[blue]}%}%n:%{${reset_color}%} %c/ %# "

プロンプト表示の変更

・結果出力後に改行を追加

function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'

4. zshプラグインの追加

実用性を高めるためにzshプラグインを追加する

  • コマンド補完: zsh-autosuggestions, zsh-completions, spaceship-prompt

  • syntax highlight: zsh-syntax-highlighting

  • history補完: zsh-history-substring-search

(1) .zshrcプロファイルを開く

cd ~
vim .zshrc

(2) 以下を.zshrcプロファイルにコピペする

#=============================
# source zsh-syntax-highlighting
#=============================
if [ -f ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
  source ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi

#=============================
# source zsh-autosuggestions
#=============================
if [ -f ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then
  source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
fi

#=============================
# source zsh-completions
#=============================
if [ -f ~/.zsh/zsh-completions/zsh-completions.zsh ]; then
  source ~/.zsh/zsh-completions/zsh-completions.zsh
fi

#=============================
# source zsh-history-substring-search
#=============================
if [ -f ~/.zsh/zsh-history-substring-search/zsh-history-substring-search.zsh ]; then
  source ~/.zsh/zsh-history-substring-search/zsh-history-substring-search.zsh
fi

#=============================
# source spaceship-prompt
#=============================
if [ -f ~/.zsh/spaceship-prompt/spaceship-prompt.zsh ]; then
  source ~/.zsh/spaceship-prompt/spaceship-prompt.zsh
fi

まとめ

今回はmacOSにおけるターミナルとzshプロンプトのカスタマイズ方法についてまとめた。ターミナルとプロンプトをカスタマイズするとテンションも上がるので、ぜひやってみてください。

参考