Qu'est-ce qu'un argument de préfixe brut? (majuscule P en interactif)

9

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")?

24HrRevengeTherapist
la source

Réponses:

11

Difficile de croire que les gens ont décrit cela ici sans vous donner également des liens vers les propres descriptions d'Emacs:

"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.

A dessiné
la source
9

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.
Kaushal Modi
la source
Merci. Je comprends que parfois, il vaut mieux nilque 1, mais jamais que le fait d'avoir un emballage intsoit préférable à un emballage int. (Je ne peux pas voter jusqu'à ce que j'obtienne 15 points, au fait).
24HrRevengeTherapist
@ 24HrRevengeTherapist: votez juste pour vous, vous faisant dépasser le seuil magique de 15 points. Sortez et votez pour les articles qui vous aident!
Dan
Il ne s'agit pas de poils emballés vs non emballés. Il ne s'agit pas du tout d'ts. Et +1 à @kaushalmodi pour souligner que vous pouvez dire si l'utilisateur a utilisé un argument de préfixe uniquement en utilisant l'argument brut (en vérifiant si la valeur est nilou non).
Drew
7

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.

glucas
la source