Vim - изменения настроек ftplugin не обновляются для существующего файла

Похоже, что для файлов, которые я уже однажды открывал в Vim, происходит какое-то странное поведение, похожее на кеширование. У меня есть файл foo.txt, который я открыл, а затем я изменил некоторые настройки в ~/.vim/after/ftplugin/text.vim, но эти новые настройки не отображаются в foo.txt. Я могу выйти из vim и снова открыть foo.txt или перезагрузить :e или даже :so ~/.vim/after/ftplugin/text.vim, но, похоже, ничего из этого не влияет на настройки foo.txt. Если я mv foo.txt bar.txt, настройки для bar.txt отображаются без проблем.

ИЗМЕНИТЬ

Кажется, я могу принудительно перезагрузить настройки для foo.txt в следующей последовательности:

  1. :so ~/.vimrc
  2. :so ~/.vim/after/ftplugin/text.vim

Вопросы:

  1. Зачем это нужно/почему не подхватились остальные настройки?
  2. Почему источников ~/.vimrc было недостаточно? Он применил настройки, которые были прямо указаны в ~/.vimrc, но разве ftplugins не должны были быть загружены в строке filetype plugin indent on? Почему впоследствии был необходим источник text.vim?

person Kvass    schedule 27.02.2017    source источник


Ответы (2)


Vim среда выполнения состоит из нескольких сотен файлов, я не знаю, почему вы ожидайте, что Vim будет постоянно следить за ними. Это не так. Эти файлы загружаются в некоторых четко определенных (и задокументированных) точках, вот и все.

В частности, не существует безопасного способа перезагрузить вашу конфигурацию. Вы можете делать такие вещи, как :so ~/.vimrc, но если вы специально не написали свой vimrc с учетом этого, будут недостатки (например, накопление autocmd). Если вы хотите быть в безопасности, вам нужно выйти из Vim и запустить его снова. Так работает Вим.

Теперь для ftplugins вам может сойти с рук что-то вроде этого:

:setf text

(используйте фактический тип файла вместо text). Это работает для простых set fubar опций. Это работает, потому что под капотом setf на самом деле тщательно написанное autocmd. Он по-прежнему не работает для более сложных конструкций (таких как autocmds или переменные в файловой области), по тем же причинам, что и :so ~/.vimrc, имеет недостатки.

person Sato Katsura    schedule 27.02.2017

Еще несколько уточнений:

  • .vimrc загружается один раз -> для определения глобальных вещей
  • то же самое с .gvimrc, грузится только с gvim после .vimrc
  • плагины также загружаются один раз, после файлов vimrc -> для глобальных вещей
  • автозагружаемые плагины загружаются по запросу один раз, когда вызывается определяемая ими функция
  • ftplugins загружаются один раз для каждого буфера (и, возможно, несколько раз! Поскольку может быть несколько буферов, требующих их загрузки) -> для определений, которые должны применяться только к текущему буферу, который инициировал его загрузку.
  • есть также скрипты langmap, скрипты синтаксиса, скрипты отступов и даже старые скрипты macros/ (загружаемые явно/вручную)
  • некоторые плагины предоставляют локальные vimrcs (в основном идентичные ftplugins, но загружаемые в зависимости от текущего каталога буфера, а не его типа файла).

Как видите, все вещи загружаются только один раз. Если вы хотите загрузить их несколько раз, вам придется сделать это вручную и явно. Вот почему у некоторых из нас есть команда :Reload, которая упрощает перезагрузку любого скрипта — мой спрятан в моей коллекции скриптов: lh-misc -> plugin/vim-maintain.vim

person Luc Hermitte    schedule 27.02.2017
comment
Одна из основных проблем с документацией Vim (если не главная) — это отсутствие общего представления о том, как вещи сочетаются друг с другом. По этой причине каждый должен обнаруживать такие детали, анализируя их снизу вверх, поэтому подавляющее большинство людей сдаются, даже не попытавшись. Интересно, можем ли мы что-нибудь с этим сделать. - person Sato Katsura; 28.02.2017
comment
@СатоКацура. Раньше у нас были советы по vim, а потом мы перешли на vim.wikia.com. Было вложено много сил, чтобы разобраться в различных советах, отредактировать их... Джон и Фриц, среди прочих, проделали потрясающую работу по этой теме. К сожалению, викия не очень нравится. Частично из-за навязчивой рекламы, когда мы не вошли в систему, частично из-за того, что мы никогда не находили время, чтобы закончить и заполнить базу данных советов. Кроме того, на него распространяется политика SO/SE, запрещающая внешние ссылки. Как следствие, нам почти приходится начинать заново, это не помогает капитализировать знания. Итак, теперь у нас есть документация vim по SO... - person Luc Hermitte; 28.02.2017