使用vim的-W选项

使用vim的-W选项,vim,Vim,vim的-w和-w选项在理论上具有以下效果: -w{scriptout}您键入的所有字符都记录在文件中 “scriptout”,直到退出Vim。 如果要创建 与“vim-s”一起使用的脚本文件 或“:来源!”。当“脚本退出”时 文件已存在,请输入新字符 附件。另见 |复杂重复|。{scriptout}无法执行 从一个数字开始。{不在Vi} -W{scriptout}类似-W,但不附加,覆盖现有文件。 {不在Vi} 但是当我这样做时,{scriptout}文件总是以十六进制序列开始,如80fd60

vim的
-w
-w
选项在理论上具有以下效果:

-w{scriptout}您键入的所有字符都记录在文件中 “scriptout”,直到退出Vim。 如果要创建 与“vim-s”一起使用的脚本文件 或“:来源!”。当“脚本退出”时 文件已存在,请输入新字符 附件。另见 |复杂重复|。{scriptout}无法执行 从一个数字开始。{不在Vi}

-W{scriptout}类似-W,但不附加,覆盖现有文件。 {不在Vi}

但是当我这样做时,{scriptout}文件总是以十六进制序列开始,如
80fd60
(有时是
80fd62

我正在使用portableapps.com上的gvimportable.exe 7.3。使用
-u NONE
开关,它也会执行相同的操作

这个“神奇数字”是干什么的?在Windows with gvim.exe下,我无法重播脚本,除非我删除了这三个前导字节

这项功能可能非常有用,但文档记录却很差


谢谢您的回答。

我的猜测是,这是gVim的GUI代码中的一个错误

使用gVim 7.3,如果我运行
gVim-u NONE-W scriptout
,那么我就会看到问题,但是如果我运行
vim-u NONE-W scriptout
,那么不需要的字节就不存在了

我还在Linux中测试了shell中的Vim 7.2、雪豹(7.2)中包含的Vim版本以及MacVim 7.2的GUI和终端版本(分别使用
mvim-W
/Applications/MacVim/Contents/MacOS/Vim-W
),它们都工作正常。

(这个答案可能非常零碎,我花了一段时间才找到答案——我也想找到一个解决方案,因为它吸引了我——不仅仅是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
方法,该方法由
gotchars
(第1215行)被
vgetorpeek
使用,被
vgetc
vpeekc
使用(不,我不知道这是怎么回事!),然后这些被用于许多地方

无论如何,我假设密钥在
src/gui.c
中的某个地方,但我不知道现在在哪里!也可能有一些密钥序列被“发送”(物理上或虚拟上,我不知道),但鉴于跨平台的问题是相同的,因此更可能是Vim问题


有趣的情况导致可能的解释:

另外值得注意的是,如果您自动退出,
gvim-u NONE-w scriptout-c quit
:在加载后退出
)或
gvim-u NONE-w scriptout-c 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…
(您知道这些参数!),iEsc Z Q为我生成了以下内容:

0000000: 80fd 6269 3c80 fd63 80fd 623e 1b5a 51    ..bi<..c..b>.ZQ
0000000:80fd 6269 3c80 fd63 80fd 623e 1b5a 51..bi.ZQ


总结:我相信这就是解决方案;gVim以某种形式捕获窗口消息,并且——不管它应该还是不应该——将它们放在它的
脚本输出中,我想在Vim列表上提问。

有人在vimgolf项目中为我们做了艰苦的工作,特别是这个评论很好的文件:

特殊双字节代码的转义序列中的
0x80
。在这种情况下,它们表示gvim焦点事件。请参阅:


当我使用
-W
选项进行测试时,vim没有在文件开头添加任何额外字符。您应该在没有
的情况下重试。vimrc
使用
vim-u NONE-W somefile
这就是我所做的…但是,
vim-u NONE-W scriptout
,ZQ和
xxd
我的脚本将显示
80fd 605a 51
(..`ZQ)我几周前看过这个,但无法在Linux上复制它…现在我知道你在使用我的gVim便携设备(耶!),我会在Windows上再试一次,看看我是否能找到答案。(明天,不是今天。)等等,我用
gvim
在Linux上复制了它。它用
-w
-w
输出80fd 60,只是没有用
vim
。谢谢你的回答。我可能一定要查看代码以找到它为什么会这样做。你也可以在Linux下尝试一下吗?@Benoit Yup,在Linux上运行良好,从终端和终端都可以我编辑了我的答案来说明这一点。请注意,一旦我发现问题是manifesti,这个测试就完全在Linux上完成了

      # If you use gvim, you'll get an entry in your keylog every time the
      # window gains or loses focus. These "keystrokes" should not show and
      # should not be counted.
      "\xfd\x60" => nil, # 7.2 Focus Gained compat
      "\xfd\x61" => nil, # Focus Gained (GVIM) (>7.4.1433)
      "\xfd\x62" => nil, # Focus Gained (GVIM)
      "\xfd\x63" => nil, # Focus Lost (GVIM)