Und wofür können sie verwendet werden?
(interactive "p")
nimmt ein numerisches Argument von universal argument
rechts? Und das universelle Argument ist in beiden Fällen nur ein int. Was macht das Kapital (interactive "P")
also?
Und wofür können sie verwendet werden?
(interactive "p")
nimmt ein numerisches Argument von universal argument
rechts? Und das universelle Argument ist in beiden Fällen nur ein int. Was macht das Kapital (interactive "P")
also?
Antworten:
Kaum zu glauben, dass die Leute dies hier beschrieben haben, ohne Ihnen auch Links zu Emacs 'eigenen Beschreibungen zu geben:
Im Emacs-Handbuch den Knoten Argumente .
Im Elisp-Handbuch Knotenpräfix- Befehlsargumente .
"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-u
oder ein { M-16
, C-16
, C-u 16
} (beide haben den numerischen Wert 16) - neben vielen anderen Unterscheidungen.
Die wichtigste solche Unterscheidung ist jedoch nil
nicht 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-value
zurü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-1
oder C-1
.
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-arg
und sehen Sie dann C-u M-x my/fn-with-raw-arg
den Unterschied, da C-u
ein 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 1
für das numerische Argument ( "p"
), standardmäßig für nil
oder ()
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 1
oder 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.
nil
oder nicht).
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-argument
und bereitgestellt werden digit-argument
.
Mit einem numerischen Präfix arg gibt es keine Möglichkeit, das universelle Argument C-u
von 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-u
und C-4
anders:
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.
nil
als zu bekommen1
, aber niemals, dass ein Wickelnint
einem Auspacken vorzuziehen istint
. (Kann nicht upvoten, bis ich 15 Punkte bekomme, übrigens).