LINUX.ORG.RU

В конфигах ничего конкретно для c/c++ нет, использую плагины snipMate (сниппеты немного переделал под себя) и c.vim.

HerrWeigel ★★★★
()

Пишу на С++, C и perl в vim. Интересного в конфигах ничего нет:

syntax on
set cindent
set tabstop=4 shiftwidth=4
set equalprg=astyle

Ещё ctags использую.

DELIRIUM ☆☆☆☆☆
()

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

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

Для C++ хорошо clang_complete

Да.

и vim-protodef.

К сожалению с автором так и не решили мою проблему. Хотя плагин по описанию и скринкастам мне нравится.

Для чего угодно хорошо spacehi

Что это? Ваши юзкейсы, если не сложно.

и snipmate.

Отличная штука. А возможность кастомизации позволяет сделать ее еще лучше.

andreyu ★★★★★
()
Ответ на: комментарий от backbone

Не назвали tagbar ещё.

Тут много, что не назвали. Поскольку на ЛОРе об этом и без того много написано.
А tagbar, да, хорош, но необязателен.

Еще тут забыли про nerdtree и nerdcommenter. А так же про ctrlp - вот это вещь отличная. Ну и мануал по vim тоже рулит - и без плагинов vim умеет многое.

andreyu ★★★★★
()
Ответ на: комментарий от DELIRIUM

У нас в проекте табы, а не пробелы. set expandtab я делаю для своего фриланс-проекта.

Благо, что vim умеет работать и так, и так. И даже больше ;)

andreyu ★★★★★
()

Мой каталог ~/.vim.

Из плагинов:

  • ifdef.vim - подсветка активных/неактивных условных блоков (сложные условия не поддерживаются)
  • errormarker - помечает ошибки/предупреждения компиляции используя signs
  • protodef - уже рекомендовали, для автоматической генерации заглушек в cpp-файлах по файлу заголовка
  • clang_complete - тоже упоминался, для умного автодополнения
  • commentary - KISS плагин для комментирования/разкомментирования кода
  • fswitch - переключение между cpp и hpp файлами
  • inccomplete - моя поделка для дополнения #include директив

Если поискать, то в репозитории ещё есть (многое в куче в vimrc):

  • частичная поддержка синтаксиса C++11 собранная по кускам из нескольких источников
  • abbreviations «#d», «#i», «#p»
  • сочетания для grep'ания слов по всем файлам C и C++ в текущей директории и ниже (может подняться на уровни выше до каталога с именем src)
  • сочетание <leader>v для выделения куска выражения в отдельную переменную (взято из одного из Vim-tips)
  • автоматическая перегенерация файлов тэгов, для этого есть специальные плагины, но меня и так полностью устраивает
  • настройки приоритетов файловых расширений для плагина fswitch
  • несколько ultisnips снипетов для C/C++/C++11
  • <leader>r... сочетания для переименования (не интеллектуального)
  • поиск TODO и FIXME
  • в bundle/srctemplate есть возможно интересные псевдо-шаблоны для C и C++ позволяющие автоматизировать вставку header'а и footer'а, и копирование инклюдов при создании новых файлов заголовков и исходников
  • функция для подсчёта количества строк в функции (зависит от расположения фигурных скобок)

Документировано там далеко не всё, да и довольно плохо организовано, но если порыться, то думаю, можно что-то интересное для себя найти.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

ifdef.vim - подсветка активных/неактивных условных блоков (сложные условия не поддерживаются)

Судя по описанию, вложенные блоки поддерживаются - «Handles nesting of #ifdefs (and #if) as well», но «but does not handle #if defined()», а я привык писать #if defined().

errormarker - помечает ошибки/предупреждения компиляции используя signs

О, за это спасибо. Удобная штука.

commentary - KISS плагин для комментирования/разкомментирования кода

Чем он лучше nerdcommenter?

fswitch - переключение между cpp и hpp файлами

Пробовал его только ради protodef. Но, поскольку, последний у меня не работает, откатился на a.vim

