Настройка подсветки синтаксиса в Vim


Как я могу сохранить все текущее форматирование для типа файла, но добавить функциональность.

Я хотел бы выделить цвета внутри .vim файлы так, чтобы каждый цвет был выделен, как терминал будет решать его.

Я создал vim.vim файл, содержащий:

syn keyword yellow yellow containedin=All                                                    
highlight yellow ctermfg=yellow                                                              

syn keyword red red containedin=all                                                          
highlight red ctermfg=red                                                                    

И поместить его в ~/.vim/after/syntax/vim.vim

Как предложено здесь.

Это не имеет никакого эффекта.


Обновление

На самом деле я ошибся, когда сказал, что мои изменения не действовать. Если вы наберете yellow само собой на строке, она будет выделена желтым цветом. К сожалению, это не решает мою проблему.

Я добавил функциональность F3, описанную Al.

Когда я f3 над Желтым (в контексте ctermfg=yellow), он возвращает:

hi<vimHiCtermColor> trans<vimHiCtermColor> lo<vimHiCtermColor> FG:-1 BG:-1

Затем :syn list vimHiCtermColor возвращает:

--- Syntax items ---
vimHiCtermColor xxx contained lightmagenta darkgray lightgrey darkgrey lightgreen lightgray darkmagenta gray white red grey darkred brown darkblue darkgreen lightblue yellow cyan
                   contained lightcyan lightred black blue green magenta darkcyan darkyellow

Я проверил :syn list darkgray (что-то, что я не определил), чтобы увидеть, существует ли это:

--- Syntax items ---
E28: No such highlight group name: darkgray
Hit ENTER or type command to continue

Куда мне теперь идти?

2 4

2 ответа:

Решение

Вот прямой ответ на окраску только слова желтый.

syn cluster vimHiCtermColors contains=vimHiCtermColorYellow
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorYellow ctermfg=yellow

И вот решение для раскрашивания всех названий цветовых терминалов. Они только окрашены в терминале (не в графическом интерфейсе), а другие атрибуты (256-цветной терминал, цвета графического интерфейса, атрибуты, такие как полужирный шрифт) вообще не выделяются. Чтобы расширить это, вы, вероятно, захотите, чтобы какой-то сценарий повторял все возможные значения.

syn cluster vimHiCtermColors contains=vimHiCtermColorBlack,vimHiCtermColorBlue,vimHiCtermColorBrown,vimHiCtermColorCyan,vimHiCtermColorDarkBlue,vimHiCtermColorDarkcyan,vimHiCtermColorDarkgray,vimHiCtermColorDarkgreen,vimHiCtermColorDarkgrey,vimHiCtermColorDarkmagenta,vimHiCtermColorDarkred,vimHiCtermColorDarkyellow,vimHiCtermColorGray,vimHiCtermColorGreen,vimHiCtermColorGrey,vimHiCtermColorLightblue,vimHiCtermColorLightcyan,vimHiCtermColorLightgray,vimHiCtermColorLightgreen,vimHiCtermColorLightgrey,vimHiCtermColorLightmagenta,vimHiCtermColorLightred,vimHiCtermColorMagenta,vimHiCtermColorRed,vimHiCtermColorWhite,vimHiCtermColorYellow

syn keyword vimHiCtermColorBlack black contained
syn keyword vimHiCtermColorBlue blue contained
syn keyword vimHiCtermColorBrown brown contained
syn keyword vimHiCtermColorCyan cyan contained
syn keyword vimHiCtermColorDarkBlue darkBlue contained
syn keyword vimHiCtermColorDarkcyan darkcyan contained
syn keyword vimHiCtermColorDarkgray darkgray contained
syn keyword vimHiCtermColorDarkgreen darkgreen contained
syn keyword vimHiCtermColorDarkgrey darkgrey contained
syn keyword vimHiCtermColorDarkmagenta darkmagenta contained
syn keyword vimHiCtermColorDarkred darkred contained
syn keyword vimHiCtermColorDarkyellow darkyellow contained
syn keyword vimHiCtermColorGray gray contained
syn keyword vimHiCtermColorGreen green contained
syn keyword vimHiCtermColorGrey grey contained
syn keyword vimHiCtermColorLightblue lightblue contained
syn keyword vimHiCtermColorLightcyan lightcyan contained
syn keyword vimHiCtermColorLightgray lightgray contained
syn keyword vimHiCtermColorLightgreen lightgreen contained
syn keyword vimHiCtermColorLightgrey lightgrey contained
syn keyword vimHiCtermColorLightmagenta lightmagenta contained
syn keyword vimHiCtermColorLightred lightred contained
syn keyword vimHiCtermColorMagenta magenta contained
syn keyword vimHiCtermColorRed red contained
syn keyword vimHiCtermColorWhite white contained
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorBlack ctermfg=black
highlight vimHiCtermColorBlue ctermfg=blue
highlight vimHiCtermColorBrown ctermfg=brown
highlight vimHiCtermColorCyan ctermfg=cyan
highlight vimHiCtermColorDarkBlue ctermfg=darkBlue
highlight vimHiCtermColorDarkcyan ctermfg=darkcyan
highlight vimHiCtermColorDarkgray ctermfg=darkgray
highlight vimHiCtermColorDarkgreen ctermfg=darkgreen
highlight vimHiCtermColorDarkgrey ctermfg=darkgrey
highlight vimHiCtermColorDarkmagenta ctermfg=darkmagenta
highlight vimHiCtermColorDarkred ctermfg=darkred
highlight vimHiCtermColorDarkyellow ctermfg=darkyellow
highlight vimHiCtermColorGray ctermfg=gray
highlight vimHiCtermColorGreen ctermfg=green
highlight vimHiCtermColorGrey ctermfg=grey
highlight vimHiCtermColorLightblue ctermfg=lightblue
highlight vimHiCtermColorLightcyan ctermfg=lightcyan
highlight vimHiCtermColorLightgray ctermfg=lightgray
highlight vimHiCtermColorLightgreen ctermfg=lightgreen
highlight vimHiCtermColorLightgrey ctermfg=lightgrey
highlight vimHiCtermColorLightmagenta ctermfg=lightmagenta
highlight vimHiCtermColorLightred ctermfg=lightred
highlight vimHiCtermColorMagenta ctermfg=magenta
highlight vimHiCtermColorRed ctermfg=red
highlight vimHiCtermColorWhite ctermfg=white
highlight vimHiCtermColorYellow ctermfg=yellow

