Ответ 1
Ну, вы уже нашли проблему, но вот почему.
Существует три основных типа синтаксического соответствия: ключевые слова, совпадения и регионы. Ключевые слова - это фиксированные строки, обычно используемые для ключевых слов основного языка (int
, double
,...), а также, в вашем случае, для FIXME и TODO. Я действительно имею в виду фиксированные строки; они должны быть точными и целыми словами, в отличие от совпадений и областей, которые используют регулярное выражение. Например, из синтаксиса C:
syn keyword cTodo contained TODO FIXME XXX
Это похоже на почти все встроенные определения синтаксиса, только с разными именами групп (cTodo).
iskeyword
указывает vim, может ли данный символ быть частью ключевого слова. По умолчанию он не включает двоеточия, поэтому при поиске ключевых слов vim видит "FIXME:" как "FIXME" и игнорирует двоеточие. Если вы примените двоеточие (set iskeyword+=:
), вы можете теперь определить дополнительный бит выделения:
syn keyword myTodo contained TODO: FIXME:
Это зависит от вас, как вы хотите работать в существующих синтаксических/выделенных группах. Если это всего лишь один тип файла, вы можете добавить его в эту группу todo todo (например, cTodo). Если вы хотите его повсюду, вы можете сделать "myTodo", как я предложил, а затем связать его прямо с группой подсветки Todo (hi def link myTodo Todo
).
В качестве альтернативы вы можете оставить только iskeyword
(я бы, вероятно, рекомендовал это), и просто использовать совпадение:
syn match myTodo contained "\<\(TODO\|FIXME\):"
hi def link myTodo Todo