подсветка имен классов и функций в Vim - PullRequest
68 голосов
/ 10 апреля 2009

Я только недавно настроил свою среду Vim из Textmate, после того, как стал зависимым от его модального ввода.

Однако в Vim подсветка синтаксиса выглядит не очень красиво. Я пишу код на C ++, и поскольку вызов функции и имена классов не могут быть выделены, код труднее читать. Я немного поигрался с цветовой схемой, но не смог найти ни одного поля, соответствующего «имени класса» или «имени функции».

На рисунке ниже обратите внимание на то, что DroughtLayer:: и *.size() не выделены справа в MacVim.

Picture comparison between Textmate(left) and Vim(right)
(источник: ivzhao.com )

Есть идеи, как это решить? Это действительно раздражает меня, так как я очень чувствительный парень.

Ответы [ 10 ]

118 голосов
/ 21 апреля 2009

У меня была такая же проблема, когда я начал использовать vim. Решение простое, вам просто нужно отредактировать файл синтаксиса c, используемый vim, вот как это сделать:

Когда вы начинаете редактировать файл C или C ++, vim читает файл синтаксиса c по умолчанию, расположенный в

$VIMRUNTIME/syntax/c.vim

(Где $ VIMRUNTIME - это то место, где вы установили vim. Вы можете узнать его значение по умолчанию, открыв vim и используя команду ": echo $ VIMRUNTIME").

Вы можете просто перезаписать этот файл или создать свой собственный файл синтаксиса C (который будет загружен vim вместо файла по умолчанию) в этом месте:

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)

(Я никогда не использовал Mac, поэтому я не знаю, какой из них будет работать для вас. Вы можете узнать больше в справке vim, ": help vimfiles")

Теперь самое интересное. Скопируйте файл по умолчанию «$ VIMRUNTIME / syntax / c.vim» в каталог vimfiles («$ HOME / .vim / syntax / c.vim» для UNIX) и отредактируйте его, добавив следующие строки:

" Highlight Class and Function names
syn match    cCustomParen    "(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope

hi def link cCustomFunc  Function
hi def link cCustomClass Function

Вот и все! Теперь имена функций и классов будут выделены цветом, определенным в выделении «Function» («: hi Function»). Если вы хотите настроить цвета, вы можете изменить последние две строки выше на что-то вроде этого:

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00

или вы можете оставить файл синтаксиса C в одиночестве и определить цвета в вашем файле vimrc (": help vimrc"):

hi cCustomFunc  gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00

(Обратите внимание на отсутствие ключевого слова def, перейдите к «: help highlight-default» для получения подробной информации). Доступные параметры для команды ": hi" см. В разделе ": help: highlight".

Вы можете найти полный файл c.vim для Vim 7.2 по этой ссылке (Примечание: используйте его, только если у вас есть немодифицированный Vim версии 7.2):

http://pastebin.com/f33aeab77

И обязательный скриншот:

enter image description here

33 голосов
/ 13 апреля 2012

это мой первый пост здесь, и я не знал, как сделать замечание, ответ Эдуардо заставляет "(" и "{" выглядеть непревзойденным, и синтаксис ошибок сворачивается, я немного изменил его, чтобы это исправить.

syn match    cCustomParen    "?=(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(\@=" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope
hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def link cCustomClass Function
17 голосов
/ 15 апреля 2009

Интересно, что подсветки синтаксиса в VIM не поддерживают применение синтаксиса к идентификаторам или именам функций - по крайней мере, подсветки синтаксиса для C и C ++. Итак, даже если вы делаете:

:hi Function guifg=red

или

:hi Identifier guifg=red

это не дает цвета. Я просто, кажется, не намного больше, чем ключевые слова и константы для этих языков.

Здесь кто-то начал расширять файл синтаксиса cpp для поддержки имен методов. Думаю, это начало. http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

10 голосов
/ 16 апреля 2009

Единственное решение - использовать встроенную базу данных ctags. Поэтому создайте его с помощью утилиты ctags . Затем установите переменную 'tags' и поместите следующее в

~/.vim/after/syntax/c.vim

function! s:highlight()
    let list = taglist('.*')

    for item in list
        let kind = item.kind

        if kind == 'f' || kind == 'c'
            let name = item.name
            exec 'syntax keyword Identifier '.name
        endif
    endfor
endfunction

call s:highlight()

Я должен предупредить вас, что это может работать очень медленно в очень большой базе данных ctags.

Также на vim.org есть одно решение , но я не пробовал это. Дайте мне знать, если это работает для вас.

6 голосов
/ 03 апреля 2015

РЕДАКТИРОВАТЬ: color_coded может быть слишком тяжелым для вас. попробуйте octol / vim-cpp-extended-highlight . Он поддерживает C ++ 11/14 и интегрирует то, что отвечает @Eduardo.

Семантический маркер на основе:
Я бы порекомендовал jeaye / color_coded , Плагин vim для подсветки на основе libclang
Извините, что я новичок в stackoverflow, что означает, что у меня недостаточно репутации для публикации изображений. Пойди посмотри на его эффекты, если хочешь попробовать. :)

Плюсы:

  • Простота установки
  • Семантическая подсветка
  • Clighter, упомянутый выше, нужен vim, скомпилированный с python2.7. Однако color_coded написан на C ++ и обеспечивает привязку lua -> C ++.

Минусы:

  • Он задерживается, если вы не совершите несколько vim-событий для его активации.
  • Настройка немного сложнее; вам нужно отредактировать синтаксис / color_coded.vim сам. Но настройка была помещена в его дорожную карту.

Хотя он все еще находится в стадии разработки, он все больше привлекает внимание.

before after

3 голосов
/ 22 сентября 2009

Сергей, изменив первую строку с

syn match    cCustomParen    "(" contains=cParen,cCppParen

до

syn match    cCustomParen    "(" contains=cParen contains=cCppParen

, кажется, исправил это для меня.

2 голосов
/ 30 апреля 2010

Попробуйте использовать этот плагин http://www.vim.org/scripts/script.php?script_id=2646 Это делает все выделения ctags очень эффективно для вас

2 голосов
/ 10 апреля 2009

Используйте плагин для vim, например Taglist или настройте ctags или cscope интеграцию с vim ( здесь учебник для vim / cscope.)

1 голос
/ 13 августа 2014

Также можно рассмотреть плагин Clighter, который является

plugin for c-family semantic source code highlighting, based on Clang

Однако, требуются довольно свежие версии и программное обеспечение: vim 7.4.330 +python2 и libclang.

1 голос
/ 06 июля 2014

Я действительно рекомендую вам плагин taghighlight, нажмите здесь для его веб-сайта.

...