Настройка подсветки синтаксиса в 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 ответа:
Решение
Вот прямой ответ на окраску только слова желтый.
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
Здесь перечислены все имена цветовых терминалов, и они выделены как ключевые слова с той же синтаксической группой. Поэтому вместо того, чтобы выделять их все вместе, мы можем выделить их по отдельности. Четыре строки первого решения выше описаны шаги:
Причина, по которой то, что вы пытались сделать, не сработало, двояка. Во-первых, синтаксические группы, указанные в
- создайте новый кластер,
@vimHiCtermColors
содержащий каждую из групп на Шаге 2.- добавьте новое ключевое слово для каждого значения цвета.
- измените определение
Выделите каждое ключевое слово по своему усмотрению.vimHiCtermFgBg
, Чтобы использовать@vimHiCtermColors
вместоvimHiCtermColor
.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