Галочка, ты щас умрёшь! После нескольких лет использования YCM
он меня окончательно достал, своей жирнотой, тупаками и прочими отвалами с питонами. Да оно работает, но. Короче вернулся на ctags
на самом деле я даже уже опопсел и забыл как его с вимом дружить, пришлось уточнять у гугла забытое.
Первую недельку я жил так
function UpdateTags()
"""""""""""""""""""""""""""""
let projects = ["~/egnaroc/"] "сократил список до 1
"""""""""""""""""""""""""""""
for proj in projects
exec('!cd ' . proj . ' && ctags -R include') " сократил вариации нахождения заголовков до 1
tags+=proj . 'tags'
endfor
endfunction
map <F12> :call UpdateTags() <CR>
Ну и как диды :tag tagname
ctrl+]
ctrl+t
ctrl+x ctrl+o
ctrl+p
ctrl+n
для подсказок прототипов, функций,структур, автодополнения и навигации по коду и файлам. (только gd) почему то не работает go declaration
gf
go file
работает, но это надо с патчами ещё вспоминать ну да ладно.
Ну, чво, жопа то я ленивая надоело F12
нажимать и уже полез смотреть на плагины автоматизации ctags
Сначала накатил через Vundle
"Plugin 'xolox/vim-easytags'
"Plugin 'xolox/vim-misc' "зависимость для easytags
Всё вроде хорошо, только вот есть нюанс, оно строит теги по FileType
открыл файл *.c
оно нагенерировало для него теги и закинуло в общий файл тегов или в файл проекта или/и для всего что в текущем каталоге где редактируемый файл. Удобно? Ну относительно, так как дабы поучить символы из заголовка где то в дебрях директорий надо до него ручками дойти открыть, потом вернутся и уже использовать там где был ранее нужные символы, да после десятка таких итераций весь проект будет проиндексирован, но блин надо изначально делать ctags -R ./
ибо смысл то что я могу прыгнуть из любого места кода проекта в любое по тегу. Короче морока, мало чем отличается от иногда нажать F12 и обновить все теги из всех заголовочных файлов проекта (и его зависимостей)
Ну единственное что удобно это оно именно что обновляет теги у редактируемого файла и это как бы дешевле чем всё обновлять, ноооо. Ладна потом ещё тройку попробовал (даже названия не помню) всё фигня и проще и удобнее руками теги создать 1 раз и обновлять иногда это.
Но я же ленивый поэтому ещё попробовал гутентагс, натюрлих и почти зер гуд квадратиш практиш
Plugin 'ludovicchabant/vim-gutentags'
Это уже поинтереснее, можно указать так
let g:gutentags_project_root = ['~/egnaroc/','Makefile','.git']
И оно автоматически будет строить рекурсивно теги по этим «маркерам» оттуда где они есть,
само автоматически инкрементально обновляя теги удаляя несуществующие, добавляя новые появившиеся. Ну тоесть если есть проект допустим используется git
то просто найдя '.git'
оно построит теги не по тому что есть в каталогах, а по тому что контролирует система версий (ну я так понял читая по диагонали). Короче работает, по триггерам определяет что каталог содержит проект и начинает само индексировать. Но вот тоже есть нюанс индексирует оно всё поэтому благо есть фильтр
let g:gutentags_ctags_exclude = [
\ '.git',
\ 'build',
\ 'depends',
\ 'docs',
\ '.md',
\ '.cache',
\ 'tags',
\ '.css',
\ '.vim',
\]
Но лучше бы было типа gutentags_ctags_inclue
ещё дабы явно задать некие правила что индексировать конкретно. И вот тут важное, оно то что я хочу автоматом индексирует проект, клёва, только вот беда, проект проектом, а есть ещё у нас всех /usr/include
или ~/dev/depend1
~/dev/depend2
из которых для проекта нужны заголовки (порой и не только), и как это разрешить в плагине? Н и к а к :( Иди ручками для внешних заголовочных файлов нагенерируй теги и отдельно подключай set tags+=~/теги_внешних_заголовков
.
Ну ещё до кучи supertab
накатил. let g:SuperTabDefaultCompletionType = '<C-X><C-O>'
Вроде всё хорошо, но получается полумера какай то, как часто вы пишете код который ну полностью в себе и не нуждается во внешних файлах? Вот я про это вот и вот. По сути если чуть согнуть извилину то можно подумать что у нас в конкретном файле подключены заголовки и теги нужны только и только те которые соответствуют подключённым файлам заголовочным и вот к этим вот целям гутенгагса из ридми
Никакой другой зависимости, кроме запуска Vim: никакого Python, Ruby или чего-то еще.
Кроссплатформенность: должна работать, по крайней мере, на Ubuntu, Mac и Windows.
Инкрементная генерация тегов: не создавайте заново весь проект постоянно. Это может быть хорошо для небольших проектов, но это не масштабируется.
Управление внешним процессом: если процесс ctags занимает много времени, не запускайте другой, потому что я снова сохранил файл.
Поддерживайте согласованность файла тегов: не добавляйте просто теги текущего файла в файл тегов, иначе вы все равно будете "видеть" теги для удаленных или переименованных классов и функций.
Автоматически создайте файл тегов: вы открываете что-то из недавно разветвленного проекта, он должен начать индексировать это автоматически, точно так же, как в Sublime Text
Хочется ещё трассировку построения тегов по заголовочным файлам вглубъ, дабы не весь /usr/include
сканировать (у меня тегов на 300 мегабайт выходит если всё сразу), а по зависимостям прыгать.
Ну пока вот как то так, а как вы поживаете с Vim
и ctags
кто чего использует, как, зачем и почему, какие проблемы. Вот хотелось бы со стороны тоже почитать, может чего подглядеть, может чего полезного узнаю :) Расскажите ::)