LINUX.ORG.RU

Vim8/9 + ctags, как поживаете?

 , , , ,


1

3

Галочка, ты щас умрёшь! После нескольких лет использования 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 кто чего использует, как, зачем и почему, какие проблемы. Вот хотелось бы со стороны тоже почитать, может чего подглядеть, может чего полезного узнаю :) Расскажите ::)

YCM он меня окончательно достал

если он синхронный то чему удивляться.

ну и они все на пестонах/жабаскриптах(спасибо LSP мелкософт тля)

mrjaggers
()

Что в emacs, что в VSCode использую clangd и в Vim его тоже можно подключить. Работает само только для проектов не на CMake надо использовать bear, для генерации compile_comands.json. Минусы в том, что пока не соберешь проект, без сгенерированного compile_comands, clangd будет тупить.

snake266 ★★
()

:AsyncRun ctags -R <dir> - как-то так. Можно придумать как это автоматизировать через автокоманды, но мне и так норм. Плагины как gutentags по-моему слишком жирны для такой задачи, да и настраивать их запаришься. Ещё я не люблю, когда в фоне кто-то копошится без моего ведома. Для такого есть выжалстудия и подобные ублюдки.

Хочется ещё трассировку построения тегов по заголовочным файлам вглубъ, дабы не весь /usr/include сканировать

Так скрипт напишите, задача не тянет на рокет сайнс. Странно, что весь такой навороченный gutentags этого не умеет. Ещё один аргумент против жира.

bread
()
Ответ на: комментарий от snake266

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

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от andreyu

coc

Йоо**** воробушки оно там на nodejs, внутри проекта блобы скомпилированные в wasm. Не, дело конечно хозяйское я конкретно тут не сужу, но я про ctags =) Кок слишком молодёжный, от ридми запахло смузи :D

Но спасибо, интересно, первый раз вижу для вима подобное на nodejs

P.S. Там ещё на тайпскрипте, во жесть. Но интересно.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Neuromagus

Для меня просто как пушка по воробьям. У меня lua и C и считай всё. С ctags по коду прыгает, дополняет, аргументы и элементы структур показывает, а большего мне и не надо =) Вот писал бы я на плюсах или типа того вот тогда дааа. Так как у меня запросы небольшие я и на обычные теги решил перейти с ними проблем нет, они дают всё и даже больше. Единственный минус это поддержание их в акутальном состоянии не руками, о том и тема.

Может надоест и опять ехать, а не шашечки, но пока хочется ctags =)

LINUX-ORG-RU ★★★★★
() автор топика