Aqui está uma resposta rápida -
(defun my-toggle-var (var)
"..."
(interactive
(let* ((def (variable-at-point))
(def (and def
(not (numberp def))
(memq (symbol-value def) '(nil t))
(symbol-name def))))
(list
(completing-read
"Toggle value of variable: "
obarray (lambda (c)
(unless (symbolp c) (setq c (intern c)))
(and (boundp c) (memq (symbol-value c) '(nil t))))
'must-confirm nil 'variable-name-history def))))
(let ((sym (intern var)))
(set sym (not (symbol-value sym)))
(message "`%s' is now `%s'" var (symbol-value sym))))
Mas se você usar Icicles , poderá usar o comando icicle-toggle-option
(com um prefixo negativo arg, se desejar alguma variável e não apenas uma opção do usuário):
icicle-toggle-option is an interactive compiled Lisp function in
`icicles-cmd1.el'.
It is bound to menu-bar options icicles icicle-toggle-option.
(icicle-toggle-option)
Toggle option’s value. This makes sense for binary (toggle) options.
By default, completion candidates are limited to user options that
have ‘boolean’ custom types. However, there are many "binary" options
that allow other non-nil values than t.
You can use a prefix argument to change the set of completion
candidates, as follows:
- With a non-negative prefix arg, all user options are candidates.
- With a negative prefix arg, all variables are candidates.
Read input, then act on it.
Input-candidate completion and cycling are available. While cycling,
these keys with prefix ‘C-’ are active:
‘C-mouse-2’, ‘C-return’ - Act on current completion candidate only
‘C-down’, ‘C-wheel-down’ - Move to next completion candidate and act
‘C-up’, ‘C-wheel-up’ - Move to previous completion candidate and act
‘C-next’ - Move to next apropos-completion candidate and act
‘C-prior’ - Move to previous apropos-completion candidate and act
‘C-end’ - Move to next prefix-completion candidate and act
‘C-home’ - Move to previous prefix-completion candidate and act
‘C-!’ - Act on *all* candidates, successively (careful!)
When candidate action and cycling are combined (e.g. ‘C-next’), user
option ‘icicle-act-before-cycle-flag’ determines which occurs first.
With prefix ‘C-M-’ instead of ‘C-’, the same keys (‘C-M-mouse-2’,
‘C-M-RET’, ‘C-M-down’, and so on) provide help about candidates.
Use ‘mouse-2’, ‘RET’, or ‘S-RET’ to finally choose a candidate, or
‘C-g’ to quit.
This is an Icicles command - see command ‘icicle-mode’.