hitode909の日記

趣味はマリンスポーツですの日記です

screenを起動するスクリプト用のzshの補完関数

以前,sというコマンドを作った.これは,名前付きでscreenを起動して,既にその名前のscreenが起動していれば自動的にdetachしてくれる,というもの.
日記を見ると,けっこういろいろやってる.


これは便利だったのだけど,自分で定義したコマンドなので,適切な補完が効かない.

% s
Desktop/    Documents/    Downloads/    Library/    Movies/    Music/    Pictures/    Public/    Sites/    bin@    co/    firefox_profile/    tmp/

なにも指定してないので,ファイル一覧が出てしまっていて,無駄な感じ.
起動中のscreenの名前一覧が補完候補として出ればよいと思ったので,補完関数を書いてみた.



hitode909's
gist: 310845 — Gist

#compdef s

sessions=$(screen -ls | awk '{ FS = "[\. \t]+" } /tached/ { print $3 }')
_arguments "1:first:($sessions)"

screen -lsの結果をawkで名前だけ切り出して,sコマンドの1番目の引数の補完として使われるようにした.


これを,~/.functions/_s のような名前で保存して,.zshrcで以下のように設定する.compinitより前にfpathを指定する必要があるので,気をつける.

fpath=(~/.functions ${fpath})
autoload -U compinit
compinit


これで,ちゃんと補完されるようになった.便利.

% sl
There are screens on:
	38596.Downloads	(Detached)
	49262.fkd	(Attached)
	82546.codepaste	(Detached)
	89963.net-irc	(Attached)
	9538.memcache	(Detached)
5 Sockets in /var/folders/ia/iayzq6wuGpqdoJvZ932Cl++++TI/-Tmp-/.screen.

% s
Downloads  codepaste  fkd        memcache   net-irc

参考

これはごちゃごちゃ書いてあって,よく分からなかった.
echo $fpathすると,標準の補完関数のパスが分かるので,そこに含まれているファイルを読んでみるのが分かりやすい.