Taskfile(taskコマンド)のfish補完定義を改善してグローバルタスクに対応した

by
カテゴリ:

Taskfile(taskコマンド)は、数あるタスクランナー/ビルドツールの1つです。 Makefile代替とも言えますね。

詳しくは公式サイト(https://taskfile.dev/)や「Taskfileを使ってみよう」などの記事を参考にしてもらうとして、個人的にTaskfileを好んでいる理由をいくつか挙げておきます。

  1. グローバルタスクを~/Taskfile.yamlに定義可能
    • カレントディレクトリに依存せず、共通のタスクを定義しておきtask --global <taskname>で実行できる
  2. 共用タスクをTaskfile.dist.yamlに定義しつつ、個人用のタスクをTaskfile.yamlに定義でき、併用が容易
  3. Taskfileの分割が容易
  4. さまざまなシェル(Bash, Fish, Powershell, Zsh)向けに補完が定義済み
  5. YAMLファイルなのでスキーマ定義を使ったバリデーションが容易

グローバルタスクはよく使うコマンドを書き溜めておけるので重宝してます。

しかし、つい最近まではグローバルタスクの補完ができず、そのメリットを活かしきれませんでした。

というわけでtaskコマンドにコントリビュートして、Fish向けにグローバルタスクの補完を実装しました。

task --global

と入力した状態で補完を実行すると、~/.config/Taskfile.ymlに定義したタスクが補完候補として表示されるようになります。

--globalまで入力するのは手間なので、私はabbreviationを利用して、Taskと入力したら、task --globalに展開する設定を仕込んでます(abbr -a Task "task --global")。

実装できた背景には、Fishがコマンドラインをトークン単位に分割する機能を持っているので、--globalオプションの有無を判定しやすいところにあります。

Fishの補完をコマンドラインの内容に応じて変える
https://blog.atusy.net/2025/03/21/fish-completion-considering-tokens/

Bash, Powershell, Zshを助ける方法はちょっと自分の知識不足でわかりませんでした。 Fishだけの改善でもマージしてもらえたのはとてもありがたいですね。

当該機能はv3.4.31から利用可能です。

Fixed Fish completion on newer Fish versions (#2130 by @atusy).
https://taskfile.dev/changelog/#v3431---2025-04-21

ただ、このバージョンに含まれる他の更新絡みでレグレッションが発生していたようなので、v3.4.32以降を導入するのが無難だと思います。

ENJOY