また、peep-mac-tmux というコマンドを作って pid の指定を省略しました。
ですが、 peep-mac-tmux を使う際、上手く動いてくれないパターンがいくつか出てきました。
具体的には以下のようなパターンです。
- '&&' で繋がれたコマンド
- peep するのは実行中のコマンドなので、途中のコマンドが終了すると通知してしまう
- `xargs -L1` のように何度も子プロセスを生成するコマンド
- 1つの子プロセスが終わった時に通知してしまう
そこで、zsh の機能である zle を使い、これらのパターンの時に括弧で括って実行するようにしました。
丸括弧で括ってあると subshell 内部でコマンドが実行されます。
なので、peep は subshell の pid を peep する事で適切に動作させる狙いです。
環境
- OS: macOS Mojave 10.14.6
- Homebrew: 2.1.16-38-ge2c76cc
- Homebrew/homebrew-core: (git revision 0f36; last commit 2019-11-09)
- zsh: 5.7.1 (x86_64-apple-darwin18.2.0)
zle とは
zsh command line editor という機能で、man zshzle すると詳細が見られます。
コマンドを実行する際に編集したい、という要望は既に存在していて、そこで使われていたのが zle でした。
今回の場合、'&&' が含まれる or '|' が含まれる、という時に括弧を追加することにします。
そうして作成したのが以下の call-subshell です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function call-subshell () { | |
echo $BUFFER | /usr/bin/egrep '(\&\&|\|)' >& /dev/null | |
if [ $? -eq 0 ]; then | |
BUFFER="( ${BUFFER} )" | |
fi | |
zle .accept-line | |
} | |
zle -N accept-line call-subshell |
安直に、egrep で特定の pattern がある時、 BUFFER という vairable を編集する事で追加します。
これで peep-mac-tmux の指定もやりやすくなりました。
これで peep-mac-tmux の指定もやりやすくなりました。
無限に増える括弧
さて、peep-mac-tmux しやすくなりました、万歳、とはいかないようです。
この定義ではパターンが含まれるコマンドに、() を追加するので、後のコマンドにもパターンが含まれる。
なので、履歴からコマンドを呼び出すと括弧が増え続けます。これは困る。
そこで括弧が重複しないようにしたのが以下の call-subshell です。
そこで括弧が重複しないようにしたのが以下の call-subshell です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function call-subshell () { | |
echo $BUFFER | /usr/bin/egrep '(\&\&|\|)' >& /dev/null | |
if [ $? -eq 0 ]; then | |
echo $BUFFER | /usr/bin/egrep "^[[:space:]]*\(" | /usr/bin/egrep "\)[[:space:]]*$" >& /dev/null | |
if [ $? -ne 0 ]; then | |
BUFFER="( ${BUFFER} )" | |
fi | |
fi | |
zle .accept-line | |
} | |
zle -N accept-line call-subshell |
一応、前後に空白があった場合にも対応しています。
これで良し。
これで良し。
まとめ
zle を使うとコマンドを編集できて便利、というお話でした。
ちなみにオチとしては、
- peep が上手くいくメリット < () がある事で誤爆したりするデメリット
と感じたので、作成して2ヶ月くらいで消してしまいました。
0 件のコメント:
コメントを投稿