Как настроить ctags, чтобы лучше выбрать файл определения для тега под курсором

1

Вот пример использования файла Python:

Изображение 174551

В верхней части Page импорта из модуля wagtail.core.models, когда я C-] в vim, мне предлагается выбрать один из 13 вариантов.

Мне не нужно это запрашивать, и есть только одна страница, соответствующая строке импорта: третий тег (...site-packages/wagtail/core/models.py)

Странно, почему ctags по умолчанию не обрабатывает это правильно, но так и будет. Я хотел бы исправить конфигурацию, но потратив на это два дня, я немного растерялся. Любая помощь приветствуется.

$ uname -a
Linux xps9360 5.0.7-arch1-1-ARCH #1 SMP PREEMPT Mon Apr 8 10:37:08 UTC 2019 x86_64 GNU/Linux
$ pacman -Qs ctags
local/universal-ctags-git 0.r6117.c45511a3-1
    Multilanguage reimplementation of the Unix ctags utility
$ tree ~/.git_template  # http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html
/home/dori/.git_template
└── hooks
    ├── ctags
    ├── post-checkout
    ├── post-commit
    ├── post-merge
    └── post-rewrite
$ git ctags   

.git/hooks/ctags (из этого блога)

#!/bin/sh
set -e
PATH="/usr/local/bin:$PATH"
dir="'git rev-parse --git-dir'"
trap 'rm -f "$dir/$$.tags"' EXIT
git ls-files | \
    #ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql
    ctags -R --fields=+l --languages=python --python-kinds=-iv -f"$dir/$$.tags" $(python -c "import os, sys; print(' '.join('{}'.format(d) for d in sys.path if os.path.isdir(d)))")                                        

выдержка из ~/.vimrc:

Plug 'tpope/vim-fugitive' 
Plug 'jsfaint/gen_tags.vim'
autocmd User GenTags#CtagsLoaded echo "Ctags are loaded!"
"let g:gen_tags#ctags_opts = '–python-kinds=-i --verbose'
let g:gen_tags#statusline = 1
let g:gen_tags#verbose = 1

В текущем примере я запускаю проект с использованием среды django-base WagTail, с которой я не знаком, и мне необходимо регулярно проверять определения файлов, чтобы лучше понять, что происходит внутри. Хотел бы я иметь приятный опыт, чтобы улучшить свою производительность.

РЕДАКТИРОВАТЬ шаблоны Django:

Кажется, что Ctags не поддерживает шаблоны django. Запуск C-] над расширением возвращает теги мусора. Мой текущий процесс заключается в следующем :CtrlP path/to/wagtaildir/, затем поиск по имени шаблона, из которого расширяется мой файл

Изображение 174551

Это далеко не оптимально. Я хотел бы услышать любые предложения по улучшению этого метода.

Теги:
vim
wagtail
ctags

1 ответ

0

Лично я использую gf (см. :h gf) для навигации по заголовкам и использую ctags для перемещения по коду (см.: fzf.vim + ripgrep для еще большей навигации по коду в vim, включая поиск по нечетким тегам), и предпочитаю, чтобы мои теги игнорировали вещи такие как библиотечные файлы.

Для этого рабочего процесса вам нужно будет настроить свой путь в Vim, но этот процесс довольно прост. Используя ту же технику в блоге, на который вы ссылались, мы получаем следующее дополнение к вашему vimrc:

let &path = &path . "," . system('python3 -c "import os, sys;
        \ sys.stdout.write(\"/**,\".join(\"{}\".format(d)
        \ for d in sys.path if os.path.isdir(d)) + \"/**\")"')

который динамически устанавливает ваш путь для включения ваших библиотек Python. Мы используем sys.stdout.write для предотвращения новой строки, экранирования всех кавычек внутри строки python и превращаем его из соединения с пробелом в соединение с запятыми, где каждый элемент содержит /**, что означает, что вы хочу рассмотреть поиск во всех его подкаталогах.

Кроме того, мы включаем путь по умолчанию, который также позволяет вам использовать gf для навигации по заголовкам C, текущему каталогу и файлам относительно текущего каталога (см. :h file-searching и :h path).

Тем не менее, вы заметите, что вы не можете перемещаться вверх с этой настройкой. То есть, если вы находитесь в root/src/foo.py и из foo.py вас есть ссылка на root/test/bar.py, вам не нужно переходить на bar.py потому что его нельзя найти в дорожка.

Я лично использую консервативный подход для борьбы с этим путем расширения (см. :h expand) моего текущего каталога. Например, мы можем добавить следующее:

let &path = &path. ",". expand('%:p:h:h'). "/**"

который говорит Vim рассмотреть все каталоги, начиная с одного уровня. Вы можете изменить глубину, добавив или удалив :h, и я должен заметить, что если ваша глубина попадает в ваш домашний каталог или дальше, ваши поиски, вероятно, займут много времени, поэтому лучше сохранить его относительно мелким и использовать некоторые из другие методы, упомянутые для навигации по файлам кодовой базы.

Кроме того, этот метод устанавливает путь только один раз, поэтому при изменении каталогов относительная глубина каталогов останется неизменной. Так что заверните это в функцию /autocmd.

Что-то вроде:

function! SetLocalPath() abort
  let &path = ".,/usr/include,,," . system('python3 -c "import os, sys;
        \ sys.stdout.write(\"/**,\".join(\"{}\".format(d)
        \ for d in sys.path if os.path.isdir(d)) + \"/**\")"')
        \ . "," . expand('%:p:h:h') . "/**"
endfunction

augroup SetPath
  autocmd!
  autocmd VimEnter,WinEnter,BufWinEnter * call SetLocalPath()
augroup END

Поскольку функция вызывается каждый раз, когда мы входим в окно и т.д., Мы не должны использовать конкатенацию путей. В результате путь по умолчанию включен в этот последний пример. Если вы работаете на других языках, вы можете просто добавить их, используя те же методы, что и выше, с конкатенацией строк Vimscript.

Это, вероятно, все еще не совсем то, что вы ищете, так как теперь вы выполняете прыжок в файл, а не в метод/класс. Но выше вы упомянули, что было только одно местоположение, и это должно помочь решить эту проблему. Как только вы окажетесь в правильном месте, вы можете использовать теги, чтобы перейти к методу/классу, который вы ищете. И если вы используете что-то вроде vim-gutentags для автоматической генерации ctags, это сделает жизнь еще проще (просто добавьте tags в ваш глобальный gitignore).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню