2012-09-25 21 views
11

Por lo que entiendo, en Emacs que se puede ejecutar comandos como M-x (que por cierto creo gradas para execute-extended-command). Este comando M-x se usa para ejecutar cosas como customize_face, p. escribiendo M-x customize-face en el minibúfer.relación entre las funciones y los comandos de Emacs

Mis preguntas son:

P.1. ¿Es customize-face un comando ? o es una función ? ¿Y decimos que customize-face se pasa al comando M-x como un argumento ?

P.2 ¿Todos los comandos de Emacs tienen una función asociada Emacs ? (es decir, cuando ingreso M-x customize-face supongo que se llama a una función definida ). Si es así, ¿cómo puedo buscar el nombre de la función desde el nombre del comando? (y viceversa)

+0

M-x no es una función, es una secuencia de teclas que está vinculada a una función. Como sucede, está ligado a una función que toma un comando como parámetro; cuando se llama de forma interactiva, su forma 'interactive' hace que solicite un nombre de comando. – tripleee

Respuesta

19

Sí, todos los comandos de Emacs son funciones, pero no todas las funciones son comandos de Emacs. Usted puede hacer una función arbitraria elisp un comando accesible a través de M-x usando (interactive):

(defun my-command() 
"This is the docstring" 
(interactive) 
(do-foo) 
(do-bar)) 

Ahora que ha definido como my-command interactiva, se puede acceder de forma inmediata con M-x my-command. Emacs hace toda la contabilidad con el nombre automáticamente.

Esto es todo que tiene que hacer para agregar un nuevo comando! Entonces se puede asociar a una tecla con algo como:

(global-set-key (kbd "C-c f") 'my-command) 

Por otra parte, cada llave-unión se asocia con una función interactiva de esta manera. Puede encontrar la función a la que se llama mediante qué tecla usando C-h k e ingresando la secuencia de teclas. Esto le dará la documentación de la función que se invocará en esa secuencia de teclas. Si ha ejecutado el código que te di, haciendo C-h k C-c f le daría un tampón que contiene (entre otras cosas) el doc-string:

C-c f runs the command my-command, which is an interactive Lisp 
function. 

It is bound to C-c f. 

(my-command) 

This is the docstring 

Por lo tanto: todos los comandos de Emacs son sólo funciones definidas con (interactive). (En realidad, también hay algunas funciones primitivas del núcleo C de Emacs, pero eso no es muy importante.)

Esta relación simple y elegante entre comandos y funciones, que es fácil de seguir en cualquier dirección, es parte de lo que hace que Emacs sea tan fácil de personalizar. Si alguna vez se pregunta qué funciones llaman sus acciones normales, puede buscarlas fácilmente y, si desea agregar más comandos, solo tiene una línea adicional en su función.

+2

http://www.gnu.org/software/emacs/manual/html_node/elisp/Command-Overview.html podría ser un buen punto de partida para seguir leyendo. – tripleee

+1

Muchas gracias @Tikhon Jelvis. Una pregunta más, explicó cómo puedo buscar cuál función es llamada por cada tecla usando 'C-h k', pero ¿cómo encuentro la función llamada por un comando? (por ejemplo, 'M-x dired' cuando se usa ** Dired + **) –

+3

Puede hacer' C-h F' e ingresar el nombre del comando. Si desea buscar una función que * no * sea necesariamente un comando, puede usar 'C-h f' que funciona para todas las funciones en el alcance. –

6

Un detalle más: para las personas que se preguntan por qué necesitarías agregar (interactive) para etiquetar una función como también un comando, el truco es que interactive está ahí para explicar cómo proporcionar argumentos a la función.Así que (interactive) dice "esto también es un comando y cuando se ejecuta interactivamente, simplemente llame a la función sin argumentos", donde (interactive (list 2)) dice "esto también es un comando y cuando se ejecuta interactivamente, evalúa la expresión (list 2) construirá la lista de argumentos para aprobar al comando ".

Ha habido discusión sobre la extensión interactive por lo que en lugar de solamente tomando la forma (interactive ARGs-FORM) también puede tomar la forma (interactive ARGS-FORM RETURN-FORM) donde RETURN-FORM especifica qué hacer con el valor de retorno, cuando se le llama de forma interactiva. Ejemplo típico: current-column como una función no imprime nada, sino simplemente devolver un número, pero cuando se ejecuta de forma interactiva (es decir, utilizado como un comando ) si no se imprime nada se vuelve inútil, por lo que el RETURN-FORM tomaría el número devuelto e imprimirlo.

Cuestiones relacionadas