Joifup Blog

zshのaliasはやめてabbrに移行しよう

2026-03-08

はじめに

この記事では、zshのaliasをやめてabbreviation expansion(zsh-abbr)に移行する方法を紹介します。

先日、Xでこんな投稿が流れてきました。

お恥ずかしながら、自分もaliasを普通に使っていたので正直刺さりました。しかもcc='claude'でClaude Codeを呼び出す設定にしていて、これはまさにCコンパイラのccと被っています。

Xの投稿を見るまで、aliasが良くないという認識すらありませんでした。調べてみたら「え、これ最初からこっち使えばよかった」という気持ちになったので、移行手順をまとめます。

aliasの何がダメなのか

aliasは短縮コマンドとして便利ですが、こんな問題があります。

履歴にaliasのまま残る。 たとえばg statusと打つと、シェルの履歴にもg statusとして記録されます。別の環境(aliasを設定していないマシン)で履歴を遡っても、そのまま実行できません。

画面共有時に相手がわからない。 ペアプロやモブプロで画面を共有しているとき、gとかclとか打たれても相手は何のコマンドか分かりません。

本来のコマンドを忘れる。 aliasに頼りすぎると、正式なコマンドやオプションを忘れてしまいます。

既存コマンドと衝突する。 たとえば今回話題になっていたようにcc='claude'としている場合、ccはCコンパイラのコマンドとしてシステムに存在しています。aliasで上書きすると本来のccが使えなくなりますし、逆にaliasが効いていない環境でうっかりccを叩くとCコンパイラが動いてしまいます。

abbreviation expansionとは

abbreviation expansion(略語展開)は、短縮形を入力してSpaceを押すとフルコマンドに展開される仕組みです。展開後に引数を追加したり、そのままEnterで実行できます。aliasとの違いを表にまとめます。

観点aliasabbreviation expansion
履歴aliasのまま記録(g status展開後のコマンドが記録(git status
画面表示省略形のままフルコマンドが表示される
学習効果正式なコマンドを忘れやすい毎回フルコマンドが見える
ポータビリティ別環境で履歴が使えない履歴がそのまま使える
編集性展開前は編集しづらい展開後に自由に編集できる

Fish shellにはabbrが組み込みで用意されているようですが、私はzshをしようしているので、プラグインを使います。

zsh向けプラグインの比較

zshでabbreviation expansionを使えるプラグインを3つ調べました。

観点zeno.zshzsh-abbrzabrze
依存Deno + fzfなし(pure zsh)Rust binary
設定形式YAML / TypeScriptCLI(abbr addYAML
fzf補完ありなしなし
コンテキスト対応ありなしあり
alias移行の容易さYAML手動移行abbr import-aliasesで一括YAML手動移行
コミュニティ中(日本中心)

zsh-abbrを選びました。 理由はシンプルで、外部依存がないことです。Denoもfzfも不要で、pure zshだけで動きます。一旦、abbreviation expansionだけが欲しかったので、zeno.zshの多機能さはオーバースペックかなと思いました。

zsh-abbrの導入と設定

インストール

brewでインストールします。

brew install olets/tap/zsh-abbr

既存aliasの一括インポート

すでにaliasをたくさん定義している場合は、abbr import-aliasesで一括インポートできるみたいです。(自分は試せていません)

abbr import-aliases

これで現在の.zshrcに定義されているaliasがすべてabbreviationとして取り込まれます。手っ取り早く移行したい場合はこれが便利です。

自分の場合はalias自体が少なかったのと、ついでに名前も見直したかったので、手動で書き直しました。

.zshrcの設定

Before(alias):

# Git Alias
alias g='git'
# Claude Alias
alias cc='claude'
alias ccyolo='claude --dangerously-skip-permissions'

After(zsh-abbr):

# zsh-abbr (abbreviation expansion instead of aliases)
source /opt/homebrew/share/zsh-abbr/zsh-abbr.zsh
abbr -S -qq g=git
abbr -S -qq cl=claude
abbr -S -qq cld='claude --dangerously-skip-permissions'
abbr -S -qq cldc='claude --dangerously-skip-permissions --continue'

ポイントをいくつか説明します。

-Sはセッションabbreviationの指定です。 zsh-abbrには永続化(abbr addでファイルに保存)とセッション(起動時に毎回定義)の2つの方式があります。セッション方式にすることで、.zshrcがabbreviationの定義元(ソース・オブ・トゥルース)になります。dotfilesリポジトリで管理するならこの方式が楽です。

-qqは起動時のメッセージ抑制です。 これを付けないと、シェル起動時にAdded abbreviationというメッセージが毎回表示されます。

ccclに変更しました。 Xの投稿にもあった通り、Claude Codeのabbreviationはclにしています。Cコンパイラとの衝突を避けるためです。

設定後の操作

.zshrcを書き換えたら、既存のalias定義を削除してシェルを再起動します。

# .zshrcからalias定義を削除した後
source ~/.zshrc

あとは普段通りに短縮コマンドを入力するだけです。clと入力してSpaceを押すと、claude に展開されます。展開後のフルコマンドが表示されるので、そのまま引数を続けて入力できます。

展開抑制

abbreviationを展開せずにそのまま実行したい場合は、Ctrl+Spaceで展開を抑制できます。

ただし、macOSのデフォルトだとCtrl+Spaceは入力ソース切り替えのショートカットに割り当てられています。zsh-abbrの展開抑制を使いたい場合は、システム設定からこのショートカットをオフにする必要があります。

まとめ

  • aliasは履歴・画面共有・学習効果の面で問題がある。abbreviation expansionに移行しよう
  • zshならzsh-abbrが外部依存なしで導入できる
  • cc='claude'はCコンパイラと衝突するので、clにしよう

早く気づけばよかったです。フルコマンドが毎回見えるので正式なコマンドも忘れないし、画面共有時にも相手にやさしい。alias使ってる方はぜひ移行してみてください。