Ve ne için kullanılabilirler?
(interactive "p")
universal argument
sağdan sayısal bir argüman alıyor mu? Ve evrensel argüman her iki şekilde de int'tir, o halde sermaye ne yapar (interactive "P")
?
Ve ne için kullanılabilirler?
(interactive "p")
universal argument
sağdan sayısal bir argüman alıyor mu? Ve evrensel argüman her iki şekilde de int'tir, o halde sermaye ne yapar (interactive "P")
?
Yanıtlar:
İnsanların bunu Emacs'ın kendi açıklamalarına bağlantılar vermeden burada tarif ettiğine inanmak zor:
Emacs kılavuzunda, düğüm Bağımsız Değişkenleri .
Elisp kılavuzunda, Önek Komut Komut Bağımsız Değişkenleri .
"Emacs'a sorun!": C-h i
Bir kılavuz seçini prefix argument RET
,.
Özetle, buradaki diğer cevaplar tarafından yeterince iyi söylenmesine rağmen, kılavuzda ayrıntılı olarak açıklanmıştır:
"Ham" ön eki arg farklı lisp değerleri sağlar, ve özellikle de ayırt Kullanıcı gerçekte kullanılan olsun veya olmasın (her türde) bir ön ek değişken.
Bunu kullanarak, bir program kullanıcının {biri kullanılır olup olmadığını ayırt edebilir -
, M--
, C--
} ya da {biri M-- 1
, C-- 1
, C-u -1
} (her ikisi de, aynı sayısal önek değeri vardır -1
), ve s,? O kullanılan olmadığını ayırt C-u C-u
veya bir { M-16
, C-16
, C-u 16
} (her ikisi de 16 sayısal değere sahiptir) - diğer birçok ayrım arasında.
Ancak bu tür en önemli ayrım nil
vs olmayan nil
: birçok komut, kullanıcının bir önek argümanı kullanıp kullanmadığına bağlı olarak farklı davranır.
"Sayısal" öneki arg gerçekten fonksiyon sadece değerdir prefix-numeric-value
döner ham önek arg başvurmuştur. IOW, en iyi gerçek ham kullanıcı etkileşiminden bir tamsayıya eşleme olarak düşünülür.
Bu kullanıcı aslında bir önek argüman kullanılan olsun hiçbir önek argüman varsayılan tamsayı 1 eşleştiren çünkü kullanımını yaptığı gibi, söyleyemem C-u 1
, M-1
ya C-1
.
Ham önek Etkileşimli Kod "P"
kullanıldığında, argüman olduğu gibi iletilirken argümanı "p"
bir sayıya dönüştürür.
Aşağıdaki elisp'i değerlendirdikten C-u M-x my/fn-with-num-arg
sonra C-u M-x my/fn-with-raw-arg
, C-u
bir liste bağımsız değişkenini geçtiği için farkı görmeye çalışın (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)
;; .
Ayrıca, argüman varsayılan olarak 1
sayısal argüman ( "p"
) için, varsayılan olarak nil
veya ()
ham argüman ( "P"
) için varsayılan değerdir .
Birkaç sentim: Zaman zaman, varsayılan argümanın kullanılıp kullanılmayacağına "p"
veya kullanılmamasına ilişkin belirleyici faktör veya ."P"
1
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
.
@ Kaushalmodi'nin cevabına (ve kullanışlı test senaryosuna) biraz daha detay eklemek için:
Ham argüman, universal-argument
ve ile sağlanan argümanları ayırt etmenizi sağlar digit-argument
.
Sayısal bir önek argümanı ile, evrensel argümanı C-u
4 (yani C-4
) önek argümanından ayırmanın bir yolu yoktur . : Ham argüman ile bu farklıdır (4)
vs 4
.
Aynısı için de geçerlidir negative-argument
. Ham bir argüman olarak C--
ve arasında ayrım yapabilirsiniz C-- 1
: Birincisi size -
ikinciyi verir -1
. Sayısal bir argümana dönüştürüldüklerinde ikisi de olur -1
.
Ham bir argüman kullanmanın yararı, size daha fazla olası değer vermesidir. Bağımsız değişkenin nasıl belirtildiğine bağlı olarak farklı davranan komutlar yazabilirsiniz.
Örnek olarak, için doc dizesine bir göz atın yank
. Komut davranır Bu C-u
ve C-4
farklı:
Tartışma olarak sadece Cu ile, başa nokta koyun ve sonunda işaretleyin. N argümanıyla, en son N'inci öldürmeyi tekrar takın.
nil
daha iyidir1
, ama asla sarılmış bir ambalajın sarılmamışint
olması tercih edilmezint
. (15 puan alana kadar oy kullanamıyorum, btw).