Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call interactive Emacs Lisp function with a prefix argument, from another Emacs Lisp function?

Tags:

emacs

elisp

I want to write an Emacs Lisp function that will turn on flyspell-mode regardless of the current state of the mode. Function flyspell-mode-on is deprecated. The documentation suggests that a positive prefix argument will turn flyspell-mode, but unfortunately running

(flyspell-mode 1)

results in an error message:

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

If I could figure out how to call flyspell-mode with a prefix argument, I believe I could solve this problem.

The most relevant section I can find in the Emacs Lisp manual is the section entitled "Interactive Call", which describes such commands as call-interactively. This is emphatically not what I want.

(The ultimate problem I am trying to solve is to create a mode hook that turns on the mode regardless of its current state.)

N.B. The title of the question emacs lisp call function with prefix argument programmatically makes it appear to be related, but that question was asking about how to create an interactive command, and the issue was ultimately resolved by using call-interactively.


EDIT: This question is moot; I have found an alternate solution to my original problem:

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

But I would still like to know how to call an Emacs Lisp function with a prefix argument, from another Emacs Lisp function, with nothing interactive.


UPDATE: Perhaps I should have asked why I was getting that error message...

like image 981
Norman Ramsey Avatar asked Feb 22 '12 01:02

Norman Ramsey


People also ask

What is the prefix of argument?

argue + ment = argument.

What does interactive do in Lisp?

The interactive-form symbol property can be used to add an interactive form to an existing function, or change how its arguments are processed interactively, without redefining the function.

Is Emacs Lisp the same as Lisp?

Emacs Lisp is a dialect of the Lisp programming language used as a scripting language by Emacs (a text editor family most commonly associated with GNU Emacs and XEmacs). It is used for implementing most of the editing functionality built into Emacs, the remainder being written in C, as is the Lisp interpreter.

How do I run a function in Emacs?

This function can be run simply. The command [Alt][x] is used to a run a function interactively. Typing [Alt][x] switches the focus in Emacs to the minibuffer - if you then type in a function name it will be executed.


1 Answers

It looks like your version of Flyspell mode does not follow the minor mode conventions, which require that you can turn on a minor mode with (name-of-mode t) or any positive prefix argument, turn it off with (name-of-mode 0) any negative prefix argument, and toggle it with (name-of-mode nil).

If you have the latest version of Flyspell, a bug report might be in order. I have the version shipped with GNU Emacs 23.2 on my machine, and it respects the convention. My version also defines two functions turn-on-flyspell and turn-off-flyspell, both trivial wrappers around flyspell-mode; functions with such names are common, but not official conventions. The functions flyspell-mode-on and flyspell-mode-off are apparently intended for internal use.

As a general matter, commands read the current prefix argument from the current-prefix-arg variable. Don't confuse that with prefix-arg, which is the value for the next command (only a few commands like universal-argument touch this variable). Thus, if you need to pass a prefix argument when calling a function, bind or set current-prefix-arg.

(let ((current-prefix-arg t))
  (flyspell-mode))
like image 78
Gilles 'SO- stop being evil' Avatar answered Sep 21 '22 08:09

Gilles 'SO- stop being evil'