#!/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 在屏幕 #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 启动,该输入就可供使用。您会看到它的行为与上述相同,包括“蜂鸣声”(如果您的终端启用了它)。