👩‍💻

楽しく開発するための私のターミナル設定

に公開

CodexやClaude Codeなどの普及により、ターミナル環境に触れる時間が増えた方も多いのではないでしょうか。

私自身もともとターミナル環境が好きで、日常のなかで最も長く接している画面とも言えます。

ターミナルのスクショ
普段使っているターミナルの画面

毎日使うターミナル環境だからこそ、もっと便利に、もっと楽しく使えるものになれば素敵だと思いませんか?

そんな気持ちで私のカスタマイズについて紹介していきます。
この記事が、ターミナル環境をすこし良くする一助になれば嬉しいです 🙏

前提

私の環境は以下の通りです。

  • 仕事:Webエンジニア(フロントエンド)
  • OS:macOS 15.6.1
  • シェル:zsh

シェルのカスタマイズ

zshを使っています。
最近のmacOSを使っている方であれば、デフォルトのシェルはこれのはずです。

一般設定

最低限のものだけなので、折り畳みで置いておきます。

zshrc
.zshrc
# ベル無効
setopt no_beep

# 補完候補を方向キーで選択可能にする
zstyle ':completion:*:default' menu select=2

# 入力ミスを訂正
setopt correct

# 日本語ファイル名に対応
setopt print_eight_bit

# ディレクトリ末尾に/を自動付与
setopt auto_param_slash

# ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt mark_dirs

# ファイルの種類を示すマークを表示
setopt list_types

# Tab連打で候補を切り替え
setopt auto_menu

# =以降も補完
setopt magic_equal_subst

# 入力途中でも補完
setopt complete_in_word

# ドット無しで隠しファイルをマッチ
setopt globdots

# 大文字・小文字を区別しない
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# Ctrl+Dでログアウトしない
setopt IGNORE_EOF

# zmv
autoload -Uz zmv

#
# 履歴
#

export HISTFILE=${HOME}/.zhistory
export HISTSIZE=1000
export SAVEHIST=2000

# スペースで始まるコマンドを除外
setopt hist_ignore_space

# 重複するコマンドを除外
setopt hist_ignore_dups

# ヒストリに同じコマンドがあるなら古い方を削除
setopt hist_ignore_all_dups

zshプラグイン

プラグインマネージャー

sheldonを使っています。

https://github.com/rossmacarthur/sheldon

  • コマンドで簡単にプラグインを追加できる
  • 設定ファイルがTOMLなので、手動でも編集しやすい

のが良いところかなと思っています。

設定がzshrcに1行書くだけなのも、ごちゃごちゃしなくて好きです。

.zshrc
# これだけ
eval "$(sheldon source)"

見た目系

テーマ

カレントディレクトリとブランチのみの、シンプルなテーマを使っています。
https://github.com/subnixr/minimal

そのままだと味気ないので、プロンプトがランダムな絵文字になるような設定を書いています。

