ターミナルってよく使うし便利にしたいって思った時が卒業のしどきなので、ささっとiTerm2入れてカスタムしましょ。
はじめに
みなさん、ターミナルカスタマイズしてますか?自分も昔はデフォルトで使っているだけの人間だったのですが、今はある程度カスタマイズをしています。
でも、ターミナルってそもそもカスタマイズできるの?どうやってカスタマイズすればいいの?どの方向にカスタマイズすればいいの?という人向けに、0から完全に導入できるまで説明をします。
参考
自分のdotfilesですここから直接ファイル見たい人はどうぞ。
残念ながらシロモは付属してくれません。独自で導入してください
読むと何ができるか
- ディレクトリ移動が楽になる
- 補完があるので間違いが減る
- 優しいターミナルになる
- あの「l」から始まるコマンドなんだっけ・・・がなくなる
- 普通に楽
対象者
- プログラミングを最近始め、CLIに触れ始めた人
- 普段からCLIをよく使うが、コマンド等々忘れがちな人
- シェルスクリプトとか良くわからないけどオシャレなCLIにしたい人
- zshを使うのに抵抗がない人
- Mac使用者
記事でやること
手順内容
- Homebrewの導入
- Homebrew CaskでのiTerm2導入
- iTerm2の基本設定
- zinitの導入
- zshのテーマ導入
- zinitを通したプラグインの導入
手順
基本的な所から説明します。随時スキップしてください
Homebrewの導入
Homebrewとは
最近ではOSや言語毎にパッケージマネージャとよばれるツールが提供され、ソフトウエアや拡張機能のインストールはパッケージマネージャを利用して行うことが一般的になってきています。HomebrewはMacOS環境におけるいわゆるデファクトスタンダードなパッケージマネージャです。
基本的にプログラミング言語のインストールやデータベースのインストールなどのパッケージはすべてHomebrewを通して行うことが多いです。
Homebrewを使えば自動で依存関係やらPathやらを通してくれることもあるので非常に使いやすいパッケージマネージャーとなっています。アップデートもしてくれるので便利😎
Homebrewインストール
ターミナルを開き、以下のコマンドを叩けばインストールができます。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
詰まってしまった方は以下の詳しいインストール方法を参照してください。
iTerm2導入
iTerm2とは
初期から入っているターミナルの代替品です。
ターミナルよりカスタマイズの幅が広く、透過させたり、背景画像を付けられたり、ショートカットキーで便利に操作ができたり、今のところこれを使っておけば問題なし!って感じです。
iTerm2 - macOS Terminal Replacement
iTerm2インストール
先ほど入れたHomebrewを使ってインストールしてみましょう!
brew install iterm2 --cask
を実行してください。ちなみにcaskというのはGUIアプリ等々をHomebrewで入れる時に使用するコマンドです。
iTerm2設定
無事、インストールできましたか?
iTerm2の設定ですが、ここでは
- HotKeyの設定
- 起動サイズ
- 背景透過
の設定を行なっていきます。
まずHotKeyの設定ですが、HotKeyとはショートカットキーみたいなもので、決められたキーを押すとiTerm2がニュッっと出てくる設定のことです。
iTerm2 HotKey設定
iTerm2を開く
↓
左上のiTermメニューから
Preferences
を開く
↓
ウィンドウのタブから
Keys
を選択
↓
内側のタブでHotKeyを選択
↓
Create a Dedicated Hotkey
↓
HotKeyに自分が設定したいHotKeyをレコーディング(自分はCMD + i)
↓
終わり
これでiTerm2が起動している場合はHotKeyを押せばターミナルがいつでも開くようになります。
トグル式なので、しまうのもHotKeyを押せばいいため、楽になります。
iTerm2起動サイズ設定
ターミナルの大きさは人によって好き好みがありますが、結局のところ最大化させてしまった方が分割もしやすいし、見やすいしで快適になります。大人しく最大化させましょう。
iTerm2を開く
↓
左上のメニューからPreferences
↓
ウィンドウのタブからProfilesを選択し、左サイドバーのProfileNameの中からHotKey Windowを選択してください。
↓
内側のタブでWindowを選択し
中央右にあるStyleの所からMaximizedを選択する
↓
終わり
iTerm2背景透過
ターミナルを全画面で開く時に「あ〜コマンド書いてるんだけど見えね〜」ってなることは避けたいです。
微妙に見えるよう透過させます。設定方法は
iTerm2を開く
↓
左上のメニューからPreferences
↓
内側のタブでWindowを選択し
上左にあるTransparencyのバーを動かしてお好みの透過度に変更する
↓
終わり
iTerm2のショートカットキー
CMD + d
で画面の横分割
CMD + Shift + d
で画面の縦分割
CMD + T
新規タブでターミナルを開く
他にも便利なコマンドはたくさんありますが、最低限ここらへんを覚えておけば便利です。
他にも細かい設定を行いたい場合は以下のリンクを見て変更にチャレンジしてみてください
[iTerm2入門]開発効率アップの基本機能/おすすめ設定をチートシートLikeにまとめたよ
zshの基本設定
以上を参考にパパパッと/.zshrc
に書き込んで行っちゃいましょう!
なんか面倒な人はこっちをコピペしてください
################################# HISTORY #################################
# history
HISTFILE=$HOME/.zsh_history # 履歴を保存するファイル
HISTSIZE=100000 # メモリ上に保存する履歴のサイズ
SAVEHIST=1000000 # 上述のファイルに保存する履歴のサイズ
# share .zshhistory
setopt inc_append_history # 実行時に履歴をファイルにに追加していく
setopt share_history # 履歴を他のシェルとリアルタイム共有する
setopt hist_ignore_all_dups # ヒストリーに重複を表示しない
setopt hist_save_no_dups # 重複するコマンドが保存されるとき、古い方を削除する。
setopt extended_history # コマンドのタイムスタンプをHISTFILEに記録する
setopt hist_expire_dups_first # HISTFILEのサイズがHISTSIZEを超える場合は、最初に重複を削除します
autoload -Uz colors; colors
# Tabで選択できるように
zstyle ':completion:*:default' menu select=2
# 補完候補をそのまま→小文字を大文字→大文字を小文字に変更
zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' '+m:{[:upper:]}={[:lower:]}'
### 補完方法毎にグループ化する。
zstyle ':completion:*' format '%B%F{blue}%d%f%b'
zstyle ':completion:*' group-name ''
# ファイル補完候補に色を付ける
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt auto_param_slash
# カッコを自動補完
setopt auto_param_keys
# ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt mark_dirs
# 補完キー連打で順に補完候補を自動で補完
setopt auto_menu
# スペルミス訂正
setopt correct
# コマンドラインでも # 以降をコメントと見なす
setopt interactive_comments
# コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt magic_equal_subst
# 語の途中でもカーソル位置で補完
setopt complete_in_word
# 日本語ファイル名を表示可能にする
setopt print_eight_bit
# ディレクトリ名だけでcdする
setopt auto_cd
# ビープ音を消す
setopt no_beep
# コマンドを途中まで入力後、historyから絞り込み
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
zinitの導入
いよいよお待ちかねのzinit
の導入です。
【Zsh】大改造ターミナル環境【Zinit】 - Qiita
以上の記事を参考に導入します。
zinitとは
zshのプラグインマネージャーになります。
HomebrewはMacのパッケージマネージャーでしたが、zinitはzshのパッケージマネージャーになります。
数あるzshプラグインマネージャーの中でも起動速度が爆速で、oh-my-zshと比べると月とスッポンくらい違います。
とりえあずは「いい感じに入れるやつ」という認識でひとまずは大丈夫です。
それでも詳しく理解したい方はこちら
zinitインストール
以下のコマンドラインを実行してください。
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
~/.zshrc
にzinitの設定が追記されるので再読み込みを行い、自動更新を有効化します。
ちなみに.zshrc
とはzsh
の設定ファイルです。エイリアスやPATHなどを基本的には書きます。
source ~/.zshrc
zinit self-update
zshのテーマ導入
色々なステータスバーが出たターミナルを見たことはありませんか?それを実現する為に色々カスタマイズを行います。
~/.zshrc
をzinitによってカスタマイズを行なっていきます。
編集中の注意
~/.zshrc
に以下の部分が追加されているので、それより下に追記します。
VS Codeが入っている人はcode ~/.zshrc
でVS codeを開けます。
### Added by Zinit's installer
:
略
:
### End of Zinit's installer chunk
これ以降に設定を追記していく
~/.zshrc
を編集し、iTerm2を再起動するか、source ~/.zshrc
を実行することで自動的にセットアップを行なってくれます。
Powerlevel10kについて
みんな大好きカラフルゴテゴテのPowerlevel10kを導入します。
まず、公式リポジトリはこちらです。
zinit経由でpowerlevel10k導入
では、実際に導入してみましょう。
以下の文を実行してみてください。
echo "zinit ice depth=1; zinit light romkatv/powerlevel10k" >> ~/.zshrc
追記が終わったら、source ~/.zshrc
で再読み込み、またはiTerm2を再起動します。
そうすると初期設定が対話的に聞かれるので、お好みの設定に変更しましょう。
フォント導入
では先ほどのセクション以降に追記します
セットアップですが、専用のフォントが必要になるため、その導入から行なっていきます。
フォント自体はPowerlevel10kのセットアップ時に入れてくれるので、iTerm2の設定だけ行いましょう。
Profilesを開き、
内側のタブのTextを選択、そしてFontから
Meslo Nerd Font
を選択する
これだけで作業は終了します。
powerlevel10kの細かい設定
powerlevel10kの細かい設定ですが、~/.p10k.zsh
というファイルが自動生成されているので、それを編集してさまざまな表示形式を変えます。
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
がプロンプトの右側に表示する情報を決める設定です。
有効化したいところだけコメントを外す、といった感じで簡単にON、OFF切り替えることができます。
これは自分の設定ですが、このように変更すると一番最初の参考のようになります。
# The list of segments shown on the left. Fill it with the most important segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
os_icon # os identifier
dir # current directory
vcs # git status
# =========================[ Line #2 ]=========================
newline # \\n
prompt_char # prompt symbol
)
# The list of segments shown on the right. Fill it with less important segments.
# Right prompt on the last prompt line (where you are typing your commands) gets
# automatically hidden when the input line reaches it. Right prompt above the
# last prompt line gets hidden if it would overlap with left prompt.
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
status # exit code of the last command
command_execution_time # duration of the last command
background_jobs # presence of background jobs
direnv # direnv status (<https://direnv.net/>)
asdf # asdf version manager (<https://github.com/asdf-vm/asdf>)
virtualenv # python virtual environment (<https://docs.python.org/3/library/venv.html>)
anaconda # conda environment (<https://conda.io/>)
pyenv # python environment (<https://github.com/pyenv/pyenv>)
goenv # go environment (<https://github.com/syndbg/goenv>)
nodenv # node.js version from nodenv (<https://github.com/nodenv/nodenv>)
nvm # node.js version from nvm (<https://github.com/nvm-sh/nvm>)
nodeenv # node.js environment (<https://github.com/ekalinin/nodeenv>)
# node_version # node.js version
# go_version # go version (<https://golang.org>)
# rust_version # rustc version (<https://www.rust-lang.org>)
# dotnet_version # .NET version (<https://dotnet.microsoft.com>)
php_version # php version (<https://www.php.net/>)
laravel_version # laravel php framework version (<https://laravel.com/>)
# java_version # java version (<https://www.java.com/>)
# package # name@version from package.json (<https://docs.npmjs.com/files/package.json>)
rbenv # ruby version from rbenv (<https://github.com/rbenv/rbenv>)
rvm # ruby version from rvm (<https://rvm.io>)
fvm # flutter version management (<https://github.com/leoafarias/fvm>)
luaenv # lua version from luaenv (<https://github.com/cehoffman/luaenv>)
jenv # java version from jenv (<https://github.com/jenv/jenv>)
plenv # perl version from plenv (<https://github.com/tokuhirom/plenv>)
phpenv # php version from phpenv (<https://github.com/phpenv/phpenv>)
scalaenv # scala version from scalaenv (<https://github.com/scalaenv/scalaenv>)
haskell_stack # haskell version from stack (<https://haskellstack.org/>)
kubecontext # current kubernetes context (<https://kubernetes.io/>)
terraform # terraform workspace (<https://www.terraform.io>)
aws # aws profile (<https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html>)
aws_eb_env # aws elastic beanstalk environment (<https://aws.amazon.com/elasticbeanstalk/>)
azure # azure account name (<https://docs.microsoft.com/en-us/cli/azure>)
gcloud # google cloud cli account and project (<https://cloud.google.com/>)
google_app_cred # google application credentials (<https://cloud.google.com/docs/authentication/production>)
context # user@hostname
nordvpn # nordvpn connection status, linux only (<https://nordvpn.com/>)
ranger # ranger shell (<https://github.com/ranger/ranger>)
nnn # nnn shell (<https://github.com/jarun/nnn>)
xplr # xplr shell (<https://github.com/sayanarijit/xplr>)
vim_shell # vim shell indicator (:sh)
midnight_commander # midnight commander shell (<https://midnight-commander.org/>)
nix_shell # nix shell (<https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html>)
vi_mode # vi mode (you don't need this if you've enabled prompt_char)
# vpn_ip # virtual private network indicator
load # CPU load
disk_usage # disk usage
ram # free RAM
# swap # used swap
todo # todo items (<https://github.com/todotxt/todo.txt-cli>)
timewarrior # timewarrior tracking status (<https://timewarrior.net/>)
taskwarrior # taskwarrior task count (<https://taskwarrior.org/>)
time # current time
# =========================[ Line #2 ]=========================
newline
ip # ip address and bandwidth usage for a specified network interface
# public_ip # public IP address
# proxy # system-wide http/https/ftp proxy
# battery # internal battery
# wifi # wifi speed
# example # example user-defined segment (see prompt_example function below)
)
zshプラグイン導入
プラグインとは
この記事の言いたかった部分はここですプラグインの導入によって、今までの作業が段違いに楽になります。
プラグインは現在の機能に追加で機能を付け足すことで、VS Codeの拡張機能のようなものと同様です。入れ方は簡単でzinit light (リポジトリ名)
で勝手にダウンロードしてきてくれるので、簡単にインストールができます。(例外はあります)
詳しくは先ほど同様、こちらの記事を参照すると良いでしょう。
基本的にコピペで導入できます。
【⭐️⭐️⭐️】補完機能【必須】
プレースホルダーのように、以前使ったことのあるコマンドの場合は背景に薄く候補を出してくれる優しいプラグインです。zsh-autocompleteと噛み合わせが悪く、Zshが膨張するかもしれません。
echo "zinit light zsh-users/zsh-autosuggestions" >> ~/.zshrc
死ぬほど便利です。
zsh-autocompleteはオススメNo.1です。しかし1つデメリットがあって
zsh-users/zsh-autosuggestions
と少し相性が悪く、gitのコミットメッセージ等で使ってしまうと無限に検索が走り、CPU使用率が鬼のようになってしまう時があります。
面倒ですが、その度にアクティビティモニターで強制キルするしかありません。背に腹は変えられないですね・・・。
marlonrichert/zsh-autocomplete
echo "zinit light marlonrichert/zsh-autocomplete" >> ~/.zshrc
### 【⭐️⭐️⭐️】シンタックスハイライト【必須】
見やすいように色分けしてくれます
zdharma/fast-syntax-highlighting
【⭐️⭐️⭐️】anyframe【必須】
後述の履歴検索などにpecoを使うために導入してます。
こちらで製作者さん自らの記事があるので、読んでみてください。
zshでpecoと連携するためのanyframeというプラグインを作った - Qiita
echo "zinit light mollifier/anyframe" >> ~/.zshrc
### 【⭐️⭐️】Ctrl + rでコマンド履歴を検索【あると便利】
zdharma/history-search-multi-word
【⭐️⭐️】catコマンドを見やすく表示する【あると便利】
catのプレーンテキストで読んでる人、もっと見やすい方法があります。
# 追記
zinit ice as"program" from"gh-r" mv"bat* -> bat" pick"bat/bat"
zinit light sharkdp/bat
# 以下はただのエイリアス設定
if builtin command -v bat > /dev/null; then
alias cat="bat"
fi
【⭐️⭐️】jqをインタラクティブに使える【あると便利】
jqをインタラクティブに使える。JSONを標準出力に出すコマンドを入力した状態で Alt+j
するとjqのクエリが書ける。
要jq
brew install jq
echo "zinit light reegnz/jq-zsh-plugin" >> ~/.zshrc
【⭐️】Gitの変更状態がわかる【人によっては役立つ】
使う機会はそんなに多くないだろうけど・・・かっこよくない?
Gitの変更状態がわかるls。lsの代わりにコマンド k
を実行するだけ
echo "zinit light supercrabtree/k" >> ~/.zshrc
【⭐️】AWS CLI v2の補完【人によっては役立つ】
AWSよく使う人なら利便性がわかるはず・・・!
要AWS CLI v2
この順序で記述しないと complete:13: command not found: compdef
のようなエラーになるので注意
# .zshrcに追記
autoload bashcompinit && bashcompinit
source ~/.zinit/plugins/drgr33n---oh-my-zsh_aws2-plugin/aws2_zsh_completer.sh
complete -C '/usr/local/bin/aws_completer' aws
zinit light drgr33n/oh-my-zsh_aws2-plugin
めんどいからコピペしたいって人用
~/.zshrc
の中の最終行から追記してください。
# jq をインタラクティブに使える。JSONを標準出力に出すコマンドを入力した状態で `Alt+j` すると jq のクエリが書ける。
# 要 jq
zinit light reegnz/jq-zsh-plugin
# Gitの変更状態がわかる ls。ls の代わりにコマンド `k` を実行するだけ。
# zinit light supercrabtree/k
# AWS CLI v2の補完。
# 要 AWS CLI v2
# この順序で記述しないと `complete:13: command not found: compdef` のようなエラーになるので注意
autoload bashcompinit && bashcompinit
source ~/.zinit/plugins/drgr33n---oh-my-zsh_aws2-plugin/aws2_zsh_completer.sh
complete -C '/usr/local/bin/aws_completer' aws
zinit light drgr33n/oh-my-zsh_aws2-plugin
# anyframeのセットアップ
zinit light mollifier/anyframe
# クローンしたGit作業ディレクトリで、コマンド `git open` を実行するとブラウザでGitHubが開く
# zinit light paulirish/git-open
# powerlevel10k zshのテーマ
zinit ice depth=1; zinit light romkatv/powerlevel10k
# 補完
# zinit ice wait'0'; zinit light zsh-users/zsh-completions
# autoload -Uz compinit && compinit
# zinit light zsh-users/zsh-autosuggestions
zinit light marlonrichert/zsh-autocomplete
# laravel artisan補完
# zinit light jessarcher/zsh-artisan
# シンタックスハイライト
# zinit light zdharma/fast-syntax-highlighting
# Ctrl+r でコマンド履歴を検索
zinit light zdharma/history-search-multi-word
zinit ice as"program" from"gh-r" mv"bat* -> bat" pick"bat/bat"
zinit light sharkdp/bat
# 以下はただのエイリアス設定
if builtin command -v bat > /dev/null; then
alias cat="bat"
fi
# iTerm2を使っている場合に、コマンド `tt タブ名` でタブ名を変更できる
zinit light gimbo/iterm2-tabs.zsh
# zの導入
zinit load agkozak/zsh-z
その他入れたい場合
おわりに
その他何か便利そうなのがあれば共有いただけると幸いです。git openというのもあり、便利そうだったのですが、実はちゃんと動いてくれないので、何が原因なのか調査してる最中です・・・
普段からたくさん使うターミナルなので、ぜひ便利にカスタマイズしまくちゃってください!!!
では、ハッピーターミナルライフを〜
参考文献
[iTerm2入門]開発効率アップの基本機能/おすすめ設定をチートシートLikeにまとめたよ
iTerm2のおすすめ設定〜ターミナル作業を効率化する〜 - Qiita
【Zsh】大改造ターミナル環境【Zinit】 - Qiita