使用vim的-W选项

8

Vim的-w-W选项理论上具有以下效果:

-w {scriptout}:记录您键入的所有字符,直到退出Vim,在文件“scriptout”中。如果要创建一个与“vim -s”或“:source!”一起使用的脚本文件,则此选项很有用。当“scriptout”文件已经存在时,新字符将被追加。另请参见|complex-repeat|。{scriptout}不能以数字开头。{not in Vi}

-W {scriptout}:与-w类似,但不追加,覆盖现有文件。{not in Vi}

但是,当我这样做时,{scriptout}文件总是以十六进制序列80 fd 60(有时是80 fd 62)开头。

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

这个“魔术数字”是什么?在Windows下使用gvim.exe之前,我必须删除那三个前导字节才能重放我的scriptout...

看起来,这个功能非常有用,但文档不太好。

感谢您的回答。


当我使用 -W 选项进行测试时,vim 没有在文件开头添加任何额外字符。你应该尝试使用 vim -u NONE -W somefile 命令再次测试,不加载你的 .vimrc 文件。 - too much php
这就是我所做的…不过,vim -u NONE -W scriptout、ZQ和xxd my_scriptout会显示80fd 605a 51(..`ZQ)。 - Benoit
我几周前看过这个,但在Linux上无法重现...现在我知道你正在使用我的gVim便携版(耶!),我会在Windows上再试一次,看看能否找出问题。(明天,不是今天。) - Chris Morgan
зӯүдёҖдёӢпјҢжҲ‘з”ЁLinuxе’ҢgvimйҮҚзҺ°дәҶе®ғ...дҪҝз”Ё-wжҲ–-WзЎ®е®һдјҡиҫ“еҮә80fd 60пјҢдҪҶжҳҜvimдёҚдјҡгҖӮ - Chris Morgan
3个回答

7

(这个答案可能有些断裂,我尝试了一段时间才找到一个解决方案 - 我想要找到一个解决方案,因为它让我感到好奇,并不是因为那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 使用vgetcvpeekc... (不,我不知道这会去哪里!)然后这些在许多地方使用。

无论如何,我想关键点可能就在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列表上询问。


请注意,一旦我发现问题在Windows上和Linux上都存在,我就完全在Linux上进行了测试。如果您愿意,我可以在Windows上以类似的方式进行测试,或者您也可以。我认为您会发现大致相同的情况:对窗口本身进行操作会将内容放入脚本输出中。 - Chris Morgan

1

我最好的猜测是这是gVim GUI代码中的一个错误。

使用gVim 7.3,如果我运行gvim -u NONE -W scriptout,那么我会看到问题,但如果我运行vim -u NONE -W scriptout,则不会出现不需要的字节。

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


谢谢您的回答。我可能需要查看代码才能找出原因。您能否在Linux下尝试一下? - Benoit
@Benoit 是的,在Linux上很好用,而且在OS X上终端和GUI都可以。我编辑了我的答案来展示这一点。 - Rich

0

在vimgolf项目中,有人已经为我们完成了艰苦的工作,特别是这个有详细注释的文件:https://github.com/igrigorik/vimgolf/blob/master/lib/vimgolf/lib/vimgolf/keylog.rb

0x80 是用于表示特殊双字节代码的转义序列。在这种情况下,它们代表了gvim的焦点事件。请参见here


      # 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接