Dan untuk apa mereka digunakan?
(interactive "p")
mengambil argumen numerik dari universal argument
kanan? Dan argumen universal hanyalah int, jadi apa yang dilakukan modal (interactive "P")
?
Dan untuk apa mereka digunakan?
(interactive "p")
mengambil argumen numerik dari universal argument
kanan? Dan argumen universal hanyalah int, jadi apa yang dilakukan modal (interactive "P")
?
Jawaban:
Sulit dipercaya bahwa orang-orang menggambarkan ini di sini tanpa juga memberi Anda tautan ke deskripsi Emacs sendiri tentang ini:
Dalam manual Emacs, argumen Argumen .
Dalam manual Elisp, argumen Argumen Perintah Awalan node .
"Tanya Emacs!":, C-h i
Pilih manuali prefix argument RET
,.
Singkatnya, meskipun ini dikatakan cukup baik oleh jawaban lain di sini, dan dijelaskan secara rinci dalam manual:
The "mentah" awalan arg menyediakan nilai-nilai Lisp dari berbagai jenis, dan khususnya membedakan apakah pengguna benar-benar digunakan argumen awalan (apapun).
Menggunakannya, program dapat membedakan apakah pengguna menggunakan salah satu dari { -
, M--
, C--
} atau salah satu dari { M-- 1
, C-- 1
, C-u -1
} (keduanya memiliki nilai awalan numerik yang sama -1
), dan membedakan apakah s? Ia menggunakan C-u C-u
atau salah satu dari { M-16
, C-16
, C-u 16
} (keduanya memiliki nilai numerik 16) - di antara banyak perbedaan lainnya.
Tetapi perbedaan yang paling penting adalah nil
vs non- nil
: banyak perintah bertindak berbeda tergantung pada apakah pengguna menggunakan awalan arg.
The "numerik" awalan arg benar-benar hanya nilai fungsi prefix-numeric-value
kembali bila diterapkan pada awalan arg baku. TKI, yang terbaik dianggap sebagai pemetaan dari interaksi pengguna mentah yang sebenarnya ke integer.
Tidak dapat memberitahu Anda apakah pengguna benar-benar digunakan argumen awalan, karena default tidak ada awalan argumen peta ke integer 1, seperti halnya penggunaan C-u 1
, M-1
atau C-1
.
Ketika awalan mentah Kode Interaktif "P"
digunakan, argumen diteruskan seperti saat "p"
mengkonversi argumen ke nomor.
Setelah mengevaluasi elisp di bawah ini, cobalah C-u M-x my/fn-with-num-arg
dan kemudian C-u M-x my/fn-with-raw-arg
lihat perbedaannya karena C-u
melewati argumen daftar (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)
;; .
Argumen juga default 1
untuk argumen numerik ( "p"
) tetapi default ke nil
atau ()
untuk argumen mentah ( "P"
).
Beberapa sen saya: Kadang-kadang, faktor penentu untuk menggunakan "p"
atau "P"
apakah Anda ingin argumen default menjadi 1
atau 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
atau tidak).
Hanya untuk menambahkan sedikit lebih detail pada jawaban @ kaushalmodi (dan test case yang berguna):
Argumen mentah memungkinkan Anda membedakan antara argumen yang diberikan dengan universal-argument
dan digit-argument
.
Dengan arg awalan numerik tidak ada cara untuk membedakan argumen universal C-u
dari arg awalan 4 (yaitu C-4
). Dengan argumen baku ini berbeda: (4)
vs 4
.
Hal yang sama berlaku dengan negative-argument
. Sebagai argumen mentah, Anda dapat membedakan antara C--
dan C-- 1
: yang pertama akan memberi Anda -
yang kedua -1
. Ketika dikonversi ke argumen numerik keduanya akan menjadi -1
.
Jadi manfaat menggunakan argumen mentah adalah memberikan Anda nilai yang lebih mungkin. Anda dapat menulis perintah yang berperilaku berbeda tergantung pada bagaimana argumen ditentukan.
Sebagai contoh, lihat string doc untuk yank
. Perintah ini memperlakukan C-u
dan C-4
berbeda:
Dengan hanya Cu sebagai argumen, beri titik di awal, dan tandai di akhir. Dengan argumen N, masukkan kembali kill ke-N terbaru.
nil
daripada1
, tetapi tidak pernah yang dibungkusint
lebih baik daripada yang tidak dibungkusint
. (Tidak dapat memilih hingga saya mendapat 15 poin, btw).