inccomplete - моя поделка для дополнения #include директив

Класс! Сча запробую ее.

abbreviations «#d», «#i», «#p»

Есть же snipmate.

сочетания для grep'ания слов по всем файлам C и C++ в текущей директории и ниже (может подняться на уровни выше до каталога с именем src)

Я сделал так:

map <F4> :execute «noa vim /» . expand(«<cword>») . «/gj **/*.h **/*.c*» <Bar> cw<CR>
Раньше грепал только по файлам, у которых расширение текущего файла.

автоматическая перегенерация файлов тэгов, для этого есть специальные плагины, но меня и так полностью устраивает

С автоматикой у меня не срослось. Делаю это по хоткею, когда есть необходимость:

map <C-F12> <Esc>:!ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Судя по описанию, вложенные блоки поддерживаются - «Handles nesting of #ifdefs (and #if) as well», но «but does not handle #if defined()», а я привык писать #if defined().

Да, я имел в виду, что defined или сравнения меньше, больше не будут работать. С автором плагина обсуждали, решили, что если это и можно сделать, то только с большим трудом.

commentary - KISS плагин для комментирования/разкомментирования кода

Чем он лучше nerdcommenter?

В commentary только одна команда и та настраиваемая. Всё что может - либо раскомментировать либо закомментировать блок (т.е. toggling). Но этого достаточно. И сама команда принимает text-object или motion, так что если использовать мэпинг «gc», то будут работать gci{, gj, g3j и т.д. Т.е. это плагин Tim Pope в его же стиле, с очень хорошой интеграцией со встроенными возможностями Vim.

Есть же snipmate.

Использую ultisnips, к snipmate у меня какие-то претензии были, но я их уже забыл ). Да и для таких простых вещей, где нету ни одного placeholder, использование сниппетов мне кажется излишним.

С автоматикой у меня не срослось. Делаю это по хоткею, когда есть необходимость:

У меня тоже были по началу проблемы с автообновлением, потом как-то разрешилось и я уже очень давно не вспоминаю о tags файлах. Просто создаю пустой tags файл в корне проекта и всё, дальше при каждом сохранении он автоматом обновляется в фоне. Удобно, и считаю время потраченное на тот десяток другой строк кода на VimL окупилось сполна.

xaizek ★★★★★
()
Ответ на: комментарий от drBatty

тормозит.

С какими настройками? Надо учитывать, что через libclang работает значительно быстрее чем если использовать исполняемый файл clang. Хотя на чём-то вроде boost или Qt libclang тоже будет тормозить.

xaizek ★★★★★
()
" Add highlighting for function definition in C++
function! EnhanceCppSyntax()
  syn match    cCustomParen    "(" contains=cParen contains=cCppParen
  syn match    cCustomFunc     "\w\+\s*(" contains=cCustomParen
  syn match    cppCustomScope    "::"
  syn match    cppCustomClass    "\w\+\s*::" contains=cCustomScope
  hi def link cCustomFunc  Function
endfunction

autocmd Syntax cpp call EnhanceCppSyntax()

Расширение подсветки на функции. Еще использую GNU Global для индексации - работает довольно хорошо и шустро, единственно плагин к vim глючит.

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

anonymous
()
Ответ на: комментарий от xaizek

С какими настройками?

с дефолтными.

Хотя на чём-то вроде boost

там пример есть (./example), вот он на boost и он тормозит.

drBatty ★★
()
Ответ на: комментарий от drBatty

с дефолтными.

Стоит добавить эту строку в .vimrc:

let g:clang_use_library = 1
И если libclang лежит в нестандартном месте то и что-то вроде этой:
let g:clang_library_path = $HOME.'/bin/'

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

У меня clang_complete так и не получилось поставить.

Скачал .vim-файл, положил его в заранее созданную директорию ./vim/plugin/, запустил .vim - pattern not found.

Если попробовать использовать

let g:clang_complete_copen = 1

то clang_complete говорит, что даже стандартных заголовочных файлов не видит.

