【问题标题】:Vim echoing current line after save command保存命令后 Vim 回显当前行
【发布时间】:2021-03-03 20:24:56
【问题描述】:

在 vim 中保存文件后,会立即回显当前行,然后回显文件名和“已写入”消息。这没关系,我想这是正常的 vim 行为,但是在处理更多文件一段时间后,一些文件会多次回显当前行(在某些情况下最多 6 次,如屏幕截图所示)。由于此输出大于命令行高度,因此会触发提示“按 ENTER 或命令继续”。

  1. 我怎样才能知道为什么某些文件的当前行的回显会成倍增加?
  2. 如果保存后当前行的回显对于 vim 不正常,是否可以合理地找出回显当前行的内容(我有相当数量的插件和配置,我希望避免依次禁用每个找出是什么造成了这种混乱)。
  3. 如果回显是由vim完成的,是否可以完全禁用它?

【问题讨论】:

  • 通过保存 (:w) vim 不会回显“当前”行。简而言之,它将报告在哪个文件中写入了多少字符,例如在您的屏幕截图中,文件名 app.js 有 58 行和 1622 个字符。尝试通过vim -u NONE 启动你的vim,看看问题是否仍然存在。

标签: vim macvim


【解决方案1】:

诊断

这不是 Vim 的默认行为。只有filename, 3L 42C written 消息来自:write

因为回显的行包含行号和突出显示,它看起来好像是由:print:number 命令生成的。

实例数量增加的事实表明这是由重新定义的某些:autocmd 引起的(没有正确清除以前的定义)。

疑难解答提示

通常,二分搜索,您禁用一半(文件类型)插件,然后只禁用一半(当问题仍然存在时),或另一半(当问题仍然存在时) vanished) 让您快速找到有问题的脚本。您的~/.vimrc 中的配置也可以这样做(通过注释掉块)。

此外,您可以使用vim -V20vimlog 捕获 Vim 会话的完整日志。退出 Vim 后,检查 vimlog 日志文件中的可疑命令,在您的情况下为 :print:number:echo[msg]

【讨论】:

    【解决方案2】:

    不,Vim 在将缓冲区写入磁盘时不会回显当前行。它可能是通过自动命令绑定到某个事件的命令/函数。

    1. 寻找可能的自动命令:

      :verbose autocmd bufwrite,bufwritepre,bufwritepost,bufwritecmd
      :verbose autocmd filewritepre,filewritepost,filewritecmd
      :verbose autocmd fileappendpre,fileappendpost,fileappendcmd
      :verbose autocmd filterwritepre,filterwritepost
      
    2. 寻找可能的映射:

      :verbose map :w
      and so on…
      

    另外,你使用语法吗?

    【讨论】:

      【解决方案3】:

      这种情况最近开始发生在我身上,尽管当前行每次写入只回显/打印一次,而不是最多 6 次。

      正如 Ingo Karkat 在他的回答中建议的那样,通过对我的插件和 vimrc 进行二进制搜索,我将其缩小到以下组合:

      • 一个插件相当于:autocmd BufWritePre * noautocmd | ...
      • 我的'shortmess'既不包含o也不包含O

      我不知道为什么这种组合会导致当前行被回显/打印。但这是对noautocmd 命令修饰符的错误使用;它应该是noautocmd ... 而不是noautocmd | ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多