为什么我必须更改 tmux vim 正则表达式识别?

为什么我必须更改 tmux vim 正则表达式识别?

和很多人一样,我有几行从其他地方复制的 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匹配该输出的行

  • ^以一个或多个除 、 和空格之外的 ( )字符+开始( ) ,后跟TXZ
  • 一个或多个空格后跟
  • /以以下结尾的可选非空白序列
  • 一个可选的g,或者viewvi可选地先于n并后跟mand/or x,后跟一个可选,diff然后是
  • 行尾 ( $)。

因此,它匹配S+ gviewdiff例如 or YY /path/to/vi,但不匹配Z vim(暂停vim),不匹配YY lvimYY /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

相关内容