以前,sというコマンドを作った.これは,名前付きでscreenを起動して,既にその名前のscreenが起動していれば自動的にdetachしてくれる,というもの.
日記を見ると,けっこういろいろやってる.
- screenを起動するシェルスクリプト - hitode909のダイアリー
- 指定された名前のscreenを立ち上げる関数を改良 - hitode909のダイアリー
- screenのaliasを修正しました. - hitode909のダイアリー
- screenを起動するスクリプトでタイトルバーとhardstatusに名前を出すようにした - hitode909のダイアリー
これは便利だったのだけど,自分で定義したコマンドなので,適切な補完が効かない.
% 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すると,標準の補完関数のパスが分かるので,そこに含まれているファイルを読んでみるのが分かりやすい.