Vim colorscheme не загружается при использовании автокоманды BufNewFile - PullRequest
0 голосов
/ 16 декабря 2018

При попытке автоматически открыть соответствующий файл .cpp или .h с помощью автокоманды я не вижу никакой схемы цветов в соответствующем открываемом файле.Я не слишком знаком с vimscript, но я полагаю, что Vim открывает файл, думая, что он относится к типу файлов ".txt" и поэтому использует цветовую схему по умолчанию.

Две строки автокоманд в ~ / .vimrc:

au BufRead,BufNewFile *.cpp exe "bel vsplit" fnameescape(expand("%:r").".h")
au BufRead,BufNewFile *.h exe "vsplit" fnameescape(expand("%:r").".cpp")

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Ваш ответ - обходной путь (хотя вы должны использовать :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
0 голосов
/ 17 декабря 2018

Если кто-то захочет взглянуть на это в будущем, решение было таково: Vim загружал второй файл как синтаксис = нет.Поэтому добавление | set syntax=cpp в конце каждой автоматической команды исправляло это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...