2012-02-22 15 views
11

Quiero escribir una función Emacs Lisp que activará flyspell-mode independientemente del estado actual del modo. La función flyspell-mode-on está en desuso. La documentación sugiere que un argumento prefijo positivo a su vez, flyspell-mode, pero desafortunadamente corriendoCómo llamar a la función Emacs Lisp interactiva con un argumento de prefijo, desde otra función Emacs Lisp?

(flyspell-mode 1) 

produce un mensaje de error:

Wrong number of arguments: (lambda (flyspell-mode 1)), 0 

Si pudiera encontrar la manera de llamar flyspell-mode con un argumento prefijo , Creo que podría resolver este problema.

La sección más relevante que puedo encontrar en el manual de Emacs Lisp es la sección titulada "Llamada interactiva", que describe comandos como call-interactively. Esto es enfáticamente no es lo que quiero.

(El último problema que estoy tratando de resolver es el de crear un gancho de modo que se convierte en el modo independientemente de su estado actual.)

N. B. El título de la pregunta emacs lisp call function with prefix argument programmatically hace que parezca estar relacionado, pero esa pregunta era acerca de cómo crear un comando interactivo, y el problema finalmente se resolvió usando call-interactively.


EDITAR: Esta cuestión es discutible; He encontrado una solución alternativa al problema original:

(add-hook 'text-mode-hook 
      (function (lambda() 
         (require 'flyspell) 
         (if flyspell-mode nil (flyspell-mode))))) 

Pero todavía me gustaría saber cómo llamar a una función Emacs Lisp con un argumento prefijo, desde otra función Emacs Lisp, con nada interactiva.


ACTUALIZACIÓN: Tal vez debería haber preguntado por qué estaba recibiendo ese mensaje de error ...

Respuesta

9

Parece que su versión de modo Flyspell no sigue el minor mode conventions, que requieren que se puede activar un modo menor con (name-of-mode t) o cualquier argumento prefijo positivo, apagarlo con (name-of-mode 0) ningún argumento prefijo negativo, y alternarlo con (name-of-mode nil).

Si tiene la última versión de Flyspell, un informe de error podría estar en orden. Tengo la versión enviada con GNU Emacs 23.2 en mi máquina, y respeta la convención. Mi versión también define dos funciones turn-on-flyspell y turn-off-flyspell, ambas envolturas triviales alrededor de flyspell-mode; las funciones con tales nombres son comunes, pero no son convenciones oficiales. Las funciones flyspell-mode-on y flyspell-mode-off están aparentemente destinadas para uso interno.

Como regla general, los comandos leen el argumento de prefijo actual de la variable current-prefix-arg. No confunda eso con prefix-arg, que es el valor para el siguiente comando (solo algunos comandos como universal-argument tocan esta variable). Por lo tanto, si necesita pasar un argumento de prefijo al llamar a una función, enlace o establezca current-prefix-arg.

(let ((current-prefix-arg t)) 
    (flyspell-mode)) 
+0

Estoy ejecutando emacs 21, ya que emacsen 22 y 23 causaron algunas pérdidas en algunos modos heredados que uso pero que ya no se mantienen. –

+1

@NormanRamsey Wow, eso está envejeciendo. En cuanto a por qué recibes este mensaje de error, bueno, no hay nada más que la función 'flyspell-mode' en tu versión sin tomar ningún argumento y leyendo' current-prefix-arg' directamente; este es un defecto de diseño corregido en versiones posteriores. – Gilles

4

Si no está llamando a una función interactiva, a continuación, la declaración (interactive) no se utiliza para obtener los argumentos .

En la gran mayoría de los casos, no tiene que preocuparse de si un argumento puede ser un "argumento de prefijo" para llamadas no interactivas; solo revisa la documentación de la función y pasa el valor que necesitas para lo que sea que quieras hacer.

Si por alguna razón necesita replicar el envío de un argumento prefijo en un contexto no interactivo, deberá verificar la declaración (interactive) de esa función y determinar exactamente cómo está utilizando ese argumento, y asegurarse de que reproduce ese comportamiento por el argumento que apruebas

Para los detalles completos, véase:

  • C-hfinteractiveRET
  • M-:(info "(elisp) Prefix Command Arguments")RET

En casos más complejos w aquí la función cambia su comportamiento en función de la variable current-prefix-arg, es posible que pueda establecer esa variable directamente.

(let ((current-prefix-arg '(4))) 
    (foo current-prefix-arg)) 
0

No estoy Emacs y maestro Elisp ( todavía;)), pero creo que en este caso you may useCtrl - u1Alt - xflyspell-mode.

+5

Esa sería una llamada interactiva. – phils

2

puedo pensar en esto .. debe ser más mejor

(call-interactively '(lambda() 
         (interactive) 
         (flyspell-mode '(4)))) 

ACTUALIZACIÓN: puedo ejecutar esta directamente .. ¿Cuál falto de la pregunta.?

(flyspell-mode '(4)) 
+0

'(flyspell-mode '(4))' es el trabajo para mí. – jiahut

1

Fwiw, la función `flyspell-mode' ha aceptado un argumento (como en "(flyspell-modo 1)") al menos desde Emacs-21, así que no sé cómo ha llegado hasta ese error .

Pero mientras estoy aquí, también podría señalar que (add-hook 'text-mode-hook' flyspell-mode) ha cambiado el significado en Emacs-24: en lugar de significar "alternar flyspell-mode en modos de texto "ahora significará" habilitar el modo flyspell en modos de texto ". Es un cambio incompatible con versiones anteriores, pero creo que solucionará más errores latentes de los que presentará.

Cuestiones relacionadas