Et à quoi peuvent-ils servir?
(interactive "p")prend un argument numérique de la universal argumentdroite? 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 argumentdroite? 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-uou 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 nilvs 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-valueretourne 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-1ou 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-argpuis C-u M-x my/fn-with-raw-argpour voir la différence car C-upasse 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 1argument numérique ( "p") mais par défaut sur nilou ()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 1ou 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.
nilou 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-argumentet digit-argument.
Avec un préfixe numérique arg, il n'y a aucun moyen de distinguer l'argument universel C-ud'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-uet C-4diffé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.
nilque1, mais jamais que le fait d'avoir un emballageintsoit préférable à un emballageint. (Je ne peux pas voter jusqu'à ce que j'obtienne 15 points, au fait).