🐚

aliasに代わる略語展開(abbreviation)のススメ

2024/04/07に公開
2

私がターミナル上で操作するうえで、一番生産性に効いていると思っている
aliasに相当する機能である略語展開(abbreviation)を今回オススメしたいと思います。

略語展開とは?

今回説明する略語展開(abbreviation)とは、シェル上で入力した特定の短縮文字をあらかじめ設定しておいた文字列に展開してくれるものです。
以下の実際の挙動を見てもらった方がイメージがつきやすいと思います。

  • 略語展開の例
    略語展開の例

いわゆるaliasに近いものであり、頻繁に使用するコマンドを少ない入力タイピング数で実行することが可能になります。

fish shellでは標準で搭載されている機能であり、それ以外のシェルの場合でも追加設定や以下のようなpluginを導入することで略語展開を用いることができます。

略語展開の利点

aliasでもいいじゃん?ともし思ったそこのアナタ。
確かにそうなんですが、略語展開はaliasと比べて以下の利点があると考えています。

第三者から見ても実行コマンドが分かりやすい

チーム開発を行っていると、画面共有をしながら、共同で作業を行うことも多々あるかと思います。
略語展開の場合は、正規のコマンド内容に展開されてから実行されるため、第三者から見ても実行内容が伝わりやすいのでaliasよりベターと考えています。

コマンド履歴に正規のコマンド内容で残る

シェルのコマンド履歴(history)はシェルの設定と同じくらい大切なものです。(そうですよね?)
なので、コマンド履歴には正規コマンド内容を残したほうがいいと思っています。
その方が履歴からコマンドを探す際も検索しやすいかなと思っています。
またあくまでオプショナルなもので上記項目と内容が多少かぶりますが、コマンド実行環境が揃っていれば、config等を設定することなく実行コマンド内容をそのまま第三者に手軽に共有しやすいかなと思っています。

必要なオプションを明示することで、オプション内容を意識させる

私は忘れっぽいので、以前一度aliasやconfigで設定したオプション内容を忘れてしまうことが多いです。
もちろん忘れるたびに、alias・config内容見返したり、ネットで検索したりしてもいいのですが、その思い出し作業が煩わしい場面もあるので、
defaultで暗黙的にオプションを設定することはあまりせず、略語展開でオプション付きで常に展開するようにしています。
略語展開で毎回明示的に設定することで、渡しているオプション内容を意識させることがいいと考えています。

場面に応じて、展開後にオプションを足し引きすることができる

まれに普段設定しているaliasのコマンドに、追加でオプションを足し引きしたくなる場面があるかと思います。
その際にaliasでは以下のようなことが難しいかなと思います。

  • aliasで設定した一部オプションを引くことができない
  • オプションを足す際も末尾にしか追加できない(末尾以外の場所にオプションを設定できない)
  • 末尾にオプションを追加する(同じオプションを複数設定する)ことで実質上書きのような形にもできることもあるが、同じオプションを複数渡したときの挙動はコマンドによるところがある(エラーになる場合もある)

その点、略語展開ではいきなりコマンド実行するだけでなく、プロンプト上に設定した文字列に展開だけしてコマンド実行前の状態にすることもできます。
そのため、必要に応じては普段実行しているコマンドのオプションを臨機応変に足し引きすることができます。
(後続で、実際の例を記載します。)

もちろん、使用頻度の高さによっては、オプションのパターンに応じてそれぞれaliasを設定しておくのもいいと思いますが、たまにしか使用しないオプションに対してaliasを別途設定するのは扱い勝手が悪いかなと思っています。(たまにしか用いないaliasはいざ必要な場面になってもその存在自体を忘れて活用されてない or 思い出すのに時間がかかることが多い・・。)

aliasコマンドをそのまま実行するのに比べるとタイプ数は多少多くなってしまうかもしれませんが、その点、略語展開では柔軟に対応することができます。

設定・使用例

略語展開の魅力について語ったところで、設定例をいくつか挙げていきたいと思います。
以下の実行環境は私が普段使用しているzsh + zabrzeで行っていきます。

aliasの代わりに略語展開を使用する

aliasと同じような使用感でコマンドを実行できます。
実行のタイミングでは展開されてから実行されるため、historyには展開後のコマンド内容が残ります。

たとえば、以下のようによくあるaliasと同じような設定します。

config.yaml
- name: gb
  abbr: gb
  snippet: git branch

- name: gs
  abbr: gs
  snippet: git status

展開後にコマンド内容を追加で変更してから実行する

aliasと違って略語展開では指定した文字列に展開した状態で止めることができます。
そのため、場面に応じてコマンド内容を追加で変更してから実行することができます。

たとえば、自分はgit logは普段は以下の形で実行しています。(-nで表示コミットを最新n件のみにする、--pretty=formatでフォーマット指定)

