タスクランナーのtaskコマンド(https://taskfile.dev/)はグローバルタスクを定義できるのがいいところですね。
~/Taskfile.yamlに定義しておくと、どのディレクトリからでも実行できるので、便利です。これを活用したくて、go-task/taskにコントリビュートして、Fish向けにグローバルタスクの補完を実装しました。
Taskfile(taskコマンド)のfish補完定義を改善してグローバルタスクに対応した https://blog.atusy.net/2025/04/23/go-task-and-fish-completion/
しかし、いくつか不安がありました
- タスクランナーはグローバルタスクに対応しているものばかりではないので、
taskコマンドから乗り換えづらい - 補完定義をFishしか対応させられなかったので、他のシェルで使いづらい
そこへきてvim-jpで
この手のツール、大体シェルの設定かシェルスクリプトでいいやってなるんだけど
というコメントをもらい、ふと、そういえば自分も~/.local/bin/に自分用コマンドを定義しているなと思いました。
個人的には、コマンド名を覚えやすいものを~/.local/bin/に配置し、そうでもないものをグローバルタスク化していました。グローバルタスクは、task --globalで補完候補を得られるので、名前を記憶する必要がなかったわけです。
ということは、~/.local/bin/下に特定のprefixを持つ実行ファイルを置いておけば良いではないかと気付きました。
たとえば、システムを更新するスクリプトは ~/.local/bin/T-system-update といった具合にしておくと、T-でコマンドを補完させればいいわけですね。
T-をprefixにしたのは、taskを連想しやすいからです。
この方法ならtaskコマンド不要ですし、Fish以外のシェルでも容易に補完できます。
やったね!
同じようにローカルタスクも実行ファイルで管理できるといいなーと思ったのですが、気にしないことにしました。動的にPATHを変更する手間を思えばタスクランナーを採用すればいいですし、taskコマンドに縛られず任意のタスクランナーを使えるので、問題になりません。
ENJOY
Atusy's blog