Ctags: Как разобрать тэг и вид из вывода ctags -R -x

Созданный на 12 мар. 2019  ·  8Комментарии  ·  Источник: universal-ctags/ctags


Имя парсера: любое

Командная строка, которую вы использовали для запуска ctags:

$ ctags --options=NONE -R -x

Содержимое входного файла:

$ git clone https://github.com/liuchengxu/vista.vim
$ cd vista.vim
$ ctags --options=NONE -R -x

Вывод тегов, который вас не устраивает:

Я понятия не имею, как анализировать вывод ctags -R -x . Я хочу отфильтровать тэг и область видимости из вывода ctags -R -x , но не знаю, как это сделать правильно.

Вывод тегов, который вы ожидаете:

Это возможно, если есть специальный формат для ctags -R :

{tagname}<Tab>{tagfile}<Tab>{tagaddress}[;"<Tab>{tagfield}..]

Версия ctags:

$ ctags --version
Universal Ctags 0.0.0(1208e45), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Mar 11 2019, 17:01:27
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-insensitive-filenames, +packcc

Как получить двоичный код ctags:

brew install ctags на macOS

Все 8 Комментарий

Я не понимаю вашего вопроса.

Довольны ли вы выводом ctags -R ? Если да, то почему бы вам не использовать опцию -x ?
Я хотел бы узнать больше об истории использования, чтобы ответить на ваш вопрос.

Я не знаю скрипт vim. Однако при чтении vim.c, синтаксического анализатора тегов vim, он не заполняет поля области видимости. Если вы считаете, что это ошибка, сообщите нам, что синтаксический анализатор vim заполняет поле области видимости для какого типа ввода.

Извините, что не разъяснил.

зачем использовать опцию -x ?

Хотя ctags -R удовлетворит мои потребности, я не хочу генерировать файл тега, поэтому я использую вариант -x .

мой вариант использования.

В настоящее время vista.vim поддерживает отображение тегов только в каком-либо файле, но некоторые пользователи хотели бы отображать все теги в проекте (https://github.com/liuchengxu/vista.vim/issues/14). Я попытался добавить поддержку ctags -R , но не знаю, как правильно извлечь эти выходные данные.

Одним словом, как извлечь vista#util#Trim , function , 18 , autoload/vista/util.vim , vista#util#Trim(str) соответственно?

ctags -R -x :

...
vista#util#Trim  function     18 autoload/vista/util.vim function! vista#util#Trim(str)
vista#util#Truncate function     13 autoload/vista/util.vim function! vista#util#Truncate(msg) abort
vista#util#Warning function     90 autoload/vista/util.vim function! vista#util#Warning(msg) abort
vista#viewer#Display function     90 autoload/vista/viewer.vim function! vista#viewer#Display(data) abort
vista#viewer#Render function     86 autoload/vista/viewer.vim function! vista#viewer#Render(data) abort
vista#viewer#prefixes function     94 autoload/vista/viewer.vim function! vista#viewer#prefixes() abort

С опцией -o - ctags выводит вывод на стандартный вывод, например:

[yamato@slave]/tmp/vista.vim% u-ctags -R -o - | head 
/   ftplugin/vista.vim  /^nnoremap <buffer> <silent> \/    :<c-u>call vista#finder#fzf#Run()<CR>$/;"    m
<CR>    ftplugin/vista.vim  /^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/;"  m
Commands    README.md   /^### Commands$/;"  S
Contributing    README.md   /^## Contributing$/;"   s
Features    README.md   /^## Features$/;"   s
Installation    README.md   /^## Installation$/;"   s
Introduction    README.md   /^## Introduction$/;"   s
License README.md   /^## License$/;"    s
NeoVim  README.md   /^#### NeoVim$/;"   t
Options README.md   /^### Options$/;"   S

Вы можете настроить вывод с опцией --_xformat= :

 u-ctags -R -x --_xformat='TAGNAME:%N @@@ KIND:%K !!! LINE:%n +++ INPUT-FILE:%F === PATTERN:%P' | head
TAGNAME:/ @@@ KIND:map !!! LINE:38 +++ INPUT-FILE:ftplugin/vista.vim === PATTERN:/^nnoremap <buffer> <silent> \/    :<c-u>call vista#finder#fzf#Run()<CR>$/
TAGNAME:<CR> @@@ KIND:map !!! LINE:37 +++ INPUT-FILE:ftplugin/vista.vim === PATTERN:/^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/
TAGNAME:Commands @@@ KIND:subsection !!! LINE:101 +++ INPUT-FILE:README.md === PATTERN:/^### Commands$/
TAGNAME:Contributing @@@ KIND:section !!! LINE:164 +++ INPUT-FILE:README.md === PATTERN:/^## Contributing$/
TAGNAME:Features @@@ KIND:section !!! LINE:37 +++ INPUT-FILE:README.md === PATTERN:/^## Features$/
TAGNAME:Installation @@@ KIND:section !!! LINE:69 +++ INPUT-FILE:README.md === PATTERN:/^## Installation$/
TAGNAME:Introduction @@@ KIND:section !!! LINE:25 +++ INPUT-FILE:README.md === PATTERN:/^## Introduction$/
TAGNAME:License @@@ KIND:section !!! LINE:168 +++ INPUT-FILE:README.md === PATTERN:/^## License$/
TAGNAME:NeoVim @@@ KIND:subsubsection !!! LINE:90 +++ INPUT-FILE:README.md === PATTERN:/^#### NeoVim$/
TAGNAME:Options @@@ KIND:subsection !!! LINE:113 +++ INPUT-FILE:README.md === PATTERN:/^### Options$/

См. http://docs.ctags.io/en/latest/news.html?highlight=--_xformat#customizing -xref-output.

Если вы не хотите писать парсер, --output-format=json может быть выбором:

u-ctags -R --output-format=json | head
{"_type": "tag", "name": "/", "path": "ftplugin/vista.vim", "pattern": "/^nnoremap <buffer> <silent> \\/    :<c-u>call vista#finder#fzf#Run()<CR>$/", "kind": "map"}
{"_type": "tag", "name": "<CR>", "path": "ftplugin/vista.vim", "pattern": "/^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/", "kind": "map"}
{"_type": "tag", "name": "Commands", "path": "README.md", "pattern": "/^### Commands$/", "kind": "subsection"}
{"_type": "tag", "name": "Contributing", "path": "README.md", "pattern": "/^## Contributing$/", "kind": "section"}
{"_type": "tag", "name": "Features", "path": "README.md", "pattern": "/^## Features$/", "kind": "section"}
{"_type": "tag", "name": "Installation", "path": "README.md", "pattern": "/^## Installation$/", "kind": "section"}
{"_type": "tag", "name": "Introduction", "path": "README.md", "pattern": "/^## Introduction$/", "kind": "section"}
{"_type": "tag", "name": "License", "path": "README.md", "pattern": "/^## License$/", "kind": "section"}
{"_type": "tag", "name": "NeoVim", "path": "README.md", "pattern": "/^#### NeoVim$/", "kind": "subsubsection"}
{"_type": "tag", "name": "Options", "path": "README.md", "pattern": "/^### Options$/", "kind": "subsection"}

Спасибо! Я бы попробовал вариант --_xformat= , поскольку ctags , установленный brew, по умолчанию не поддерживает --output-format=json , будь то brew install ctags или brew install --HEAD universal-ctags/universal-ctags/universal-ctags .

@KazuakiM , нельзя ли связать ctags с libjansson.so.4?
u-ctags имеет режим вывода json. Он доступен, если u-ctags связан с libjansson.
Скажите, следует ли сообщать об этом как о новой проблеме в репозитории homebrew-universal-ctags.

@liuchengxu , файл тегов, собственный формат ctags можно проанализировать с помощью функций в readtags.c.
Команда readtags и python-ctags3, библиотека Python использует readtags.c.

@масатакэ
Привет, homebrew-universal-ctags поддерживает jansson.

$ brew info universal-ctags
universal-ctags/universal-ctags/universal-ctags: HEAD
Maintained ctags implementation
https://github.com/universal-ctags/ctags
Conflicts with:
  ctags (because this formula installs the same executable as the ctags formula)
/usr/local/Cellar/universal-ctags/HEAD-1b747b3 (325 files, 4.3MB) *
  Built from source on 2019-02-02 at 16:45:17
From: https://github.com/universal-ctags/homebrew-universal-ctags/blob/master/universal-ctags.rb
==> Dependencies
Build: autoconf ✔, automake ✔, pkg-config ✔
Optional: jansson ✔, libyaml ✔
==> Options
--with-jansson
        Build with jansson support
--with-libyaml
        Build with libyaml support
--without-doc
        Compile without man pages
--without-xml
        Compile without libxml2
--HEAD
        Install HEAD version
==> Caveats
Under some circumstances, emacs and ctags can conflict. By default,
emacs provides an executable `ctags` that would conflict with the
executable of the same name that ctags provides. To prevent this,
Homebrew removes the emacs `ctags` and its manpage before linking.
However, if you install emacs with the `--keep-ctags` option, then
the `ctags` emacs provides will not be removed. In that case, you
won't be able to install ctags successfully. It will build but not
link.

@KazuakiM Хороший улов, я пропустил помощь. Для поддержки JSON требуется опция --with-jansson .

$ brew reinstall --with-jansson universal-ctags/universal-ctags/universal-ctags
Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

jespinal picture jespinal  ·  8Комментарии

lvc picture lvc  ·  8Комментарии

lvc picture lvc  ·  3Комментарии

jagjordi picture jagjordi  ·  9Комментарии

blueyed picture blueyed  ·  4Комментарии