Ваш ответ - обходной путь (хотя вы должны использовать :setlocal
вместо :set
, чтобы избежать утечки синтаксиса к новым буферам, которые открываются из этого), но он не атакует основную причину, котораяВы найдете объяснение в :help autocmd-nested
:
По умолчанию автокоманды не вкладываются.Если вы используете ": e" или ": w" в автокоманде, Vim не выполняет автокоманды BufRead и BufWrite для этих команд.Если вы этого хотите, используйте флаг «nested» для тех команд, в которые вы хотите вложить.
Подсветка синтаксиса (вы говорите colorscheme в заголовке, но на самом деле это только атрибуты цвета и шрифта, которыезатем используются для подсветки синтаксиса) на основе событий :autocmd
(то же самое касается плагинов файлового типа , поэтому любые связанные с C ++ параметры, которые вы также не найдете в файле split, при условии, что у вас есть :filetype plugin on
в вашем ~/.vimrc
).Без атрибута nested
файл разделения будет открыт, но с ним не будет выполнено ни одно из обычных действий.Хотя вложение в целом может быть проблематичным, это один из тех случаев, когда это необходимо.
au BufRead,BufNewFile *.cpp nested exe "bel vsplit" fnameescape(expand("%:r").".h")
au BufRead,BufNewFile *.h nested exe "vsplit" fnameescape(expand("%:r").".cpp")
К сожалению, это порождает другую проблему: один autocmd вызовет другой, и наоборот (допредел).Вам нужно следить за действиями, чтобы разделение выполнялось только в том случае, если файл еще не открыт.(Это также улучшает удобство использования в общем случае, когда вы открываете файл с другим уже открытым.) :help bufwinnr()
проверяет, является ли целевой буфер уже видимым в окне:
au BufRead,BufNewFile *.cpp nested if bufwinnr("^" . expand("%:r").".h$") == -1 | exe "bel vsplit" fnameescape(expand("%:r").".h") | endif
au BufRead,BufNewFile *.h nested if bufwinnr("^" . expand("%:r").".cpp$") == -1 | exe "vsplit" fnameescape(expand("%:r").".cpp") | endif