Che cos'è un argomento prefisso non elaborato? (P maiuscola in interattivo)


9

E a cosa possono servire?

(interactive "p")prende un argomento numerico dalla universal argumentdestra? E l'argomentazione universale è solo un int in entrambi i casi, quindi cosa fa il capitale (interactive "P")?

Risposte:


11

Difficile credere che le persone lo abbiano descritto qui senza darvi anche collegamenti alle descrizioni di Emacs su questo:

"Chiedi Emacs!": C-h i , Scegliere un manuale,i prefix argument RET.

In breve, anche se questo è detto abbastanza bene da altre risposte qui, ed è descritto in dettaglio nel manuale:

  • Il pref " arg " di prefisso fornisce valori di Lisp di diverso tipo, e in particolare distingue se l'utente ha effettivamente utilizzato un argomento prefisso (di qualsiasi tipo).

    Usando, un programma può distinguere se l'utente ha utilizzato uno dei { -, M--, C--} o uno dei { M-- 1, C-- 1, C-u -1} (entrambi i quali hanno lo stesso valore del prefisso numerico -1), e distinguere se s? Ha usato C-u C-uo uno dei { M-16, C-16, C-u 16} (entrambi i quali hanno un valore numerico 16) - tra molte altre distinzioni.

    Ma la distinzione più importante è nilvs non- nil: molti comandi agiscono in modo diverso a seconda che l'utente usi un prefisso arg.

  • Il prefisso "numerico" arg è in realtà solo il valore prefix-numeric-valuerestituito dalla funzione quando applicato al prefisso grezzo arg. IOW, è meglio pensare come una mappatura dall'interazione effettiva dell'utente grezzo a un numero intero.

    Non si può dire se l'utente effettivamente utilizzato un argomento prefisso, perché il default di nessun argomento prefisso mappato l'intero 1, proprio come fa l'uso di C-u 1, M-1o C-1.


9

Quando si utilizza il prefisso non elaborato Interactive Code "P" , l'argomento viene trasmesso così com'è mentre "p"converte l'arg in un numero.

Dopo aver valutato il seguente elisp, provare C-u M-x my/fn-with-num-arge quindi C-u M-x my/fn-with-raw-argvedere la differenza perché C-upassa un argomento dell'elenco (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)
;; .

Anche l'argomento viene impostato per default sull'argomento 1numerico ( "p") ma per impostazione predefinita su nilo ()per l'argomento grezzo ( "P").

I miei pochi centesimi: a volte, il fattore decisivo per se utilizzare "p"o "P"è se si desidera che l'argomento predefinito sia 1o 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.

Grazie. Ottengo che a volte è meglio ottenere nilrispetto 1, ma mai che avendo un avvolto intè preferibile ad una scartare int. (Non posso votare fino a quando non ottengo 15 punti, tra l'altro).
24HRRevengeTherapist,

@ 24HrRevengeTherapist: ho appena votato, portandoti oltre la soglia magica di 15 punti. Esci e fai qualche voto in più sugli elementi che ti aiutano!
Dan

Non si tratta di ints avvolti o non imbustati. Non si tratta affatto di ints. E +1 a @kaushalmodi per sottolineare che puoi dire se l'utente ha usato un prefisso arg solo usando l'argomento raw (controllando se il valore è nilo meno).
Estratto il

7

Solo per aggiungere un po 'più di dettaglio alla risposta di @ kaushalmodi (e utile test case):

L'argomento non elaborato consente di distinguere tra gli argomenti forniti con universal-argumente digit-argument.

Con un prefisso numerico arg non c'è modo di distinguere l'argomento universale C-uda un prefisso arg di 4 (cioè C-4). Con l'argomento grezzo questi sono diversi: (4)vs 4.

Lo stesso vale per negative-argument. Come argomento grezzo puoi distinguere tra C--e C-- 1: il primo ti darà -mentre il secondo -1. Se convertiti in un argomento numerico, lo saranno entrambi -1.

Quindi il vantaggio di usare un argomento grezzo è che ti dà più valori possibili. È possibile scrivere comandi che si comportano diversamente a seconda di come viene specificato l'argomento.

Ad esempio, dai un'occhiata alla stringa doc per yank. Questo comando tratta C-ue in modo C-4diverso:

Con solo Cu come argomento, metti il ​​punto all'inizio e segna alla fine. Con l'argomento N, reinserisci l'ennesimo omicidio più recente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.