(这个答案可能有些断裂,我尝试了一段时间才找到一个解决方案 - 我想要找到一个解决方案,因为它让我感到好奇,并不是因为那200美元的悬赏:P。这更多地展示了我的思路和实验过程。)
现在我可以在Linux上使用gvim
进行复制,它是/usr/bin/vim.gnome -g
;运行vim -g
也会做同样的事情。
深入代码:(在这种情况下毫无意义,但很有趣,可以学习一下如何做)
我已经查看了源代码,现在我可以稍微解释一下它(但没有用处!);它获取了outfile
文件(src/globals.h:1004
)的设置(src/main.h:2275
);然后在src/getchar.h:1501
中写入,在该方法中使用了updatescript
(第1215行),该方法由gotchars
使用,vgetorpeek
使用vgetc
和vpeekc
... (不,我不知道这会去哪里!)然后这些在许多地方使用。
无论如何,我想关键点可能就在src/gui.c
中,但我现在还不知道在哪里!还有可能是某个按键序列被“发送”了(物理或虚拟的,我不知道),但是由于这个问题跨平台是相同的,似乎更可能是一个Vim的问题而不是其他原因。
有趣的情况导致了一个可能的解释:
值得注意的是,如果自动退出,gvim -u NONE -w scriptout -c quit
(加载后:quit
) 或 gvim -u NONE -w scriptout -c quit
(立即:quit
,从未显示GUI),文件scriptout将为空。
此外,如果你打开gvim然后使用X按钮关闭它,不按任何键:
0000000: 80fd 6280 fd63 80fd 62 ..b..c..b
如果您打开gvim,然后点击其他地方,再点击回来并使用
:q
:
0000000: 80fd 6280 fd63 80fd 6280 fd2c 80fd 2e3a ..b..c..b..,...:
0000010: 710d q.
我认为窗口事件在内部被翻译成了其他东西。80 fd 62
是打开序列,80 fd 63 80 fd 62
是关闭序列。
我还发现了另一种触发80fd
的方法,这让我觉得它是某种“用户可以访问窗口”的方式;在Ubuntu的GNOME默认情况下,Ctrl+Alt+S执行与窗口相关的操作(记不清叫什么了;将其全部推到标题栏中,应用程序内部失去键盘控制等)。gvim ...
(你知道参数!),i<Ctrl+Alt+S(缩小),Ctrl+Alt+S(展开)>Esc Z Q对于我来说产生了这样的结果:
0000000: 80fd 6269 3c80 fd63 80fd 623e 1b5a 51 ..bi<..c..b>.ZQ
概述: 我认为我们已经找到了解决方案;gVim以某种形式捕获窗口消息,并且-无论是否应该-将其放入其scriptout
中。如果您认为不应该这样做(或者想知道为什么它们被留下来,或者它们是否有意义,或者您是否应该关心),请在Vim列表上询问。
-W
选项进行测试时,vim 没有在文件开头添加任何额外字符。你应该尝试使用vim -u NONE -W somefile
命令再次测试,不加载你的.vimrc
文件。 - too much phpvim -u NONE -W scriptout
、ZQ和xxd
my_scriptout会显示80fd 605a 51
(..`ZQ)。 - Benoitgvim
йҮҚзҺ°дәҶе®ғ...дҪҝз”Ё-w
жҲ–-W
зЎ®е®һдјҡиҫ“еҮә80fd 60пјҢдҪҶжҳҜvim
дёҚдјҡгҖӮ - Chris Morgan