Navegue hasta el código fuente de las funciones y variables incorporadas.

9

A lo largo del día uso constantemente C-h fo C-h v( describe-functiony describe-variable) para buscar documentación para funciones y variables. La mayoría de las veces, si no obtengo toda la información que necesito, haré clic en el enlace del archivo al final de:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

y navega hasta el código fuente. Esto funciona para paquetes instalados, pero no parece funcionar para los integrados. Por ejemplo, en la parte superior de la página de ayuda para el comando, describe-functiontodo lo que obtengo es:

describe-function is an interactive compiled Lisp function.

sin enlace al código fuente. ¿Hay alguna forma de navegar rápidamente al código fuente de un paquete integrado?

Sé que puedo encontrar el código fuente en, por ejemplo, /usr/share/emacs/24.5/lispy encontrar varias formas de acceder a ese directorio rápidamente, pero tengo curiosidad por saber si hay una manera rápida y fácil de navegar a una función incorporada / definición de variable en el código fuente. ¡Gracias!

elethan
fuente
55
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Siempre uso una instalación completa de Emacs para tener acceso a todo, y justo después de construir mi propio Emacs copio sobre el código fuente C y establezco su ubicación para que pueda encontrar definiciones de código fuente C también. Consulte la variable find-function-C-source-directorypara establecer la ubicación del código fuente C después de copiarlo.
leyes el
1
Usando la rama maestra de Emacs, obtengo lo siguiente con M-x describe-function: describe-function es una función Lisp compilada con carga automática interactiva en 'help-fns.el'. Y desde allí puedo hacer clic en (o presionar enter) help-fns.ely luego ser transportado a la sección correspondiente del código. ¿Quizás tenga múltiples versiones de Emacs, y la que está usando en este momento no tiene todo el código fuente instalado?
ley el
Si obtiene ese comportamiento cuando inicia Emacs usando emacs -Q(sin archivo de inicio), o si puede reprogramarlo con una receta que comienza con emacs -Q(por ejemplo, decir qué bibliotecas carga y cómo las carga, etc.), considere la posibilidad de presentar un error reportar: M-x report-emacs-bug.
Dibujó el
44
nb IIRC, los paquetes de Emacs para Debian (tal vez también otros sistemas operativos) separan los .elarchivos (tratados como opcionales) de los .elcarchivos (obligatorios), de modo que necesita instalar uno o más paquetes adicionales para obtenerlos. Si obtuvo Emacs del administrador de paquetes de su sistema operativo, tal vez esto lo explique.
phils
1
Puede hacer un grep (u otra utilidad de búsqueda) para el nombre de los archivos binarios (con permisos ejecutables) - emacs o emacsclient - y ver dónde están en su disco duro. Almaceno el mío por separado en su propia carpeta dedicada. Por ejemplo, tengo la versión que se incluye con mi sistema operativo - /usr/bin/emacsy /usr/bin/emacsclient, y tengo una versión muy bien empaquetado en una aplicación OSX carpeta que termina por .app - es decir, /Applications/Emacs.app(dentro de esa Emacs.app, son los binarios y toda la archivos de código fuente).
ley el

Respuestas:

7

La razón por la que a veces ve la "función Lisp compilada interactiva" (o lo mismo ocurre con las variables) sin nombre de archivo es porque la función se cargó desde un archivo compilado por bytes y el archivo fuente de Elisp correspondiente no está presente. Para poder mostrarle el código fuente, Emacs debe poder encontrar el código fuente.

Muchas distribuciones envían los archivos fuente de Lisp en un paquete separado, porque no todos los usuarios los quieren y son voluminosos. Por ejemplo, en Debian y derivados, instale emacs24-el. Si construye Emacs desde la fuente, make installcopie las fuentes de Elisp.

Si desea ver el código fuente de las primitivas (subrutinas y formas especiales), Emacs necesita poder encontrar las fuentes C. Esos normalmente no están disponibles a menos que los haya instalado desde la fuente.

Emacs busca las fuentes de Lisp en los directorios en load-path. Para una función o variable cargada desde foo.elc,el archivo puede ser foo.elo foo.el.gz. Emacs busca las fuentes C debajo source-directoryy le solicita un directorio diferente si no encuentra el archivo fuente.

Gilles 'SO- deja de ser malvado'
fuente
Aunque podría haber jurado que construí esta versión de Emacs desde la fuente, cuando lo llamo M-x emacs-versiondice "modificado por Debian" al final, lo que indicaría que estoy usando una versión del administrador de paquetes de mi sistema operativo (Ubuntu), ¿verdad?
Elethan
@elethan Si dice "modificado por Debian", entonces instaló o al menos compiló el paquete Ubuntu. Es posible que lo haya construido desde la fuente (tal vez porque quería una versión más nueva que la de su versión de Ubuntu). ¿Estás corriendo /usr/bin/emacso /usr/local/bin/emacs?
Gilles 'SO- deja de ser malvado'
1

Si está buscando formas de saltar rápidamente al código fuente, también hay find-function-at-pointy find-variable-at-pointsaltará a la definición del símbolo debajo del cursor; por ejemplo, puede vincularlos a Ch Cf y Ch Cv.

O podrías probar elisp-slime-nav , que usa M-. saltar a la definición de un símbolo, y M-, regresar - navega a variables, funciones, bibliotecas y caras - https://github.com/purcell/elisp-slime-nav/

Brian Burns
fuente