Ctags: Cómo analizar el nombre de la etiqueta y el tipo de la salida de ctags -R -x

Creado en 12 mar. 2019  ·  8Comentarios  ·  Fuente: universal-ctags/ctags


El nombre del analizador: cualquiera

La línea de comando que usó para ejecutar ctags:

$ ctags --options=NONE -R -x

El contenido del archivo de entrada:

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

Las etiquetas de salida con las que no está satisfecho:

No tengo idea de cómo analizar la salida de ctags -R -x . Quiero filtrar el nombre de la etiqueta y el alcance de la salida de ctags -R -x , pero no sé cómo hacerlo correctamente.

El resultado de las etiquetas que espera:

Es viable si también hay un formato específico para ctags -R :

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

La versión de 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

¿Cómo se obtienen ctags binarios?

brew install ctags en macOS

Todos 8 comentarios

no entiendo tu pregunta

¿Está satisfecho con la salida de ctags -R ? En caso afirmativo, ¿por qué no usa la opción -x ?
Me gustaría conocer más los antecedentes del caso de uso para responder a su pregunta.

No conozco el script vim. Sin embargo, en cuanto a la lectura de vim.c, el analizador vim de ctags, no llena los campos de alcance. Si cree que es un error, díganos que el analizador vim llena el campo de alcance para qué tipo de entrada.

Lo siento por no dejarlo claro.

¿Por qué usar la opción -x ?

Aunque ctags -R satisfaría mis necesidades, no quiero generar el archivo de etiqueta, así que uso la opción -x .

mi caso de uso.

Actualmente, vista.vim solo admite mostrar las etiquetas en algún archivo, pero a algunos usuarios les gustaría mostrar todas las etiquetas en un proyecto (https://github.com/liuchengxu/vista.vim/issues/14). Intenté agregar soporte para ctags -R , pero no sé cómo extraer estos resultados correctamente.

En una palabra, ¿cómo extraer vista#util#Trim , function , 18 , autoload/vista/util.vim , vista#util#Trim(str) respectivamente?

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

Con la opción -o - , ctags emite la salida a la salida estándar como:

[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

Puede personalizar la salida con la opción --_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$/

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

Si no desea escribir un analizador, --output-format=json puede ser una opción:

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"}

¡Gracias! Probaría la opción --_xformat= , ya que ctags instalado por brew no admite --output-format=json de forma predeterminada, ya sea brew install ctags o brew install --HEAD universal-ctags/universal-ctags/universal-ctags .

@KazuakiM , ¿no es posible vincular ctags a libjansson.so.4?
u-ctags tiene modo de salida json. Está disponible si u-ctags está vinculado a libjansson.
Dime si debo informar esto como un problema nuevo en el repositorio homebrew-universal-ctags.

@liuchengxu , archivo de etiquetas, el formato nativo de ctags se puede analizar con funciones en readtags.c.
comando readtags y python-ctags3, una biblioteca de python usa readtags.c.

@masatake
Hola, homebrew-universal-ctags es compatible con 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 Buena captura, extrañé la ayuda. La compatibilidad con JSON necesita la opción --with-jansson .

$ brew reinstall --with-jansson universal-ctags/universal-ctags/universal-ctags
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

songouyang picture songouyang  ·  15Comentarios

lvc picture lvc  ·  3Comentarios

EvanCarroll picture EvanCarroll  ·  14Comentarios

jayceekay picture jayceekay  ·  13Comentarios

sparkcanon picture sparkcanon  ·  3Comentarios