config.yaml
- name: gl
  abbr: gl
  snippet: git log --pretty=format:"%C(auto)%h (%C(blue)%cd%C(auto))%d %s %Cblue" --date=format:"%Y/%m/%d %H:%M:%S" -n 10

ただし、まれに10件以上のコミットを表示したかったり(-nオプションの数字を変えたい)、各コミットのpatch内容も確認したい(-pオプションも追加したい)場面もあったりします。
その際には、以下のように追加でコマンド内容を変更してコマンドを実行することができます。

  • 略語展開後に-nオプションを変更

  • 略語展開後に-pオプションを追加

他の例として、普段git pushコマンドは以下のように設定しており、force-pushする際はgpoh → git push origin HEADに展開してから、-fオプションなどをつけています。

config.yaml
- name: gpoh
  abbr: gpoh
  snippet: git push origin HEAD
  • 略語展開後に-fオプションを追加

もちろん、force-pushする際のコマンドも略語展開で設定したり、historyから探してきて実行してもいいのですが、
私は手癖で誤って実行してしまうのが怖いため、--force--hardオプション系の内容は極力設定せずあえてこのような形で実行しています。

contextに応じて略語展開する

略語展開に慣れてくるとだんだん欲が出てきて、特定コマンドを入力時のみ特定の文字列を略語展開したいなぁと思ってきます。
そこで、おすすめしたい方法がコマンド入力内容つまりcontextに応じて略語展開を行うものです。
これは、今自分が利用しているzabrzeで実現できます。

たとえばgit pushには、より安全にforce-pushするオプションとして、--force-if-includes-–force-with-leaseが用意されていますが、
正直このオプションを空で覚えている(自前でタイピングする)人はなかなかいないのではないでしょうか?
特に--force-if-includesと違って--force-with-leaseはgitconfigでデフォルトで設定できるような設定がないため、なかなか使う機会がないと思います。

そのため、私はgit pushのコマンドをタイピングしている場合に限って、f--force-with-leaseと展開することで、force-pushする際は最近--force-with-leaseを持ちいるようにしています。
(もちろん文字列が被りそうな場合は-f--force-with-leaseなどでも可能です。)

config.yaml
- name: (git push) --force-with-lease
  abbr: f
  snippet: --force-with-lease
  global: true
  context: '^git\spush\s'
  • git pushコマンド入力時のみf--force-with-leaseへ展開

略語展開後のカーソル位置を指定する

また、略語展開を提供するものによっては、略語展開後のカーソル位置を指定の場所に設定することができるものもあります。
これは、fish-shellであったり、ちょうど最近zsh-pluginであるzsh-abbrなどでも指定が可能になりました。
(zabrzeでもできるようになるとうれしいなぁ・・) (※2024/8/24加筆、zabrzeでも同様の設定ができました)

たとえば、git commitを行う際のコミットメッセージを指定する際には、略語展開後には理想的には-m "%" の%の位置にカーソルが来てほしいと思います。
その際に、zsh-abbrでは以下のような形でカーソル位置を指定することができます。

ABBR_SET_EXPANSION_CURSOR=1  #zsh-abbrでのカーソル移動の設定を有効にする
abbr gcm="git commit -m \"%\""
  • 略語展開後はカーソルが""の間に位置している例

2024/8/24加筆

なんとzabrzeでも同様の設定で出来ることをライブラリ作者からコメントいただきました 。(コメントありがとうございます🙇‍♂️)
以下のように設定することで同様の挙動を実現できるようです🎉
また、{}の記号もoptionalで変更できるようです

config.yaml
- name: gcm
  abbr: gcm
  snippet: git commit -m '{}'

終わりに

普段自分が気に入って使用している略語展開と使用例をいくつか紹介させていただきました。
特に使用例の後半などを踏まえると、色々な形で設定できそうと思ったりしないでしょうか?
略語展開はうまく設定できると生産性はとても上がると思います。
ぜひ少しでも興味を持っていただければ幸いです。

Discussion

りょうがりょうが

ありがとうございます。

(zabrzeでもできるようになるとうれしいなぁ・・)

実はできます。

 - abbr: cm
    snippet: commit -m '{}'
    global: true
    context: ^git\s

https://github.com/Ryooooooga/dotfiles/blob/b20b89a584c1838857d69c585d9d44099a198bf7/config/zabrze/git.yaml#L69

このようにすると展開後 {} の位置にカーソルが移動します (記号は cursor で変えられます)。

https://github.com/Ryooooooga/zabrze/blob/6e297c92646ca96b967199d6899b4b375246fae7/test/config.yaml#L59-L60

ryo.ryo.

コメントありがとうございます。
なんと!実はできるのは把握できてなかったです(素晴らしすぎます😭)
早速設定させていただきます&記事内容も加筆させていただきます🙇‍♂️