和很多人一样,我有几行从其他地方复制的 tmux 配置。其中之一是“检测是否是 VIM 窗口”。无论我找到多少,我总是找到相同的行和正则表达式集。突然有一天,tmux 不再识别我在 vim 窗口上,并且没有向程序发送正确的击键。我花了很多时间来调试,我什至必须将 tty 信息添加到我的 tmux 窗格中,以便能够手动运行命令。
经过一番痛苦之后,我发现原来的正则表达式不再匹配正确的输出,所以我修改了它:
以前是这样的
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
匹配该输出的行
^
以一个或多个除 、 和空格之外的 ( )字符+
开始( ) ,后跟T
X
Z
- 一个或多个空格后跟
/
以以下结尾的可选非空白序列- 一个可选的
g
,或者view
或vi
可选地先于n
并后跟m
and/orx
,后跟一个可选,diff
然后是 - 行尾 (
$
)。
因此,它匹配S+ gviewdiff
例如 or YY /path/to/vi
,但不匹配Z vim
(暂停vim
),不匹配YY lvim
(YY /vim
顺便说一句,两者都不是)。
grep -iqE '(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'
匹配行中的任何位置(^
行首没有锚点)以 结尾的一个或多个字符的某个可选序列/
以及 的替代拼写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)?'"
(使用该-x
选项以便不必指定^
和$
锚点,并替换\\S+
为\\S*
allowed /vi
。您可以更改为.*
也允许Ss /my cool apps/vi
。