Ham önek argümanı nedir? (etkileşimli olarak büyük P harfi)


9

Ve ne için kullanılabilirler?

(interactive "p")universal argumentsağ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:


11

İnsanların bunu Emacs'ın kendi açıklamalarına bağlantılar vermeden burada tarif ettiğine inanmak zor:

"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-uveya 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 nilvs 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-valuedö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-1ya C-1.


9

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-argsonra C-u M-x my/fn-with-raw-arg, C-ubir 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 1sayısal argüman ( "p") için, varsayılan olarak nilveya ()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"1nil

;; 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.

Teşekkürler. Bazen almak nildaha iyidir 1, ama asla sarılmış bir ambalajın sarılmamış intolması tercih edilmez int. (15 puan alana kadar oy kullanamıyorum, btw).
24HrRevengeTherapist

@ 24HrRevengeTherapist: Sizi büyülü 15 puan eşiğini geçerek az önce oy kullandınız. Dışarı çıkın ve size yardımcı olan öğelere biraz oy verin!
Dan

Bu, sarılmış ve sarılmamış ints ile ilgili değil. Hiç ints ile ilgili değil. Ve + 1'den @kaushalmodi'ye, kullanıcının yalnızca ham argümanı kullanarak (değerin olup olmadığını kontrol ederek) bir önek argümanı kullanıp kullanmadığını anlatabileceğinizi vurgulayın nil.
Drew

7

@ Kaushalmodi'nin cevabına (ve kullanışlı test senaryosuna) biraz daha detay eklemek için:

Ham argüman, universal-argumentve ile sağlanan argümanları ayırt etmenizi sağlar digit-argument.

Sayısal bir önek argümanı ile, evrensel argümanı C-u4 (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-uve C-4farklı:

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.