Что можно покрутить? Куда смотреть?

em1LL
() автор топика
Ответ на: комментарий от em1LL

Скачал .vim-файл

Т.е. только один этот файл был скачан? Так будет работать только без использования libclang, без сниппетов и без автоматического поиска системных заголовочных файлов.

Лучше клонировать master с GitHub, на vim.org сильно устаревшая версия. Может понадобится установить:

let g:clang_auto_user_options = 'path, .clang_complete, clang'

Если всё же хочется оставить как есть, можно создать файл .clang_complete рядом с исходниками, в котором прописать аргументы для компилятора (по одному на строчке), -I/usr/include и подобное. В документации есть пример. Список системных инклюдов для плюсов можно посмотреть например так:

echo -n | g++ -v -E -x c++ -

xaizek ★★★★★
()
Ответ на: комментарий от andreyu

spacehi нужен для того чтобы подсвечивать tab'ы и концевые пробелы в коде с целью их дальнейшего истребления.

KblCb ★★★★★
()
Ответ на: комментарий от xaizek

Ой не факт. Ни с boost, ни с Qt проблем особо нет. Проблемы могут быть при написании шаблонных функций и использовании STL из c++11.

KblCb ★★★★★
()
Ответ на: комментарий от xaizek

В commentary только одна команда и та настраиваемая. Всё что может - либо раскомментировать либо закомментировать блок (т.е. toggling).

Ну вообще да, в 99% случаев только этим функционалом я пользуюсь в nerdcommenter.
А вложенные и многосторочные комментарии он умеет?
Умеет ли он комментировать что-либо кроме c/c++?

Просто создаю пустой tags файл в корне проекта и всё, дальше при каждом сохранении он автоматом обновляется в фоне.

А, то бишь хук на запись. В данном случае это практически тот же хоткей :)

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

Расширение подсветки на функции.

Я использовал вот такой вариант:

function! EnhanceCppSyntax()
    syn match cppFuncDef "::\~\?\zs\h\w*\ze([^)]*\()\s*\(const\)\?\)\?$"
    hi def link cppFuncDef Special
endfunction
но ваш, похоже, работает лучше.

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

Чем a.vim не устроил?

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

А что за проблема с vim-protodef'ом?

Тупо не работает. Создает cpp-файл, но пустой. Как я не пытался его настроить, ничего не вышло. Пробовали с автором решить проблему, но так и не удалось.
Да я уже привык делать все, что мне нужно быстро и без protodef.

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

spacehi нужен для того чтобы подсвечивать tab'ы и концевые пробелы в коде

Для этого у меня сделано так:

set list
set listchars=tab:→\ ,trail:·,extends:»,nbsp:·

с целью их дальнейшего истребления.

Это у меня делается по записи файла на диск:

nmap <silent> <leader>W :%s/\s\+$//<CR>:let @/="<CR>

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Ну вообще да, в 99% случаев только этим функционалом я пользуюсь в nerdcommenter.
А вложенные и многосторочные комментарии он умеет?
Умеет ли он комментировать что-либо кроме c/c++?

Да на оба вопроса. Причем всегда используются многострочные комментарии, если язык их поддерживает (вроде можно как-то изменить). Он в каждую строку добавляет в начале и в конце символы комментария (т.е. /* и */ для C/C++). Способ комментирования он узнает из опций 'comments' и 'commentsstring', так что если они устанавливаются в файле синтаксиса, то commentary будет работать с этим типом файлов.

А, то бишь хук на запись. В данном случае это практически тот же хоткей :)

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

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

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

Черт, у меня так же. Жму :w<cr> на автомате :)

andreyu ★★★★★
()
Ответ на: комментарий от Pavval

В текстовых редакторах что - кто-то пишет код?

К счастью, такие люди еще есть, не все рисуют формочки.

annulen ★★★★★
()
Ответ на: комментарий от andreyu

