ctags ignora las listas de libc6, libstdc++ y boost
linux vim (4)
¡Tenía mi propia lista y nunca pensé en agregar lo que ya has listado!
Aquí está la lista de ignorados actualizada para libc6 que he encontrado (Ubuntu 14.04 y GCC 4.8.4) para usar como entrada a la opción -I de ctags:
__attribute__
__attribute_deprecated__
__attribute_format_arg__+
__attribute_format_strfmon__+
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__attribute_alloc_size__+
__attribute_const__
__attribute_artificial__
__wur
__THROW
__THROWNL
__BEGIN_DECLS
__END_DECLS
__BEGIN_NAMESPACE_STD
__END_NAMESPACE_STD
__USING_NAMESPACE_STD+
__BEGIN_NAMESPACE_C99
__END_NAMESPACE_C99
__USING_NAMESPACE_C99+
__warndecl+
__warnattr+
__errordecl+
__flexarr=[]
__fortify_function
__REDICRECT+
__REDIRECT_NTH+
__REDIRECT_NTHNL+
__ASMNAME+
__ASMNAME2+
__nonnull+
__always_inline
__extern_inline=extern
__extern_always_inline=extern
__extension__
__restrict
__restrict_arr
También creé la siguiente lista de ignorados para generar un archivo de etiquetas para libstdc ++ (GCC 4.8.2 en Ubuntu 14.04) (nuevamente, esto es una entrada para la opción -I):
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_ALGO
_GLIBCXX_END_NAMESPACE_ALGO
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_END_NAMESPACE_CONTAINER
_GLIBCXX_BEGIN_EXTERN_C
_GLIBCXX_END_EXTERN_C
_GLIBCXX_VISIBILITY+
_GLIBCXX_PURE
_GLIBCXX_CONST
_GLIBCXX_NORETURN
_GLIBCXX_CONSTEXPR=constexpr
_GLIBCXX_USE_CONSTEXPR=constexpr
_GLIBCXX_THROW_OR_ABORT+
_GLIBCXX_NOEXCEPT
_GLIBCXX_USE_NOEXCEPT
_GLIBCXX_THROW+
_GLIBCXX_NOTHROW
Cambié __attribute__
a ser: __attribute__+
para indicar que parece una función y se debería ignorar.
Por supuesto, también he creado uno para Boost, pero creo que me abstendré de publicarlo hasta que alguien lo necesite.
Uso ctags con vim y el complemento OmniCppComplete . Actualmente al generar mis etiquetas lo hago individualmente para cada biblioteca. Para libc6 utilizo la siguiente lista de tokens / macros en un archivo llamado libc6-ignore para ignorar durante el procesamiento:
__attribute__
__attribute_deprecated__
__attribute_format_arg__
__attribute_format_strfmon__
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__wur
__THROW
__nonnull+
¿Me faltan otros tokens que debo ignorar y debo usar esta misma lista o una diferente al generar etiquetas para libstdc ++ y boost?
Para cualquiera que esté interesado, uso lo siguiente para generar mis archivos de etiquetas:
# First make sure apt-file is install and then do:
$ sudo apt-file update
# set up tags for libc, the standard C library
$ apt-file list libc6-dev | grep -o ''/usr/include/.*/.h''> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
# create tags for stdlibc++ and STL
$ apt-file list libstdc++6-4.4-dev | grep -E -o ''/usr/include/.*/.(h|hpp)'' > ~/.vim/tags/stdlibcpp-filelist
$ ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist
# For Boost
$ apt-file list boost | grep -E -o ''/usr/include/.*/.(h|hpp)'' | grep -v ''/usr/include/boost/typeof/'' > ~/.vim/tags/boost-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost -L ~/.vim/tags/boost-filelist
He seguido esas instrucciones y puedo hacer funcionar todas las referencias de boost boost, es decir,
#include <iostream>
Puedo saltar directamente a iostream
Sin embargo, lo que todavía me falta es ir, por ejemplo, a
#include <stdio.h>
Aunque en mi script de generar he incluido como mencionaste, es decir
$ apt-file list libc6-dev | grep -o ''/usr/include/.*/.h''> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
Después de generar el archivo de la etiqueta "libc6" cada vez que intento ir a stdio.h dice "E426: etiqueta no encontrada: stdlib".
Esto es lo que he incluido además de mi .vimrc para hacer visibles todos esos archivos de 3 etiquetas.
set tags+=~/.vim/tags/boost
set tags+=~/.vim/tags/libc6
set tags+=~/.vim/tags/stdlibcpp
No soy un experto, sin embargo, puedo decir que esto funcionó de alguna manera para impulsar, pero no para libc6-dev. ¿Puede alguien ayudarme con la solución?
Aquí está el mismo código que el anterior
actualización de sudo apt-file
# set up tags for libc, the standard C library
apt-file list libc6-dev | grep -o ''/usr/include/.*/.h''> ~/.vim/tags/libc6-filelist
ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
apt-file list libstdc++6-4.6-dev | grep -E -o ''/usr/include/.*/.(h|hpp)'' >> ~/.vim/tags/stdlibcpp-filelist
ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist
# For Boost
apt-file list boost | grep -E -o ''/usr/include/.*/.(h|hpp)'' | grep -v ''/usr/include/boost/typeof/'' > ~/.vim/tags/boost-filelist
ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost -L ~/.vim/tags/boost-filelist
Lo siento, nunca he usado ctags antes, pero intentaré esta pregunta.
Si entiendo correctamente, puede utilizar la lista de palabras clave de GCC. Encontré este https://gist.github.com/959484 dentro de gcc/gcc/c-family/c-common.c
. Parece que incluye palabras reservadas para todas las C (c / c ++ / obj-c variantes). Supongo que algunos son válidos para todos los compiladores, estos son para gcc, por supuesto.
En cuanto a descifrar otros símbolos para ignorar, en OS X usaría nm para volcar los símbolos de la biblioteca en cuestión y agregar todos los símbolos marcados como privados (''s'' en lugar de ''S'' por ejemplo) a mi lista de símbolos ignorar. ¿Linux tiene una herramienta similar para descargar bibliotecas?
Espero que sea útil.
También puede usar la biblioteca libstdc ++ modificada:
http://www.vim.org/scripts/script.php?script_id=2358
Esto contiene una versión reducida de los archivos de encabezado de C ++ que funciona para ctags.
Hice una secuencia de comandos de Python que extrae todas las etiquetas que comienzan con un guión bajo de un archivo de etiquetas. Puede elegir con este script qué etiquetas excluir. Siéntase libre de adaptar el script para satisfacer sus necesidades o sugerir cualquier otra cosa:
import re
tags=open(''tags'',''r'')
output=open(''exclude'',''w'')
regex=re.compile(''^_[a-zA-Z0-9_]*'')
results=set()
for line in tags:
result=regex.match(line)
if(result!=None):
results.add(result.group(0))
tags.close()
for element in sorted(results):
output.write(''{0}/n''.format(element))
output.close()