Как не допустить, чтобы глобальные значения по умолчанию переопределяли специфические настройки 'filetype=vim' в.vimrc при автоматическом поиске.vimrc?
контекст
У меня есть мой .vimrc
автоматически получает с:
autocmd! BufWritePost ~ /.vimrc source ~ /.vimrc
Я также установил значения по умолчанию для интервалов:
set tabstop = 2 softtabstop = 2 shiftwidth = 2 expandtab
Позже я использую FileType
Событие для переопределения интервала по умолчанию, указанного выше, с интервалом, специфичным для типа файла:
" Syntax of these languages is fussy over tabs & spaces¬
autocmd FileType make setlocal ts=8 sts=8 sw=8 noexpandtab¬
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab¬
" Customisations based on house-style (arbitrary)
autocmd FileType sh setlocal ts=4 sts=4 sw=4 expandtab
autocmd FileType vim setlocal ts=4 sts=4 sw=4 expandtab
проблема
Проблема, с которой я сталкиваюсь, заключается в том, что .vimrc
установит значения по умолчанию, но не сработает FileType
событие. Это означает, что когда я делаю :write
к моему .vimrc
при редактировании файла с интервалом, специфичным для типа файла, интервалы, специфичные для типа файла, переопределяются по умолчанию!
ОБНОВЛЕНИЕ: Как указывает Инго, проблема возникает только в .vimrc
и не встречается ни в каких других файлах.
пример
Например, когда я работаю над .vimrc
изначально интервал для файла (ts=4 sts=4 sw=4 expandtab
), но после внесения каких-либо произвольных изменений в мой .vimrc
, интервал по умолчанию (tabstop=2 softtabstop=2 shiftwidth=2 expandtab
), но мой интервал для конкретного файла НЕ загружается (так как FileType
событие не было вызвано записью в мой .vimrc
) оставив меня с интервалом по умолчанию!
Мои вопросы)
Как я могу переопределить интервал по умолчанию с помощью интервалов, специфичных для типов файлов, и сохранить их даже при автоисключении .vimrc
?
Если возможно, я бы хотел сделать это, не избавляясь от autocmd. Это возможно?
Я догадываюсь, что я должен каким-то образом вручную вызвать событие FileType при поиске .vimrc
Можно ли это сделать, и является ли это рекомендуемым подходом?
3 ответа
Я решил эту проблему путем группировки источников autocmd
с другим autocmd
с тем же событием
" Reload changes to .vimrc automatically
autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim
Я пробовал это раньше, но я также использовал AirlineRefresh
Команда для Vim-Airlines как таковая:
autocmd BufWritePost ~ /.vimrc source ~ /.vimrc | Авиакомпания Refresh | setlocal filetype=vim
который давал мне эту ошибку:
E488: Конечные символы: AirlineRefresh | setlocal filetype=vim
Переключение порядка AirlineRefresh
а также set local filetype=vim
исправил ошибку и приводит к желаемому поведению:
autocmd BufWritePost ~ /.vimrc source ~ /.vimrc | setlocal filetype = vim | AirlineRefresh
Хотя вы очень четко описали проблему, я сомневаюсь, что это происходит.
Как вы правильно используете :setlocal
для специфичных для типа файла настроек, и :set
в вашем ~/.vimrc
, источник последнего будет влиять только на глобальные значения по умолчанию (и текущий буфер, который является вашим .vimrc
в течение BufWritePost
событие). Чтобы повлиять на другие буферы, необходимо :bufdo
командовать в вашем .vimrc
,
Вы можете проверить это с
:verbose set ts? sts? sw? et?
Чтобы избежать этого ваш .vimrc
настройки переопределяются глобальными настройками, вы можете добавить это:
if expand('%:t') ==# '.vimrc'
setlocal filetype=vim
endif
:bufdo e
сделаю это, но я не мог просто добавить это к моему .vimrc
, Это также удалит подсветку синтаксиса, что не очень хорошо.
:h bufdo
выполнить команду в каждом буфере в списке буферов
:h :e
повторно отредактируйте текущий файл