生の前置引数とは何ですか?(インタラクティブの大文字P)


9

そして、それらは何に使用できますか?

(interactive "p")universal argument右から数値引数を取る?そして、普遍的な議論はどちらにせよ単なるintなので、資本(interactive "P")は何をしますか?

回答:


11

Emacs自身の説明へのリンクも提供せずに、ここで説明されているとは信じがたいです。

"Emacsに聞いてください!":、 C-h iマニュアルを選択してくださいi prefix argument RET

一言で言えば、これはここの他の答えで十分に述べられており、マニュアルで詳細に説明されています:

  • 「生の」接頭argは、異なる種類のLispの値を提供し、特にそれが識別するユーザが実際に使用されたか否か(あらゆる種類の)接頭引数。

    それを使用して、プログラムは、ユーザが{の使用かを区別することができ-M--C--{}またはのいずれかをM-- 1C-- 1C-u -1}(の同じ数字の接頭辞値を有する両方とも-1)、およびSかを区別?彼が使用C-u C-uまたは{の一つM-16C-16C-u 16}(両方とも数値16を持っています)-他の多くの区別の中で。

    しかし、そのような最も重要な違いはnilvsとnon- nilです。多くのコマンドは、ユーザーが接頭辞argを使用するかどうかによって動作が異なります。

  • 「数字」接頭引数は、実際に機能することを単なる値でprefix-numeric-value返しますが、生の前置引数に適用されます。IOW、それは実際の生のユーザー操作から整数へのマッピングと考えるのが一番です。

    これは、接頭辞なし引数のデフォルトは整数1にマップするための使用を同じように、ユーザが実際に接頭引数を使用するかどうかを伝えることはできませんC-u 1M-1またはC-1


9

生の接頭辞Interactive Code "P"を使用すると、引数はそのまま渡されますが"p"、argは数値に変換されます。

elispの下に評価した後、試してみC-u M-x my/fn-with-num-argた後やC-u M-x my/fn-with-raw-argので、違いを確認するためにC-u、リストの引数を渡します(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)
;; .

また、デフォルト引数1の数値引数の("p")は、デフォルトのnil又は()生の引数の("P")。

私の数セント:時々、"p"or を使用するかどうかの決定要因は"P"、デフォルトの引数を1orにするかどうかです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より好ましい1ということは決してありません。(15ポイントを獲得するまで賛成できません)。intint
24HrRevengeTherapist 2015

@ 24HrRevengeTherapist:魔法の15ポイントのしきい値を超えて、投票しました。外に出て、あなたに役立つアイテムに投票してください!
ダン

ラップされた整数とラップされていない整数についてではありません。intの問題ではありません。そして、ユーザーが生の引数を使用することによってのみ(値がそうであるかどうかをチェックすることによって)接頭引数を使用したかどうかを区別できることを強調するために、@ kaushalmodiに+1しますnil
2015

7

@kaushalmodiの回答(および便利なテストケース)にもう少し詳細を追加するだけです。

raw引数を使用すると、universal-argumentおよびで提供される引数を区別できますdigit-argument

数値の前置引数では、ユニバーサル引数C-uを4の前置引数(つまりC-4)と区別する方法はありません。生の引数では、これらは異なります:(4)vs 4

同じことがにも当てはまりますnegative-argument。生の引数として、あなたは区別することができますC--C-- 1:最初はあなたを与えるだろう-秒ながら-1。数値引数に変換すると、両方ともになります-1

したがって、生の引数を使用する利点は、可能な値が増えることです。引数の指定方法によって動作が異なるコマンドを記述できます。

例として、のドキュメント文字列を見てみましょうyank。このコマンドは別の扱いC-uをしC-4ます:

Cuだけを引数として、最初にポイントを置き、最後にマークを付けます。引数Nを使用して、N番目の最後のキルを再挿入します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.