Was ist ein unformatiertes Präfixargument? (Großbuchstabe P in interaktiv)

9

Und wofür können sie verwendet werden?

(interactive "p")nimmt ein numerisches Argument von universal argumentrechts? Und das universelle Argument ist in beiden Fällen nur ein int. Was macht das Kapital (interactive "P")also?

24HrRevengeTherapist
quelle

Antworten:

11

Kaum zu glauben, dass die Leute dies hier beschrieben haben, ohne Ihnen auch Links zu Emacs 'eigenen Beschreibungen zu geben:

"Ask Emacs!": C-h i Wählen Sie ein Handbuch ,i prefix argument RET.

Kurz gesagt, obwohl dies durch andere Antworten hier gut genug gesagt wird und im Handbuch ausführlich beschrieben wird:

  • Das "rohe" Präfixargument liefert Lisp-Werte verschiedener Art und unterscheidet insbesondere, ob der Benutzer tatsächlich ein Präfixargument (irgendeiner Art) verwendet hat oder nicht .

    Mit ihm kann ein Programm unterscheiden , ob der Benutzer verwendete eine von { -, M--, C--} oder einen { M-- 1, C-- 1, C-u -1} (beide haben den gleichen numerische Präfix Wert -1), und unterscheiden , ob s? Er verwendete C-u C-uoder ein { M-16, C-16, C-u 16} (beide haben den numerischen Wert 16) - neben vielen anderen Unterscheidungen.

    Die wichtigste solche Unterscheidung ist jedoch nilnicht nil: Viele Befehle verhalten sich unterschiedlich, je nachdem, ob der Benutzer ein Präfix arg verwendet.

  • Das "numerische" Präfix arg ist wirklich nur der Wert, den die Funktion prefix-numeric-valuezurückgibt, wenn sie auf das unformatierte Präfix arg angewendet wird. IOW wird am besten als Zuordnung von der tatsächlichen rohen Benutzerinteraktion zu einer Ganzzahl betrachtet.

    Es kann Ihnen nicht sagen , ob der Benutzer tatsächlich einen Präfix Argument verwendet, da der Standard ohne Präfix Argument abbildet auf die ganze Zahl 1, gerade wie auch die Verwendung von C-u 1, M-1oder C-1.

Drew
quelle
9

Wenn Interaktiver Rohpräfixcode "P" verwendet wird, wird das Argument "p"unverändert weitergegeben, während das Argument in eine Zahl konvertiert wird.

Probieren Sie nach dem Auswerten des folgenden Elisp aus C-u M-x my/fn-with-num-argund sehen Sie dann C-u M-x my/fn-with-raw-argden Unterschied, da C-uein Listenargument übergeben wird (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)
;; .

Das Argument ist standardmäßig 1für das numerische Argument ( "p"), standardmäßig für niloder ()für das Rohargument ( "P").

Meine wenigen Cent: Manchmal ist der entscheidende Faktor für die Verwendung "p"oder "P"ob das Standardargument sein soll 1oder nicht 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
quelle
Vielen Dank. Ich verstehe, dass es manchmal besser ist, nilals zu bekommen 1, aber niemals, dass ein Wickeln inteinem Auspacken vorzuziehen ist int. (Kann nicht upvoten, bis ich 15 Punkte bekomme, übrigens).
24HrRevengeTherapist
@ 24HrRevengeTherapist: Ich habe dich gerade hochgestimmt und dich über die magische 15-Punkte-Schwelle gebracht. Gehen Sie raus und stimmen Sie über Dinge ab, die Ihnen helfen!
Dan
Es geht nicht um verpackte oder unverpackte Ints. Es geht überhaupt nicht um Ints. Und +1 an @kaushalmodi, um hervorzuheben, dass Sie feststellen können, ob der Benutzer ein Präfixarg verwendet hat, indem Sie nur das Roharg verwenden (indem Sie überprüfen, ob der Wert ist niloder nicht).
Drew
7

Nur um die Antwort von @ kaushalmodi (und den nützlichen Testfall) etwas detaillierter zu gestalten:

Mit dem Rohargument können Sie zwischen Argumenten unterscheiden, die mit universal-argumentund bereitgestellt werden digit-argument.

Mit einem numerischen Präfix arg gibt es keine Möglichkeit, das universelle Argument C-uvon einem Präfix arg von 4 (dh C-4) zu unterscheiden. Mit dem rohen Argumente sind diese unterschiedlich: (4)vs 4.

Gleiches gilt für negative-argument. Als rohes Argument können Sie zwischen C--und unterscheiden C-- 1: Das erste gibt Ihnen, -während das zweite -1. Wenn sie in ein numerisches Argument konvertiert werden, sind sie beide -1.

Der Vorteil der Verwendung eines Roharguments besteht darin, dass Sie mehr mögliche Werte erhalten. Sie können Befehle schreiben, die sich je nach Angabe des Arguments unterschiedlich verhalten.

Schauen Sie sich als Beispiel die Dokumentzeichenfolge für an yank. Dieser Befehl behandelt C-uund C-4anders:

Setzen Sie mit nur Cu als Argument den Punkt am Anfang und markieren Sie ihn am Ende. Fügen Sie mit Argument N den n-ten letzten Kill erneut ein.

Glucas
quelle