C/CPP syntax in vim (C syntax extension for vim)
Модератор: /dev/random
C/CPP syntax in vim
На мой взгляд в стандартном синтаксисе языка C в vim кое-чего не хватает.
Первое, что я добавил, была подсветка операторов и разделителей.
Затем добавил подсветку структур и классов, но это уже специфично для проекта.
После добавил подсветку макросов, но не при их определении, а при использовании.
Потом перечисления (enum) подсветил как константы.
И наконец, недавно узнал как отдельно подсветить имена функций.
Всё это, на мой взгляд, облегчает чтение исходников. А как вы считаете?
Вот пример того, где почти всё это есть (кроме макросов) в сравнении со стандартной подсветкой. Использовал две цветовые схемы, чтобы сами цвета меньше влияли на результат.
Первое, что я добавил, была подсветка операторов и разделителей.
Затем добавил подсветку структур и классов, но это уже специфично для проекта.
После добавил подсветку макросов, но не при их определении, а при использовании.
Потом перечисления (enum) подсветил как константы.
И наконец, недавно узнал как отдельно подсветить имена функций.
Всё это, на мой взгляд, облегчает чтение исходников. А как вы считаете?
Вот пример того, где почти всё это есть (кроме макросов) в сравнении со стандартной подсветкой. Использовал две цветовые схемы, чтобы сами цвета меньше влияли на результат.
Re: C/CPP syntax in vim
На мой взгляд стандартная подсветка синтаксиса С/C++ в vim скромна по возможностям. Ниже приведен результат моих и собранных мной доработок - консольный и gvim варианты. Однако здесь реализовано не всё желаемое. Слабое знание регулярных выражений не позволяет пока что написать конструкцию безошибочного определения тернарного оператора ?: Если кто поможет - буду рад протестировать
Re: C/CPP syntax in vim
а что у вас есть на данный момент и в каких случаях не отыскивается?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: C/CPP syntax in vim
Например, строка из моего файла синтаксиса (after/syntax/c.vim):
Снимок экрана в результатом приведен ниже. В строке 8 нашли то, что искали - подсвечено белым. В строке 11 проблема - нашли метку, хотя на самом деле её там нет. Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал. Это, наверно, один из самых простых и "удачных" примеров.
Код: Выделить всё
syn match cOperator "[?:]"
Снимок экрана в результатом приведен ниже. В строке 8 нашли то, что искали - подсвечено белым. В строке 11 проблема - нашли метку, хотя на самом деле её там нет. Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал. Это, наверно, один из самых простых и "удачных" примеров.
Re: C/CPP syntax in vim
вот якобы найденной меткой оно и перебивается.
посмотрел :h usr_44.txt, посмотрел содержимое c.vim, вижу, что просто надо кропотливо разобрать существующие правила определения меток и подправить. увы, у меня времени на разбор нет.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: C/CPP syntax in vim
Skip писал(а): ↑01.05.2010 23:25Например, строка из моего файла синтаксиса (after/syntax/c.vim):
Код: Выделить всё
syn match cOperator "[?:]"
Снимок экрана в результатом приведен ниже. В строке 8 нашли то, что искали - подсвечено белым. В строке 11 проблема - нашли метку, хотя на самом деле её там нет. Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал. Это, наверно, один из самых простых и "удачных" примеров.
Ага, я тоже хотел это побороть, модифицируя стандартный c.vim, но пока не удалось.
Однако, ложная подсветка меток не мешает вам подсвечивать символы ? и :
- /dev/random
- Администратор
- Сообщения: 5289
- ОС: Gentoo
Re: C/CPP syntax in vim
Если вы под символом имеете в виду слово, то достаточно нажать звездочку (*) чтобы найти все использования этого слова в файле. Подсветка включается/выключается с помощью :set hls!
Если же вам нужен только один символ, то обычным поиском, например, так: /a
Ну и опять же подсветка :set hls!
Re: C/CPP syntax in vim
Имеется ввиду символ как конструкция языка. Например, локальная переменная. Простой текстовый поиск во всем файле будет давать много ложных результатов из других функций, где ссылаются на другие символы с тем же именем.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: C/CPP syntax in vim
ctags
дык не надо делать переменные вроде x, y, z, а надо x_coordinate, count_from_hall и т.д. :)
(в vim есть автодополнение)
и ещё: можно использовать метасимволы \b, \<, и \> для задания границы слов.
Re: C/CPP syntax in vim
Меня тут попросили выложить получившийся ~/.vim/after/syntax/c.vim, вот и он:
В данном варианте всё что написано большими буквами подсвечивается как макрос, кому это не нужно, уберите из файла строчку:
syn match myCMacro "\<[A-Z_][A-Z_0-9]*\>"
Плюс для подсветки названий типов и констант, специфичных для проекта, используется файл .syntax.vim из текущего каталога, если он, конечно, существует. Данный файл в моём случае генерится при очередной сборке проекта следующим скриптом mkcsyntax:
Код: Выделить всё
" Vim filetype plugin file
" Language: C file syntax extensions
" Maintainer: Luinnar
" Last Change: 26 April 2010
" Common
syn match Delimiter "[[\](){},;:?]"
syn match Operator "[!&]"
syn match Operator "[*+]"
syn match Operator "[-%]"
syn match Operator "\."
syn match Operator "="
syn match Operator "<"
syn match Operator ">"
syn match Operator "|"
syn match Operator "\^"
syn match Operator "\~"
" Define operator / so that it wouldn't overlap definition of /* // and /=
syn match Operator "/[^*/=]"me=e-1
syn match Operator "/$"
syn keyword Constant TRUE FALSE
" Functions
syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1
syn match cUserFunctionPointer "(\s*\*\s*\h\w*\s*)\(\s\|\n\)*(" contains=Delimiter,Operator
if filereadable( '.syntax.vim' ) | exec 'so .syntax.vim' | endif
syn match myCMacro "\<[A-Z_][A-Z_0-9]*\>"
syn keyword myCMacro NULL
" Links
hi def link myCMacro Macro
hi def link cUserFunction Function
hi def link cUserFunctionPointer Function
В данном варианте всё что написано большими буквами подсвечивается как макрос, кому это не нужно, уберите из файла строчку:
syn match myCMacro "\<[A-Z_][A-Z_0-9]*\>"
Плюс для подсветки названий типов и констант, специфичных для проекта, используется файл .syntax.vim из текущего каталога, если он, конечно, существует. Данный файл в моём случае генерится при очередной сборке проекта следующим скриптом mkcsyntax:
Код: Выделить всё
#!/bin/bash
function tags2syntax()
{
awk 'BEGIN{ printf "syn keyword '$1'" } !/^\!/{printf " %s",$1} END {print ""}'
}
[ $# -gt 0 ] || { echo "Usage: mkcsyntax dirname [filename]"; exit 1; }
dirname="$1"
fname="$2"
[ "$fname" == "" ] && fname=".syntax.vim"
[ -d "$dirname" ] || { echo "Cannot find directory '$dirname'"; exit 3; }
> "$fname" || { echo "Cannot write to '$fname'"; exit 2; }
flist=`find "$dirname" -type f -name "*.[ch]" -o -name "*.cpp"`
ctags --c-kinds=tscg -f - $flist | tags2syntax Type >> "$fname"
ctags --c-kinds=e -f - $flist | tags2syntax Constant >> "$fname"