Хм… Я пользуюсь protodef'ом так: захожу в файл реализации, нажимаю <leader>PP и получаю болванку для реализации. Так он работает. Нужен он исключительно для того чтобы не писать самому конструкторы и виртуальные деструкторы, которые ничего не делают, а также не терять у методов const-квалификатор. А как же он у тебя не работает? Я его немножко правлю под C++11, могу и твою проблему глянуть.

KblCb ★★★★★
()
Ответ на: комментарий от andreyu

Так я тоже могу. У меня используется listchars если spacehi не найден. Но подсветка плохих space'ов бросается в глаза сильнее чем замена их на спецсимволы.

А вот автоматическое их истребление — плохая идея. Не секрет, что во многих проектах с такими вещами бардак, но выяснение отношений с автором проекта на эту тему не самый разумный способ добиться принятия твоего патча.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Так я тоже могу. У меня используется listchars если spacehi не найден. Но подсветка плохих space'ов бросается в глаза сильнее чем замена их на спецсимволы.

Ну хз, нужно будет попробовать.

А вот автоматическое их истребление — плохая идея. Не секрет, что во многих проектах с такими вещами бардак, но выяснение отношений с автором проекта на эту тему не самый разумный способ добиться принятия твоего патча.

В моем случае это не проблема, поскольку я сам решаю, какой стиль кода должен использоваться в проекте.

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

Хм… Я пользуюсь protodef'ом так: захожу в файл реализации, нажимаю <leader>PP и получаю болванку для реализации. Так он работает.

Включил fswitch и protodef. Запустил vim с cpp-файлом. Нажал \PP и получил ошибку:

Error detected while processing function protodef#ReturnSkeletonsFromPrototypesForCurrentBuff
er:
line    6:
E484: Can't open file <empty>

Создал .cpp и .h файлы. Нажал \PP - ошибки нет, но и в файлах пусто.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

spacehi нужен для того чтобы подсвечивать tab'ы и концевые пробелы в коде с целью их дальнейшего истребления.

Для этого у меня сделано так: set list ...

let c_space_errors = 1 " Highlight any spaces before tabs, and any whitespace at the end of a line

Это у меня делается по записи файла на диск: nmap ...

autocmd BufWritePre *.c :%s/\s\+$//e
autocmd BufWritePre *.h :%s/\s\+$//e
autocmd BufWritePre *.cpp :%s/\s\+$//e
LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от andreyu

А как он будет работать без не пустого заголовка? Создай заголовок, определи там класс, сохрани заголовок и только тогда...

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

А как он будет работать без не пустого заголовка? Создай заголовок, определи там класс, сохрани заголовок и только тогда...

Так тоже не работает. Сейчас попробовал еще раз, поймал такую ошибку:

/bin/bash: /usr/share/vim/bundle/protodef/pullproto.pl: No such file or directory
{
}

Там файла этого, естественно, нет. Он лежит в ~/.vim/bundle/protodef/pullproto.pl

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от drBatty

тормозит

нужно юзать через clang.so, а не исполняемый clang.

anonymous
()
Ответ на: комментарий от em1LL

Скачал .vim-файл, положил его в заранее созданную директорию ./vim/plugin/, запустил .vim - pattern not found.

ЩИТО? ССЗБ.

anonymous
()
Ответ на: комментарий от KblCb

Ох... Что-то у тебя плохое с настройками vim'а.

Если мне не изменяет память, то я пробовал и с чистым конфигом. Результат был не лучше.

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

Ох... Что-то у тебя плохое с настройками vim'а.

Похоже нашел, в чем проблема:

let g:protodefprotogetter = $VIM.'/bundle/protodef/pullproto.pl'

Вот такая конструкция разбиралась не правильно. Если поправить ее на

let g:protodefprotogetter = $HOME.'/.vim/bundle/protodef/pullproto.pl'

то плагин работает. Хотя работает он странно.

Для некоторых (но не всех) методов, возвращающих void, он добавляет return /* something */; для некоторых методов, возвращающих bool, он не добавляет return вообще.

Если курсор стоит внутри метода, то по хоткею новый метод добавится внутрь метода, где стоит курсор.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.