c++ c linux vim ctags

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()