Et à quoi peuvent-ils servir?
(interactive "p")
prend un argument numérique de la universal argument
droite? Et l'argument universel est juste un int dans les deux sens, alors que fait le capital (interactive "P")
?
Et à quoi peuvent-ils servir?
(interactive "p")
prend un argument numérique de la universal argument
droite? Et l'argument universel est juste un int dans les deux sens, alors que fait le capital (interactive "P")
?
Réponses:
Difficile de croire que les gens ont décrit cela ici sans vous donner également des liens vers les propres descriptions d'Emacs:
Dans le manuel Emacs, noeud Arguments .
Dans le manuel Elisp, noeud Prefix Command Arguments .
"Demandez Emacs!": C-h i
, Choisissez un manuel,i prefix argument RET
.
En un mot, bien que cela soit dit assez bien par d'autres réponses ici, et qu'il soit décrit en détail dans le manuel:
L' argument de préfixe "brut" fournit des valeurs Lisp de différents types, et en particulier il distingue si l'utilisateur a réellement utilisé un argument de préfixe (quel qu'il soit).
Grâce à elle, un programme peut distinguer si l'utilisateur a utilisé l' un des { -
, M--
, C--
} ou l' un des { M-- 1
, C-- 1
, C-u -1
} (qui ont tous deux la même valeur de préfixe numérique de -1
), et distinguer si s? Il a utilisé C-u C-u
ou l' un des { M-16
, C-16
, C-u 16
} (qui ont tous deux une valeur numérique 16) - parmi beaucoup d'autres distinctions.
Mais la distinction la plus importante est nil
vs non nil
: de nombreuses commandes agissent différemment selon que l'utilisateur utilise un préfixe arg.
Le préfixe "numérique" arg est vraiment juste la valeur que la fonction prefix-numeric-value
retourne lorsqu'elle est appliquée au préfixe brut arg. IOW, il est préférable de le considérer comme un mappage entre l'interaction réelle de l'utilisateur brut et un entier.
Il ne peut pas vous dire si l'utilisateur en fait utilisé un argument préfixe, car la valeur par défaut aucun argument préfixe cartes à l'entier 1, tout comme l'utilisation de C-u 1
, M-1
ou C-1
.
Lorsque le préfixe brut Interactive Code "P"
est utilisé, l'argument est transmis tel quel tandis qu'il "p"
convertit l'argument en nombre.
Après avoir évalué l'elisp ci-dessous, essayez C-u M-x my/fn-with-num-arg
puis C-u M-x my/fn-with-raw-arg
pour voir la différence car C-u
passe un argument de liste (4)
.
(defun my/debug-fn (arg)
(let ((msg))
(if (numberp arg)
(setq msg (format "Argument is number %s. " (pp arg)))
(setq msg "Argument is not a number. "))
(if (listp arg)
(setq msg (concat msg (format "Arg is %s." (pp arg))))
(setq msg (concat msg "Argument is not a list.")))
(message msg)))
(defun my/fn-with-num-arg (arg)
(interactive "p")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-num-arg :
;; Argument is number 4. Argument is not a list.
(defun my/fn-with-raw-arg (arg)
(interactive "P")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is (4)
;; .
L'argument est également défini par défaut sur 1
argument numérique ( "p"
) mais par défaut sur nil
ou ()
pour argument brut ( "P"
).
Mes quelques centimes: Parfois, le facteur décisif pour utiliser "p"
ou "P"
est si vous voulez que l'argument par défaut soit 1
ou nil
.
;; Result of M-x my/fn-with-num-arg :
;; Argument is number 1. Argument is not a list.
;; Result of M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is nil.
nil
ou non).
Juste pour ajouter un peu plus de détails à la réponse de @ kaushalmodi (et cas de test utile):
L'argument brut vous permet de distinguer les arguments fournis avec universal-argument
et digit-argument
.
Avec un préfixe numérique arg, il n'y a aucun moyen de distinguer l'argument universel C-u
d'un préfixe arg de 4 (ie C-4
). Avec l'argument brut ceux - ci sont différents: (4)
vs 4
.
Il en va de même avec negative-argument
. Comme argument brut, vous pouvez distinguer entre C--
et C-- 1
: le premier vous donnera -
tandis que le second -1
. Une fois convertis en argument numérique, ils le seront tous les deux -1
.
L'avantage d'utiliser un argument brut est donc qu'il vous donne plus de valeurs possibles. Vous pouvez écrire des commandes qui se comportent différemment selon la façon dont l'argument est spécifié.
À titre d'exemple, jetez un œil à la chaîne doc pour yank
. Cette commande traite C-u
et C-4
différemment:
Avec juste Cu comme argument, mettez le point au début et marquez à la fin. Avec l'argument N, réinsérez le Nème kill le plus récent.
nil
que1
, mais jamais que le fait d'avoir un emballageint
soit préférable à un emballageint
. (Je ne peux pas voter jusqu'à ce que j'obtienne 15 points, au fait).