Pythonのargparseからzsh補完スクリプトを吐いてくれるgenzshcompでQoLが上がった

タツノオトシゴって、あの見た目なのですが、実は魚類だったんです。なんとなく甲殻類と思っていた。最大の種は30cmを超えるそうで、あの姿でその大きさというのを想像するとちょっとこわい。。

Pythonでは、かなり強力なコマンド引数パーサとしてargparseが使えます。
いろんなオプションをもつコマンドを作ったら、引数の入力も面倒。
ということで、自分の作ったPythonスクリプト専用の補完がzshで効くようにしたいなーと思っていたら、genzshcompというパッケージがありました。

コードのほうには全く手を入れる必要はありません。
普通にargparseのオプションを記述していってください。
下のサンプルコードは特に意味はないです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse

parser = argparse.ArgumentParser(description = "Description of your code")
parser.add_argument('--input-file', '-i', type = str, required = True, help = 'Filename of input data')
parser.add_argument('--nprocess', '-n', type = int, help = 'Number of iteration')
parser.add_argument('--algorithm', '-a', choices=['minmax', 'alphabeta'], help = 'Algorithm')
parser.add_argument('--output', '-o', type = str, help = 'Filename of output')
args = parser.parse_args()

ここで、補完スクリプトを置くための場所と設定を確保します。

% mkdir -p $HOME/.zsh/completion
% echo "fpath=($HOME/.zsh/completion/ $fpath)" >> ~/.zshrc
% echo "autoload -Uz compinit" >> ~/.zshrc
% echo compinit >> ~/.zshrc

書いたPythonスクリプトに対して、argparseのヘルプ出力をgenzshcompにかませると補完スクリプトに変換してくれます。なにそれすごいww

% ./prog.py --help | genzshcomp > ~/.zsh/completion/_prog
% source ~/.zshrc

これで、zshrcを再読み込みすれば補完が効くようになります。
なお補完スクリプトは、アンダースコアで始まるファイル名でなければいけません。ハマったぜ。。。

completion_scr

スクリプトの方を書き換えたら、completionファイルも併せて更新してzshをリロードしてください。

genzshcompに渡せる情報には限りがあるため、例えば実在するファイルでないとダメとか、何らかのコマンドの結果を補完結果に出す(例えばgitのブランチ名補完)みたいなことは難しそうです。
それでも、オプション何指定しないといけなかったっけ?と思った時ぱっと見られるようになったことで、とてもQoLが上がったので、オススメです。

コメントを残す

メールアドレスが公開されることはありません。