¿Puede el soporte de emacs ir a la declaración de función en un proyecto completo?


12

¿Tiene emacs una función o biblioteca que le permita al usuario ir a la declaración de función incluso si se definió en otro archivo?

Si es así, ¿para qué idiomas hay soporte?

La inspiración para esta pregunta proviene del siguiente artículo que habla sobre algunas de las razones por las cuales emacs nunca podrá competir con los IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/


La forma en que emacs generalmente maneja esto es confiando en programas externos compilados (como clang) para comprender el código fuente rápidamente y responder a las consultas enviadas a través de la línea de comando. Echa un vistazo irony-clanga este fin. ¿Leíste los comentarios sobre el artículo?
Sean Allred

1
La funcionalidad proporcionada por alchemist.el, para elixir u omnisharp para C #, que dependen de programas externos para la navegación / refactorización / ide-ish, son bastante similares a la mayoría de los IDE existentes. (al menos para la mayoría de los casos de uso). Emacs no está en el mismo negocio que los IDE, por lo que no creo que sea razonable decir que nunca tendrá una oportunidad competitiva.
Renan Ranelli

@RenanRanelli IDE es exactamente de la misma manera, excepto que tenemos que hacer la integración manualmente en lugar de que alguien ya lo haya hecho y lo haya llamado "IDE".
Tu Do

EN 2019 solo hay una solución que debes considerar en mi opinión. Y eso es rtags con la finalización de la empresa. Olvídese de etags o del CEDET hinchado e inestable. rtags utiliza información en tiempo de compilación para proporcionar una estructura EN VIVO de lo que está utilizando su proyecto. global y otros son horribles: son gloriosos "greps" que hacen muchas conjeturas y con frecuencia lo llevan al lugar equivocado. github.com/Andersbakken/rtags
RichieHH

Respuestas:


14

Puede saltar a cualquier definición / referencia de un proyecto completo tan grande como el árbol fuente del kernel de Linux (más de 36k) en un instante. Vea mi guía C / C ++ para más detalles. Para C / C ++, sugiero usar GNU Global que sea compatible con C, C ++, Yacc, Java, PHP4 y ensamblaje.

La clave es que, si desea tener características IDE de un idioma, debe instalar el complemento de ese idioma. Aquí hay algunos paquetes para lenguajes dinámicos que conozco:

  • Desarrollo web en vivo: modo brocheta .
  • Javascript: Tern . Pero antes de eso, recuerde instalar js2-mode . En cuanto a lo que js2-modehace, ver la descripción ; pero, en esencia, js2-modees un completo analizador de Javascript que genera un AST para hacer las funciones IDE adecuadas. Si instala skewer-modede lo que tendrá js2-modepor defecto, ya que skewer-modedepende de ello.
  • Python: elpy , mira las características del IDE
  • Ruby: robe proporciona estas características:
  • Saltar a la definición del método
  • Saltar a super o un constructor llamado en el punto
  • Salte a un módulo o clase (siempre que tenga al menos un método definido)
  • Mostrar la documentación del método
  • Muestra información sobre el método llamado en el punto usando ElDoc
  • Método y finalización constante del nombre

También puede usar ctagspara admitir muchos idiomas, como script de shell o Tcl ...


¿Alguna sugerencia de suite para javascript?
user2522280

@BarryG Hay Tern y edité j2-modemi respuesta.
Tu Do

2
Me gustaría señalar que anacondapuede ser una solución más específica para el salto de definición en Python.
PythonNut

@TuDo Has puesto la lista de características de Robe en ESS.
Dmitry

Para C ++, también hay rtags e ycmd . Yo uso ycmd, que también funciona con, por ejemplo, Python, C #, Go y otros lenguajes. Utilizo dumb-jump y advice-rg como alternativa o para mostrar usos o comentarios / documentos de un símbolo.
Martillo

18

Me encontré con un problema similar con emacs, así que hice Dumb Jump . Probé muchas de las soluciones mencionadas en la respuesta aceptada, pero siempre me encontré con uno o más de los siguientes problemas:

  • La solución solo funcionó para un único lenguaje de programación
  • La solución requería un archivo de índice (TAG) o un proceso persistente

Tenía muchas ganas de una solución que "simplemente funcionó" y no requirió personalización o configuración. Es decir, quería clonar un repositorio aleatorio en Github y navegar por él como cualquier otro de mis propios proyectos.

En este momento Dumb Jump tiene soporte básico para:

  • JavaScript
  • Emacs Lisp
  • Pitón
  • Vamos
  • PHP
  • Rubí
  • Fausto
  • R
  • Lua
  • Oxido
  • ...y más

Está disponible a través de MELPA y GitHub. Los temas y relaciones públicas son más que bienvenidos.


4

La solución principal para esto en emacs es usar archivos TAGS, que son creados por programas como etags o gtags. Yo mismo uso (y recomiendo) etiquetas exuberantes y etags-select.el para ayudarlo a reducir los destinos cuando el símbolo de búsqueda se encuentra en varios destinos. Los idiomas admitidos son bastante numerosos, consulte los manuales de las herramientas individuales. Incluso hay soporte para agregar su propio idioma, por lo que puede proporcionar una expresión regular que instruya a los ctags cómo aislar las etiquetas que le interesan.


1
Oh! ¿Cómo podría olvidarme de los archivos de etiquetas? ctags -e -R *desde el directorio raíz lo configurará para usted.
Sean Allred

¿Es esta una solución aceptable cuando su proyecto tiene muchas dependencias (como proyectos de desarrollo web javascript más recientes)?
Rudolf Olah

El número de dependencias no es en sí mismo un impedimento. Puede tener un archivo de etiquetas grandes que agregue muchas bibliotecas diferentes; Lo hice durante muchos años, la invocación del comando ctags hace esto trivialmente. O lo que ahora recomiendo es tener un archivo de etiquetas separado por dependencia; emacs es lo suficientemente inteligente como para cargar múltiples archivos de etiquetas. Para facilitar esto, busque etags-table.el, que ayuda a cargar grupos de archivos de etiquetas por proyecto.
InHarmsWay
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.