Почему раскол окна форсируется только для чтения?

Я использую vim для программирования. В начале дня я открою файл и приступаю к распаду нескольких окон и открываю некоторые файлы в буферы, чтобы они были легко доступны. До недавнего времени это только что сработало.

В последнюю неделю или около того, однако, что-то изменилось; один из моих перезаписываемых буферов переключается на чтение, и я понятия не имею, почему. Здесь последовательность команд:

  • Открыть файлA.h
  • vsplit./
  • открыть файлA.cpp
  • C-w C-w для переключения в окно, содержащее файлA.h
  • sp./

Для шагов 1-4 все окна доступны для редактирования. Когда я выполняю шаг 5, новое окно просмотра файлов является readonly (как и ожидалось), но теперь окно, в котором файл fileA.cpp помечен как readonly тоже. fileA.h все еще доступен для редактирования. Почему это происходит?

Чтобы запутать меня еще больше, если я не делаю шаг 4, проблем нет (т.е. я разбил окно, содержащее файлA.cpp вместо fileA.h). Кроме того, если я делаю "sp fileB.h" на шаге 5 вместо того, чтобы сначала разбивать на файловый браузер, проблем нет.

Ответы

Ответ 1

Похоже, что это может быть ошибка в плагине netrw. Я тестировал несколько версий netrw с двумя сборками Vim 7.3 (MacPorts vim 7.3-353 и MacPorts MacVim "snapshot64" 7.3-390):

  • v140 (входит в MacPorts vim: 7.3-353)
    Протестировано только с помощью сборки VMP MacPorts.
  • v141 (из vim.org/scripts netrw page)
  • v142 (с страницы vim.org/scripts netrw)
  • v143 (входит в MacPorts MacVim: 7.3-390)
    Протестировано только с MacPorts MacVim build.
  • v144b (предварительная версия netrw authors Vim page)

Вы можете проверить свою активную версию netrw с помощью :let g:loaded_netrwPlugin.

от v140 до v142 все имели разумное поведение при воспроизведении вашего сценария:

  • Только буфер netrw (от sp ., правая сторона, верхнее окно) доступен только для чтения.
    Буфер fileA.cpp в левом окне остается нечитаемым.

С v143 и v144b я смог воспроизвести ваше поведение:

  • Оба буфера netrw (правая сторона, верхнее окно) и буфер fileA.cpp (слева) становятся доступными только для чтения.
  • Дополнительно (т.е. не сообщается OP, но, похоже, связано), окно fileA.cpp с левой стороны становится активным окном.
    Обычно правая сторона, верхнее окно (одно из sp .) должно быть активным.

Окно fileA.cpp изначально представляло собой окно netrw (от vsp .). Я предполагаю, что кое-что в v143 и v144b немного переусердствует при первоначальном сбросе старого окна (вероятно, это не должно касаться этого окна вообще). sp fileB.h устраняет проблему, не вызывая netrw (то есть проблема не в разбиении окон, а на том, что netrw делает при создании буфера списка каталогов).


Если ваша проблема исходит из netrw (т.е. ваше поведение соответствует моему описанию, а ваши буферы списка каталогов имеют текст Netrw Directory Listing и (например) (netrw v143) на второй строке - если вы не отключили баннер netrw), то вы можете исправить его, установив более старую (?) версию netrw (т.е. v142).

netrw упакован как "архив vimball". Плагин vimball поставляется с Vim 7.0 и более поздними версиями. Вы просто создаете файл vimball для его установки в первый каталог в runtimepath (обычно ~/.vim).

:e /path/to/netrw.vba.gz
:so %
:q

Если вы используете pathogen, чтобы изолировать свои плагины Vim (настоятельно рекомендуется!), вы можете установить его в каталог пакетов:

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