Vim 为什么窗口拆分强制为只读?

Vim 为什么窗口拆分强制为只读?,vim,Vim,我正在使用vim进行编程。在一天的开始,我将打开一个文件,然后进行几个窗口拆分,并将一些文件打开到缓冲区中,以便它们随时可用。直到最近,这才奏效 然而,在过去的一周左右,情况发生了变化;我的一个可写缓冲区被切换为只读,我不知道为什么。以下是命令的顺序: 打开文件a.h vsplit/ 打开fileA.cpp C-w C-w切换到包含文件a.h的窗口 sp/ 对于步骤1-4,所有窗口都是可编辑的。当我执行步骤5时,新的文件浏览窗口是只读的(正如预期的那样),但是现在保存fileA.cpp的窗口也被

我正在使用vim进行编程。在一天的开始,我将打开一个文件,然后进行几个窗口拆分,并将一些文件打开到缓冲区中,以便它们随时可用。直到最近,这才奏效

然而,在过去的一周左右,情况发生了变化;我的一个可写缓冲区被切换为只读,我不知道为什么。以下是命令的顺序:

  • 打开文件a.h
  • vsplit/
  • 打开fileA.cpp
  • C-w C-w切换到包含文件a.h的窗口
  • sp/
  • 对于步骤1-4,所有窗口都是可编辑的。当我执行步骤5时,新的文件浏览窗口是只读的(正如预期的那样),但是现在保存fileA.cpp的窗口也被标记为只读。fileA.h仍然是可编辑的。为什么会这样


    更让我困惑的是,如果我不执行步骤4,就不会有问题(即,我拆分了保存fileA.cpp而不是fileA.h的窗口)。另外,如果我在第5步中使用“sp fileB.h”而不是首先拆分到文件浏览器,则不会出现问题。

    看起来这可能是netrw插件中的错误。我使用两个版本的Vim 7.3(MacPorts
    Vim
    7.3-353和MacPorts
    MacVim
    snapshot64”7.3-390)对多个版本的netrw进行了测试:

    • v140(包括在MacPorts
      vim
      :7.3-353中)
      仅在MacPorts vim版本中测试
    • v141(从上到下)
    • v142(来自
      vim.org/scripts
      netrw页面)
    • v143(包括在MacPorts
      MacVim
      :7.3-390中)
      仅使用MacPorts MacVim版本进行测试
    • v144b(从中预发布)
    您可以使用
    :let g:loaded\u netrwPlugin
    检查您的活动netrw版本

    v140到v142在复制场景时都有合理的行为:

    • 只有netrw缓冲区(来自
      sp.
      ;右侧,上部窗口)是只读的。
      左侧窗口中的
      fileA.cpp
      缓冲区保持为非只读
    使用v143和v144b,我能够重现您的行为:

    • netrw缓冲区(右侧,上部窗口)和
      fileA.cpp
      buffer(左侧)都变为只读
    • 此外(即OP未报告,但似乎相关),左侧的
      fileA.cpp
      窗口成为活动窗口。
      通常,右侧上部窗口(来自
      sp.
      的窗口)应处于活动状态
    fileA.cpp
    窗口最初是一个netrw窗口(来自
    vsp.
    )。我猜v143和v144b中的某些东西出于某种原因在重置旧窗口时有点过于热心(它可能根本不应该触及该窗口)
    sp fileB.h
    通过不调用netrw来避免问题(即问题不在于拆分窗口,而在于netrw在创建目录列表缓冲区时所做的事情)


    如果您的问题来自netrw(即,您的行为符合我的描述,并且您的目录列表缓冲区中有文本
    netrw目录列表
    ,并且(例如)
    (netrw v143)
    (假设您没有禁用netrw横幅),则您可以通过安装较旧的(?)netrw的版本(即v142)

    netrw打包为“vimball归档”。vimball插件随Vim 7.0及更高版本一起提供。您只需获取一个vimball文件,将其安装到
    运行时路径中的第一个目录中(通常
    ~/.vim

    如果您使用隔离Vim插件(强烈推荐!),则可以将其安装到捆绑目录:

    :e /path/to/netrw.vba.gz
    :UseVimball ~/.vim/bundle/netrw
    :q
    

    你使用的插件是什么?一般来说,尽量消除干扰插件。我猜,您使用的是NERDTree之类的东西,它会干扰其他插件的映射。vim-u NONE是否仍会发生这种情况?如果不是的话,@sehe可能是对的。这是一些分析工作,+1是个不错的回答!看来我有netrw的v143。按照你的指示,我降到了142级,现在可以工作了。仅供参考,我确实看到了fileA.cpp抓住焦点的行为。我只是忘了记录那个细节。谢谢你克里斯的精彩回答。诊断帮助和详细的解决方案-非常有用。通过病原体返回到142对我来说非常有用。147是(目前)可用的最新版本,它给我带来了更严重的问题。@PaulBrannan:我找到了v144b的旧版本,并在vim 7.4-258上重现了这个问题。使用相同的vim安装,我无法在v147、v149、v150或v153j(当前的beta版)中重现此问题。所以,是的,看起来v150也解决了这个问题。
    :e /path/to/netrw.vba.gz
    :UseVimball ~/.vim/bundle/netrw
    :q