Содержимое Vim не работает должным образом

462
Klas. S

Я попытался расширить синтаксис C в Vim с помощью примера в руководстве.

Сначала я запускаю vim без каких-либо настроек:

vim -u NONE test.c 

Затем я загружаю c-синтаксис и создаю свое расширение

syntax on syntax keyword myword HELP containedin=cComment contained highlight myword guibg=red 

код:

1: /* HELP */ 2: int main(int argc, char **argv) { 3: int HELP = 0; 4: if(HELP); 5: } 

ПОМОЩЬ выделена в строке 1, как и ожидалось. Это также выделено в строке 4, есть ли какое-то объяснение этому?

2

1 ответ на вопрос

0
Ingo Karkat

Вам нужно выяснить, какая группа синтаксиса «занимает» HELPв третьей строке, которая не охвачена вашим правилом синтаксиса. :syn listпоказывает все активные группы, но это проще, когда вы устанавливаете SyntaxAttr.vim - Показать атрибуты подсветки синтаксиса символа под плагином курсора .

SyntaxAttr говорит мне, что cBlockсинтаксис совпадает там; это также должно быть включено в ваше расширение:

syntax keyword myword HELP containedin=cComment,cBlock contained 
Если я `: вызываю SyntaxAttr ()`, когда курсор находится в скобках, он дает мне только `group: myword guibg = red (# ff0000)`. Я не понимаю, почему я должен включать `cBlock`, так как я хочу ограничить количество мест, где используется выделение моего слова. Klas. S 6 лет назад 0
`CBlock` охватывает все внутри` {`...`} `и предотвращает совпадение. Это определение находится в `$ VIMRUNTIME / syntax / c.vim`. Это также затеняет `HELP` в строке 4; однако, это содержится в `cParen`, который` содержит = ALLBUT, ... `` ALL` делает это включающим ваше `мое слово`, и поэтому оно подсвечивается без необходимости в вас" содержащийся в = cParen ". Ingo Karkat 6 лет назад 0