.zshrc
() {
  local emoji=('🐶' '🌴' '🐙' '🐱' '📦' '🍺' '🥗' '🥙' '🍿' '🥝' '🍤' '🍣' '🍛' '🌵')
  # デフォルトのプロンプトを上書きする
  MNML_USER_CHAR=$emoji[($RANDOM % $#emoji + 1)]
}

プロンプトの絵文字がランダムに変わっているところ

シンタックスハイライト

入力したコマンドを良い感じにハイライトしてくれます。
https://github.com/zsh-users/zsh-syntax-highlighting

文字列内の変数などがパッと見で分かったりするので便利です。
入力に対して適切なシンタックスハイライトが効いているところ

補完系

履歴の自動補完

コマンドの履歴をインラインでサジェストしてくれます。
https://github.com/zsh-users/zsh-autosuggestions

インクリメンタルにサジェストしてくれて、 もしくは Enter で確定できます。
「コマンドの出だしは手が覚えているけどオプションまで覚えてない」みたいなときにちょっと便利です。

サジェストしているところ

コマンド補完

コマンドの入力補完を提供してくれます。
https://github.com/zsh-users/zsh-completions

全部ではありませんが、オプションの補完も効くのが嬉しいです。
補完しているところ

その他

略字展開

登録した単語を入力してスペースを打つと、展開してくれるプラグインです。
https://github.com/momo-lab/zsh-abbrev-alias

このように略字を設定すると

.zshrc
abbrev-alias g='git'
abbrev-alias brewu='brew upgrade && brew autoremove && brew cleanup -s'

こんな感じに展開されます。

略字を展開しているところ
略字の後にスペースを打つと展開されます

通常のaliasとの大きな違いは、入力時に展開されるという点です。

例えば通常のaliasだと

  • alias g='git'g status を実行 → 履歴には g status として残る
  • 後から履歴を見たときに何のコマンドか分かりにくい

一方、abbrev-aliasだと

  • g<space>git に展開 → 履歴には git status として残る
  • 実行前に展開されるので、長いコマンドも内容を確認してから実行できる

というところが利点だと感じています。

コマンドを誰かに共有するときも便利ですね。

ni

Node.jsのパッケージマネージャー間のコマンドの差異を吸収してくれるコマンドです。
https://github.com/azu/ni.zsh

npm/pnpm/yarn/bunどれを使っていたとしても ni add <パッケージ名> のように扱うことができます。

色んなプロジェクトを横断的に触ることが多いので、大変重宝しています。

SocketのAPIを使って、インストール前に安全かどうかチェックする機能があったりするのも嬉しいポイントです。
https://efcl.info/2023/08/29/ni.zsh-socket.dev/

エイリアス

Git系

1〜3文字という少し強めのエイリアスなので、前述した abbrev-alias で略字として設定しています。 が、補完がかなり効く環境なので、正直 g 以外は使っていない気がします…。

.zshrc
abbrev-alias g='git'
abbrev-alias ga='git add'
abbrev-alias gd='GIT_EXTERNAL_DIFF=difft git diff'
abbrev-alias gs='git status'
abbrev-alias gp='git push'
abbrev-alias gpu='git pull'
abbrev-alias gb='git branch'
abbrev-alias gc='git commit'
abbrev-alias gf='git fetch'
abbrev-alias gsw='git switch'

# マージ済のブランチをまとめて消す
alias g-delete-merged-branches='git branch --merged | grep -v "*" | grep -v "^+" | xargs git branch -d'

difft というCLIツールをdiffの表示に使っているので、gd だけコマンドが少し長くなっています。

https://github.com/Wilfred/difftastic

行単位ではなく、文字単位で出力されるので分かりやすいです。
difftでGitの差分を出力したところ

ls系

.zshrc
abbrev-alias l='eza -la'
abbrev-alias la='eza -a'
abbrev-alias lt='eza -T'

eza という ls の代替ツールを使っています。
https://github.com/eza-community/eza

場合によっては普通の ls を使いたい場面もあるので、エイリアスで上書きしないようにしています。

その他

.zshrc
# homebrewの更新・削除・クリーンアップをまとめて行なう
abbrev-alias brewu='brew upgrade && brew autoremove && brew cleanup -s'
# エディタ
abbrev-alias v="nvim"
# Neovimをビルドする
abbrev-alias nvim-rebuild='make distclean && make CMAKE_BUILD_TYPE=Release CMAKE_INSTALL_PREFIX=$HOME/.local/nvim && make install'
# ファイルのリネーム用
abbrev-alias zmv='noglob zmv -W'
# cls
abbrev-alias cls='clear'
# dotfilesのディレクトリへ移動
abbrev-alias dot='cd ~/dotfiles'
# 天気予報
alias wttr='(){ curl -H "Accept-Language: ${LANG%_*}" --compressed "wttr.in/${1:-Tokyo}" }'

よく行なう操作をメインに設定しています。

wttr <場所> で天気を見られるようにしていたりします。おすすめです。

wttrを実行したところ なんか良い

便利関数

1Passwordで.envを管理

可能な限り、.env に直接認証情報を置かずに 1Password の シークレット参照 を利用するようにしています。

https://efcl.info/2023/01/31/remove-secret-from-local/

を参考に、以下のような関数を作成しました。

.zshrc
opr () {
  if [[ -f "$PWD/.env" ]]; then
      env_file="$PWD/.env"
  elif [[ -f "$PWD/.env.local" ]]; then
      env_file="$PWD/.env.local"
  else
      echo ".envまたは.env.localがありません"
      return 1
  fi

  who=$(op whoami)
  if [[ $? != 0 ]]; then
      eval $(op signin)
  fi

  op run --env-file="$env_file" -- "$@"
}

opr npm run dev のように、後に続けて実行したいコマンドを渡して使います。

リポジトリ間の移動

ghqで管理しているリポジトリを絞り込んで、そこに移動する関数です。
絞り込みにはfzf(ファジーファインダーツール)を使っています。

頻繁に呼びだすので Ctrl+F にバインドしています。

.zshrc
function ghq-fzf() {
  local dir=$(ghq list -p | fzf)

  if [ -n "$dir" ]; then
    BUFFER="cd ${dir}"
    zle accept-line
  fi

  zle clear-screen
}

zle -N ghq-fzf

# Ctrl+fにバインド
bindkey "^f" ghq-fzf

リポジトリをフィルタして移動しているところ

また、コマンドラインの文字列を編集するために zsh の ZLE という機能を利用しています。(zle 〜の部分)

ZLEに関しては以下の記事が分かりやすく説明されていましたので、興味のある方は是非合わせてご参照ください。
https://dev.classmethod.jp/articles/zsh-zle-introduction/

履歴検索

先程の履歴検索版です。 こちらは Ctrl+H にバインドしています。

.zshrc
function select-history() {
  BUFFER=$(history -n -r 1 | fzf --no-sort +m)
  zle clear-screen
}

zle -N select-history
bindkey "^h" select-history

履歴を検索しているところ

ターミナルエミュレータ

ずっとWezTermを使っていましたが、最近Ghosttyに乗り換えました。
👻のキャラクターがかわいいです。

https://ghostty.org/

設定したキーを押せばどこでも一時的なターミナルを呼び出せる Quick Terminal という機能がユニークです。

QuickTerminalを起動してるところ
表示位置は変更可能

フォント

PlemolJPという等幅フォントを使っています。

https://github.com/yuru7/PlemolJP

全角スペースが見えることはもちろん、独特のイタリック体が特に好きです。
日本語部分がはっきりとした形をしているので、目が滑りにくい気がしています。

サンプル GitHubのREADMEより

カラーテーマ

エディタ(Neovim)で使っているテーマと同じ色を設定しています。
お気に入りのテーマカラーにしておくと若干モチベもあがるような気がします…。

https://github.com/arrow2nd/minai

カラーテーマのサンプル

Ghosttyだとこのように設定できます。

設定例
config
# Colors - Minai Color Scheme
background = #232934
foreground = #E8E2D6

# Cursor
cursor-color = #E8E2D6
cursor-text = #232934

# Selection
selection-background = #DFC2BA
selection-foreground = #232935

# 256 Color Palette (ANSI colors)
# Standard colors (0-7)
palette = 0=#262626
palette = 1=#c66471
palette = 2=#bbcacb
palette = 3=#d4af8d
palette = 4=#7ea1b6
palette = 5=#9b8ea8
palette = 6=#85a3a1
palette = 7=#b3b8c2

# Bright colors (8-15)
palette = 8=#818181
palette = 9=#D46A74
palette = 10=#CED9D9
palette = 11=#E0BF9D
palette = 12=#82ACC2
palette = 13=#ABA1B5
palette = 14=#99B0B0
palette = 15=#BAC4CF

さいごに

今回紹介した設定の全体はこちらにあります。

https://github.com/arrow2nd/dotfiles/blob/e7e87a58bcef64d3c8aa28c8a622fed3d4fdf2d1/.zsh/.zshrc
https://github.com/arrow2nd/dotfiles/blob/e7e87a58bcef64d3c8aa28c8a622fed3d4fdf2d1/.config/sheldon/plugins.toml

https://github.com/arrow2nd/dotfiles

では、素敵なターミナルライフを!👩‍💻

chot Inc. tech blog

Discussion