Как не допустить, чтобы глобальные значения по умолчанию переопределяли специфические настройки '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 повторно отредактируйте текущий файл

Другие вопросы по тегам