多くの人のように、私は他の場所からコピーした数行のtmux設定を持っています。そのうちの1つは「VIMウィンドウであるかどうかを検出する」です。どんなに探していても、常に同じ行と正規表現のセットを探します。ある日、突然tmuxは私がvimウィンドウにいることをもう認識しなくなり、プログラムに正しいキーストロークを送信しませんでした。私はデバッグに多くの時間を費やしました。コマンドを手動で実行するには、tmuxウィンドウにtty情報を追加する必要がありました。
少しの苦痛の終わりに、元の正規表現がもはや正しい出力と一致しないという事実を見つけて修正しました。
以前はこれでした。
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
これを変えなければなりませんでした。
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
ご覧のとおり、削除されました^[^TXZ ]+ +
。コマンドの出力がもはや一致しないので、その目的が何であるか、特になぜ日々変わるのかはわかりません。一致したい内容と変更の理由を理解したいと思います。
ちなみに、通常の端末で上記のコマンドを実行したときに表示される新しい出力です。
Ss -zsh
S -zsh
S -zsh
S -zsh
S /Users/danielo/.cache/gitstatus/gitstatusd-darwin-arm64
S+ lvim
なぜこれが変更された可能性があり、以前の出力が何であるかはまだ私にとって謎です。
挨拶
答え1
lvim
現在は、代わりにを使用しているようですvim
。
grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'
(これは\\
バグかもしれません)
ps
この出力に一致する行
^
スペース()を除く1つ以上の()文字で始まり、+
その後に続きます。T
X
Z
- 1つ以上のスペースの後に
/
次に終わるオプションの空白ではないシーケンス- オプション
g
、orview
、またはvi
オプションで前にand / orn
が続き、その後にオプションが続きます。m
x
diff
- 行末(
$
)。
したがって、たとえばS+ gviewdiff
、orと一致しYY /path/to/vi
ますがZ vim
(pause vim
)、alsoではありませんYY lvim
(YY /vim
しかし両方ではありません)。
grep -iqE '(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'
上記のように、1つ以上の文字と代替スペルとその変形のオプションのシーケンスで終わる行のすべての位置(^
行の先頭にアンカーなし)と一致します。/
vim
正規表現は先頭に固定されず、重複するため、正規表現があるかどうかにかかわらず、(\\S+\\/)?g?
同じ行に一致するn?
ため、次のようになります。
grep -iqE 'vi(ew|m?x?)(diff)?$'
ZZ whatever lvimdiff
だからそれは一致するので一致しますvimdiff
。
lvim
プロセスの状態を同時に確認するには、次のものが必要です。
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -ixqE '[^TXZ ]+ +(\\S*/)?[gl]?(view|n?vim?x?)(diff)?'"
(およびアンカーを指定してallowedに置き換える-x
必要がないように、このオプションを使用します。allowedに変更することもできます。^
$
\\S+
\\S*
/vi
.*
Ss /my cool apps/vi