Apa argumen awalan mentah? (huruf P dalam bentuk interaktif)

9

Dan untuk apa mereka digunakan?

(interactive "p")mengambil argumen numerik dari universal argumentkanan? Dan argumen universal hanyalah int, jadi apa yang dilakukan modal (interactive "P")?

24HrRevengeTherapist
sumber

Jawaban:

11

Sulit dipercaya bahwa orang-orang menggambarkan ini di sini tanpa juga memberi Anda tautan ke deskripsi Emacs sendiri tentang ini:

"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-uatau 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 nilvs non- nil: banyak perintah bertindak berbeda tergantung pada apakah pengguna menggunakan awalan arg.

  • The "numerik" awalan arg benar-benar hanya nilai fungsi prefix-numeric-valuekembali 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-1atau C-1.

Drew
sumber
9

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-argdan kemudian C-u M-x my/fn-with-raw-arglihat perbedaannya karena C-umelewati 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 1untuk argumen numerik ( "p") tetapi default ke nilatau ()untuk argumen mentah ( "P").

Beberapa sen saya: Kadang-kadang, faktor penentu untuk menggunakan "p"atau "P"apakah Anda ingin argumen default menjadi 1atau 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
sumber
Terima kasih. Saya mendapatkan bahwa kadang-kadang lebih baik untuk mendapatkan nildaripada 1, tetapi tidak pernah yang dibungkus intlebih baik daripada yang tidak dibungkus int. (Tidak dapat memilih hingga saya mendapat 15 poin, btw).
24HrRevengeTherapist
@ 24HrRevengeTherapist: baru saja terpilih, membawa Anda melewati ambang 15 poin ajaib. Pergi dan lakukan pemungutan suara untuk beberapa item yang membantu Anda!
Dan
Ini bukan tentang ints dibungkus vs tidak dibuka. Ini bukan tentang int sama sekali. Dan memberi +1 ke @kaushalmodi untuk menekankan bahwa Anda dapat mengetahui apakah pengguna menggunakan awalan arg hanya dengan menggunakan arg mentah (dengan memeriksa apakah nilainya nilatau tidak).
Drew
7

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-argumentdan digit-argument.

Dengan arg awalan numerik tidak ada cara untuk membedakan argumen universal C-udari 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-udan C-4berbeda:

Dengan hanya Cu sebagai argumen, beri titik di awal, dan tandai di akhir. Dengan argumen N, masukkan kembali kill ke-N terbaru.

glukas
sumber