zsh で alias の代わりに abbr を使ってみた感想
はじめに
既にご存じの方も多数だと思いますが、alias
とはコマンドのエイリアス (別名) を登録・表示するコマンドで、alias <word>="<command>"
のように設定します。
例えば、以下のように設定しておくと ll
で ls -l
を実行できます。
alias ll="ls -l"
abbr とは
abbr とは略語を自動展開してくれる zsh マネージャです。
abbr の良いところ
コマンドが展開してから実行される
これが一番の魅力といっても過言ではないと思います。
abbr
ではコマンドが展開してから実行されます。これの何が良いかというと、history にも展開後のコマンドが残ります。alias
ではエイリアスがそのまま history に残るので、例えば作業ログとして同僚に history を共有した場合にエイリアスのコマンドについて説明する必要が出てきます。しかし、abbr
では先述の通り展開後のコマンドが history に残るため、そのまま共有することが可能です。
もう一つ、alias
に慣れていると元のコマンドを忘れてしまうことがあると思いますが、abbr
は展開されてから実行されるので自然と元のコマンドを目にすることになり記憶にも残りやすいです。
alias
とほぼ同じ
設定方法が abbr
も基本的には alias
と同じく abbr <word>="<command>"
のように設定します。そのため alias
から乗り換える場合も alias
の部分を abbr
に変更するだけで基本的には問題ありません。
※「基本的に」と書いているのはこちらのような問題があるため。
git alias のインポートにも対応
alias
から abbr
に移行すると同時に git
のエイリアスも abbr
に移行したい方も多いと思います。そういった方向けに abbr
には import-git-aliases というサブコマンドが用意されており、こちらを実行すると git
のエイリアスを自動的に abbr
に置き換えてくれます。
展開後のカーソルの位置を指定できる
git commit -m ""
の略語として git m
を設定していた場合、展開語は ""
の間にカーソルが配置されてほしいと思うはずです。そのようなケースに対応するため abbr
では展開後のカーソルの位置を指定することが可能です。これによりキーボード操作を減らすことができます。
abbr の不便なところ (alias と比較して)
ビルトインコマンドを別コマンドの略語できない
例えば alias
を利用して alias ls='eza --icons --git'
のようにビルトインのコマンドを別コマンドのエイリアスにしていることがあると思います。alias
ではこのような設定は有効かつコマンドの前に \
をつけて実行することで元のコマンドを実行することもできます。
しかし、abbr
ではビルトインコマンドを別コマンドの略語として設定することはできません。正確にはビルドインコマンド限定ではなく既に同名のコマンドが存在する場合はそのコマンド名で新たな略語を設定することができません。
❯ abbr ls='eza --icons --git'
Did not add the abbreviation `ls` because a command with the same name exists
オプションではコマンドラインの先頭もしくは全ての場所での展開にしか対応していない
abbr
にはレギュラーとグローバルの 2 つのタイプがあります。
デフォルトのタイプはレギュラーで、レギュラーではコマンドラインの先頭 (または先頭の sudo
の直後) のみ展開するため、コマンド連結の後のような先頭以外の場所では展開されません。
対処法 1
上記の対処法は 2 つあり、まず 1 つ目は -g
を指定してグローバルにすることです。
この方法は簡単ですが、グローバルは 全ての場所で展開されるため、例えば以下のように引数として渡した場合でも展開されてしまいます。
-
abbr -g p=pwd
で略語p
をグローバルで設定 -
echo p
を実行しようとする -
echo
に引数として渡したp
が展開されてしまいecho pwd
が実行される
略語に設定している文字列を引数として渡す場合に '
や "
で括ってやる (echo p
ではなく echo 'p'
のようにする) と展開されませんが、本来不要な文字をタイプすることに手間を感じるかもしれません。
対処法 2
もう 1 つの対処法は Multiple prefixes を設定する方法です。Multiple prefixes はその直後であれば略語が展開される接頭辞を設定できる機能です。この接頭辞には文字列・数値のスカラーと glob が設定可能で、レギュラーの略語でも sudo
直後であれば展開されるのはデフォルトで sudo
がスカラーの接頭辞として設定されているためです。
例えば zshrc で以下のように glob の接頭辞を設定しておけば、&
, &&
, |
, ||
, ;
で連結した直後の略語は展開されるようになります。
ABBR_REGULAR_ABBREVIATION_GLOB_PREFIXES+=(
'*& '
'*&& '
'*| '
'*|| '
'*; '
)
この方法であれば対処法 1 の引数として渡した文字列が略語設定されていた場合に展開されてしまう問題にも対処することができるため、個人的にはこちらの方法がおすすめです。
まとめ
今回は zsh で alias の代わりに abbr を使ってみた感想でした。個人的には history に展開後のコマンドが残る点や展開後のカーソル位置の指定に結構恩恵を受けており、今のところ致命的な問題もないためこのまま継続して使っていく予定です。
Discussion