仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Mac(zsh)で自作コマンドのタブ補完を作ってみる

PythonのvenvをActivateするときに、いちいちsourceコマンドでパスを書いてactivateするのは面倒なので、以下のような関数を作成して~/.zprofileに入れて運用しています。venvは~/pyディレクトリにまとめてあるので、そこにあるディレクトリ名だけ指定すればactivateできます。指定された名前がなければ新規作成します。

function venv_activate(){
  if [ ! -d ~/py/$1 ] ; then
    virtualenv ~/py/$1
  fi
  source ~/$1/bin/activate
}

これはこれで便利ですが、名前を思い出せないとか言うこともしばしばなので、タブ補完で~/pyディレクトリの中を探して欲しくなり、ググって実装してみました。参考にしたのは以下の記事です。

どうやら~/zsh/functions/以下にファイルを作らずに、直接.zprofileに書いても問題ないようなので、以下の通りいじってみました。おそらくディレクトリを作る(そしてパスを通す)方法は、たくさん.zprofileに書いたら破綻するからという感じでしょうか。そんなに自作する予定はないので.zprofileに書く方法で行きます。

# 補完の有効化を追記
autoload -U compinit
compinit -u

# これはそのまま。virtualenvをつかうかpython3 -m venvを使うかはお任せします
function venv_activate(){
  if [ ! -d ~/py/$1 ] ; then
    virtualenv ~/py/$1
  fi
  source ~/$1/bin/activate
}

# venv_activateの補完用関数の作成。~/pyを見に行くようにするやつ
function _venv_activate {
    _files -W ~/py && return 0;
    return 1;
}
# 関数の本体と保管用関数の紐づけ
compdef _venv_activate venv_activate

結果は以下の通り。~/pyの中身が補完できるようになりました。

% venv_activate
esptool/     mastodon/    openstack/   qrcode/      
flask/       misskey/     playwright/

おかげで便利にはなりましたが、仕事からちょっと脱線しましたね。業務に戻ります。