Объяснение

Если вы посмотрите в цветах / vim.vim и поиск cterm, вы увидите строку

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError

Это говорит о том, что, когда встречается ctermfg= или ctermbg=, выделите следующее слово как vimNumber, vimHiCtermColor, vimFgBgAttrib, или vimHiCtermError. Глядя на vimHiCtermColor (несколько строк выше), мы видим

syn keyword vimHiCtermColor contained   black blue brown cyan darkBlue darkcyan darkgray darkgreen darkgrey darkmagenta darkred darkyellow gray green grey lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightred magenta red white yellow

Здесь перечислены все имена цветовых терминалов, и они выделены как ключевые слова с той же синтаксической группой. Поэтому вместо того, чтобы выделять их все вместе, мы можем выделить их по отдельности. Четыре строки первого решения выше описаны шаги:

  1. создайте новый кластер, @vimHiCtermColors содержащий каждую из групп на Шаге 2.
  2. добавьте новое ключевое слово для каждого значения цвета.
  3. измените определение vimHiCtermFgBg, Чтобы использовать @vimHiCtermColors вместо vimHiCtermColor.
  4. Выделите каждое ключевое слово по своему усмотрению.
Причина, по которой то, что вы пытались сделать, не сработало, двояка. Во-первых, синтаксические группы, указанные в nextgroup, предпочтительнее общих групп (ваша yellow группа, в частности). Но, вы можете скажите: "А как же containedin=ALL?- Это второй пункт. Ключевые слова являются отдельными единицами и не могут содержать ничего другого. Исходная группа vimHiCtermColor состояла из всех ключевых слов, поэтому ваш containedin=ALL не мог ее переопределить. Если бы vimHiCtermColor было совпадением, а не ключевым словом, это могло бы сработать.

Я ожидал бы, что подход ~/.vim/after/syntax/vim.vim будет работать, но если ключевое слово (желтый) уже выделено, вам может потребоваться изменить сопоставитель с чем-то вроде:

syn keyword yellow yellow containedin=ALL

Что это за файл, который вы пытаетесь выделить?

Edit

Я посмотрел на яву.vim-файл и похоже, что есть много перекрывающихся синтаксических групп, которые могут сделать настройку подсветки довольно сложной. Вот что я сделал, на случай, если это поможет.

Полезное отображение is:

" What is the current syntax highlighting group?
map <F3> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" . " FG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"fg#") . " BG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"bg#")<CR>

Затем вы можете переместить курсор на то, что вас интересует, и нажать F3, чтобы увидеть текущую группу выделения. В качестве теста я открыл java.vim в каталоге синтаксиса и перешел к строке 52, которая определяет javaStorageClass. Я решил выделить слово transient в этой строке (поскольку yellow нигде не было в файле, и мне нужно было с чем-то работать).

Я навел курсор на transient и нажал F3. Напор сообщено:
hi<vimSynKeyRegion> trans<vimSynKeyRegion> lo<vimSynKeyRegion> FG: BG:
Очевидно, это часть вимсынкейского региона, который, как можно догадаться из названия, является syn region. Я решил посмотреть на это дальше, поэтому я спросил текущую конфигурацию подсветки:
:redir @a>
:silent syn list
:redir END
:vnew
"ap

При этом создается файл, содержащий всю синтаксическую информацию. Я искал vimSynKeyRegion и нашел эту строку:

vimSynKeyRegion xxx matchgroup=vimGroupName start=/\k\+/ skip=/\\\\\|\\|/ matchgroup=vimSep end=/|\|$/  contained oneline keepend contains=@vimSynKeyGroup 

В vimSynKeyRegion были сконфигурированы элементы из синтаксического кластера с именем vimSynKeyGroup. Поэтому мы можем выделить transient, сделав его ключевое слово в этой группе:

:syn keyword MyNewGroup transient
:hi MyNewGroup guifg=#ff00ff
:syn cluster vimSynKeyGroup add=MyNewGroup

Хотя это может не совсем соответствовать тому, что вы хотите сделать, надеюсь, это даст вам что-то для работы. Вы можете обнаружить, что некоторые части не могут быть переопределены (если они совпадают с ключевыми словами или подобными), но вы всегда можете переопределить выделение, чтобы изменить цвет, например
:hi vimGroupName guifg=#ffff00
Надеюсь, все это поможет.