C/CPP syntax in vim (C syntax extension for vim)

и другие vi-подобные редакторы

Модератор: /dev/random

Ответить

Синтаксис языка C в vim.
Какие элементы языка C вы бы хотели видеть подсвеченными в vim?

Операторы: -+/*%=!~^&|.><~?:
7
12%
Разделители: ()[]{},;
9
16%
Имена структур (как стандартные типы)
8
14%
Имена функций
13
22%
Имена макросов
9
16%
Перечисления - enum's (как константы)
11
19%
Ничто из перечисленного отдельно подсвечивать не нужно
1
2%
 
Всего голосов: 58

Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

C/CPP syntax in vim

Сообщение Luinnar »

На мой взгляд в стандартном синтаксисе языка C в vim кое-чего не хватает.

Первое, что я добавил, была подсветка операторов и разделителей.
Затем добавил подсветку структур и классов, но это уже специфично для проекта.
После добавил подсветку макросов, но не при их определении, а при использовании.
Потом перечисления (enum) подсветил как константы.
И наконец, недавно узнал как отдельно подсветить имена функций.

Всё это, на мой взгляд, облегчает чтение исходников. А как вы считаете?

Вот пример того, где почти всё это есть (кроме макросов) в сравнении со стандартной подсветкой. Использовал две цветовые схемы, чтобы сами цвета меньше влияли на результат.
Вложения
vim_c_syntax_extensions_oceandeep.png
vim_c_oceandeep.png
vim_c_syntax_extensions.png
vim_c.png
Спасибо сказали:
Skip
Сообщения: 30
ОС: Debian
Контактная информация:

Re: C/CPP syntax in vim

Сообщение Skip »

На мой взгляд стандартная подсветка синтаксиса С/C++ в vim скромна по возможностям. Ниже приведен результат моих и собранных мной доработок - консольный и gvim варианты. Однако здесь реализовано не всё желаемое. Слабое знание регулярных выражений не позволяет пока что написать конструкцию безошибочного определения тернарного оператора ?: Если кто поможет - буду рад протестировать :)
Вложения
vim_console.png
gvim.png
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: C/CPP syntax in vim

Сообщение sash-kan »

Skip писал(а):
01.05.2010 21:43
Слабое знание регулярных выражений не позволяет пока что написать конструкцию безошибочного определения тернарного оператора ?: Если кто поможет - буду рад протестировать
а что у вас есть на данный момент и в каких случаях не отыскивается?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Skip
Сообщения: 30
ОС: Debian
Контактная информация:

Re: C/CPP syntax in vim

Сообщение Skip »

Например, строка из моего файла синтаксиса (after/syntax/c.vim):

Код: Выделить всё

syn match cOperator    "[?:]"

Снимок экрана в результатом приведен ниже. В строке 8 нашли то, что искали - подсвечено белым. В строке 11 проблема - нашли метку, хотя на самом деле её там нет. Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал. Это, наверно, один из самых простых и "удачных" примеров.
Вложения
problem.png
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: C/CPP syntax in vim

Сообщение sash-kan »

Skip писал(а):
01.05.2010 23:25
Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал.
вот якобы найденной меткой оно и перебивается.
посмотрел :h usr_44.txt, посмотрел содержимое c.vim, вижу, что просто надо кропотливо разобрать существующие правила определения меток и подправить. увы, у меня времени на разбор нет.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: C/CPP syntax in vim

Сообщение Luinnar »

Skip писал(а):
01.05.2010 23:25
Например, строка из моего файла синтаксиса (after/syntax/c.vim):

Код: Выделить всё

syn match cOperator    "[?:]"

Снимок экрана в результатом приведен ниже. В строке 8 нашли то, что искали - подсвечено белым. В строке 11 проблема - нашли метку, хотя на самом деле её там нет. Разбор меток осуществляется стандартным syntax/c.vim от Bram'а, не модифицировал. Это, наверно, один из самых простых и "удачных" примеров.

Ага, я тоже хотел это побороть, модифицируя стандартный c.vim, но пока не удалось.
Однако, ложная подсветка меток не мешает вам подсвечивать символы ? и :
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: C/CPP syntax in vim

Сообщение kamre »

Luinnar писал(а):
23.04.2010 20:24
Какие элементы языка C вы бы хотели видеть подсвеченными в vim?

А подсветку по всему файлу текущего символа под курсором можно сделать? Желательно с возможностью пройтись по всем вхождениям этого символа.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

Re: C/CPP syntax in vim

Сообщение /dev/random »

kamre писал(а):
07.05.2010 12:37
А подсветку по всему файлу текущего символа под курсором можно сделать? Желательно с возможностью пройтись по всем вхождениям этого символа.

А чем поиск не устроил?
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: C/CPP syntax in vim

Сообщение Luinnar »

kamre писал(а):
07.05.2010 12:37
Luinnar писал(а):
23.04.2010 20:24
Какие элементы языка C вы бы хотели видеть подсвеченными в vim?

А подсветку по всему файлу текущего символа под курсором можно сделать? Желательно с возможностью пройтись по всем вхождениям этого символа.

Если вы под символом имеете в виду слово, то достаточно нажать звездочку (*) чтобы найти все использования этого слова в файле. Подсветка включается/выключается с помощью :set hls!

Если же вам нужен только один символ, то обычным поиском, например, так: /a
Ну и опять же подсветка :set hls!
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: C/CPP syntax in vim

Сообщение kamre »

/dev/random писал(а):
07.05.2010 12:41
А чем поиск не устроил?

Имеется ввиду символ как конструкция языка. Например, локальная переменная. Простой текстовый поиск во всем файле будет давать много ложных результатов из других функций, где ссылаются на другие символы с тем же именем.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: C/CPP syntax in vim

Сообщение drBatty »

kamre писал(а):
07.05.2010 12:37
А подсветку по всему файлу текущего символа под курсором можно сделать? Желательно с возможностью пройтись по всем вхождениям этого символа.

ctags

kamre писал(а):
07.05.2010 15:35
Простой текстовый поиск во всем файле будет давать много ложных результатов из других функций, где ссылаются на другие символы с тем же именем.

дык не надо делать переменные вроде x, y, z, а надо x_coordinate, count_from_hall и т.д. :)
(в vim есть автодополнение)
и ещё: можно использовать метасимволы \b, \<, и \> для задания границы слов.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: C/CPP syntax in vim

Сообщение Luinnar »

Меня тут попросили выложить получившийся ~/.vim/after/syntax/c.vim, вот и он:

Код: Выделить всё

" 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"
Спасибо сказали:
Ответить