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