zshやfishで類似コマンドの繰り返しを補助するbyコマンド作った(atusy/by-binds-yourself)

by
カテゴリ:
タグ:

繰り返しgit操作をするような場面で毎回gitと入力するの面倒ってことありますよね。というわけで指定した文字列を事前入力してくれるbyコマンドを作ってみました。

https://github.com/atusy/by-binds-yourself

by gitとすると、以降のシェルプロンプトでgitが事前入力された状態になり、byコマンドを空打ちすると事前入力が解除されます。事前入力にすぎないので、以下のデモのようにgitの文字列を消してlsするといった柔軟性もあります。

fish/zsh向けのプラグインとして提供しているので、お好みの方法でインストールしてみてください。

# fish
$ fisher install atusy/by-binds-yourself

# zsh
$ sheldon add by --git https://github.com/atusy/by-binds-yourself

コマンド以外にも任意の文字列を指定できるので、環境変数を一時的に固定するような場面でも使えます。たとえば、aws-cliでexport AWS_CONFIG_FILE=...すると、コンソールが流れてしまった時に利用中の設定ファイルがわからなくなりますが、by AWS_CONFIG_FILE=...しておくと、設定ファイルを視認しながら操作できます。

$ by AWS_CONFIG_FILE=./local-aws-config
$ AWS_CONFIG_FILE=./local-aws-config aws s3 ls
$ AWS_CONFIG_FILE=./local-aws-config aws ...

なぜ作ったのか

似たようなツールにmchav/withがありますが、こちらはコマンド入力後に動的にプレフィックスを追加します。

$ with git
git> add .
git> commit -a -m "Commited"
git> push

with gcc -o output input.cしておくと、コンパイルコマンドをEnterだけで連続実行できたり、なかなか面白いプロジェクトです。しかし、いくつか欠点があります。

  • 補完が効かない
    • git add --でタブ補完したいようなケースもadd --扱いになってしまう
  • 一時的な離脱ができない
    • with gitしている最中にlsしたい場合などに不便
  • オプション変更ができない
    • with gcc -o output input.cしている最中にoutputoutput2に変えるにはwithを終了する必要がある

これらの欠点はいずれも、withが、事前に指定した文字列と、以降に入力したバッファを結合して実行するという実装に起因しています。また、シンプルな機能に対してコードが350行にも及んでいます。

withがbashスクリプトで書かれているので単純な比較はできませんが、バッファを事前入力方式のbyはわずか9行で実装できてしまいます。

set -g ___by_commandline_prefix

function by
  set ___by_commandline_prefix $argv ""
end

function ___by --on-event fish_prompt
  commandline --replace "$___by_commandline_prefix"
end

素朴なこともあり、fish/zsh以外でも実装できるかもしれません。たとえばVimプラグインのddt-ui-shellでも同様の機能が実装されました。

https://github.com/Shougo/ddt-ui-shell/commit/bb509378f0246a95c4538acafa6272eed7415325

名前の由来

最初はprepromptと名付けました。しかしpromptとは$ git$の部分であって、gitの部分はバッファなので間違えだなと気付きました。

次にprefixを検討しましたが、検索性が悪いのとキャッチーさに欠けるなと感じました。

短かくて覚えやすくて名前がいいなとvim-jp Slackで相談したところ、byusingなどの案をいただきました。

by git, add some file.txt

とverbalに表現できていいなと思ったのと、

by-binds-yourself

という再帰的頭字語を思いついたことで、byに決定しました。

これなら検索もしやすいです。

ENJOY

気に入ったかたはぜひstarお願いします!

https://github.com/atusy/by-binds-yourself

スポンサーもいただけるとめちゃくちゃ励みになります!

https://github.com/sponsors/atusy