vim 在 bashscript 中表现出奇怪的行为

vim 在 bashscript 中表现出奇怪的行为
#!/bin/sh

action() {

        screen -X stuff "xdotool key Ctrl+a $1"$(echo '\015')

}

action bar
screen
action 0
action Tab
action 1
action S
screen
action Tab
action 2
action Tab
vim
#action Tab
#vim $2
#action Tab
#vim $3
#action Tab

当 vim 行被注释掉时 按预期显示以下输出 中间有一个垂直隔板,垂直隔板右侧有一个水平隔板

当包含 vim 行时 仅显示由水平线分隔的两个分区。 第一个分区显示屏幕#1,第二个分区显示屏幕#2。

vim 在屏幕 #0 中打开并且


l key Ctrl+a bar

写成

在此输入图像描述

无法了解 vim 是如何导致可能的错误的?请帮忙。

答案1

这里发生的情况是,屏幕的stuff命令将字符推入窗格的输入缓冲区,但它们只是坐在那里,直到有程序使用它们。

由于您在窗格 #0 上运行此脚本并xdotool key Ctrl+a bar在该窗格 #0 上发出命令,因此当脚本结束并且您返回 shell 时,shell 将接受该脚本并将其解释为正常的 shell 命令。

实际上,您可以在第一个屏幕截图中看到,这些字符单独占据一行(与您输入的某些字符相同),然后成为待处理的输入。当脚本结束并且您返回到 shell 时,它会使用这些字符并最终重复该命令。结果如下所示:

xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$ xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$

如果您运行 Vim 而不是退出脚本,那么 Vim 将使用相同的输入并将其解释为 Vim 命令。然后它会看到以下命令序列:

  • x:删除光标下的字符。缓冲区是空的,因此只会发出蜂鸣声并且不执行任何操作。
  • do:从其他缓冲区获取差异(在 vimdiff 模式下有用)。这在这里没有用,但同样在这种情况下它什么也不做。
  • to:移至o该行的下一个字符。该行是空的,所以这又什么也不做。
  • o:在当前行的下一行进入插入模式。

因此,最后一个命令进入插入模式,这意味着该行的其余部分 ( l key Ctrl+a bar) 和“Enter”被输入到第二行的缓冲区中。 Vim 留在第三行的开头,仍处于插入模式。

这就完美地解释了这一点。

一个更简单的重现器是运行如下命令:

$ sleep 30; vim

然后在sleep运行时输入上面的行:

xdotool key Ctrl+a bar

由于sleep不会消耗其输出,因此在睡眠结束后,只要 Vim 启动,该输入就可供使用。您会看到它的行为与上述相同,包括“蜂鸣声”(如果您的终端启用了它)。

相关内容