そして、それらは何に使用できますか?
(interactive "p")
universal argument
右から数値引数を取る?そして、普遍的な議論はどちらにせよ単なるintなので、資本(interactive "P")
は何をしますか?
そして、それらは何に使用できますか?
(interactive "p")
universal argument
右から数値引数を取る?そして、普遍的な議論はどちらにせよ単なるintなので、資本(interactive "P")
は何をしますか?
回答:
Emacs自身の説明へのリンクも提供せずに、ここで説明されているとは信じがたいです。
Emacsのマニュアルでは、ノードの引数。
Elispマニュアルでは、node Prefix Command Argumentsです。
"Emacsに聞いてください!":、 C-h i
マニュアルを選択してくださいi prefix argument RET
。
一言で言えば、これはここの他の答えで十分に述べられており、マニュアルで詳細に説明されています:
「生の」接頭argは、異なる種類のLispの値を提供し、特にそれが識別するユーザが実際に使用されたか否か(あらゆる種類の)接頭引数。
それを使用して、プログラムは、ユーザが{の使用かを区別することができ-
、M--
、C--
{}またはのいずれかをM-- 1
、 C-- 1
、C-u -1
}(の同じ数字の接頭辞値を有する両方とも-1
)、およびSかを区別?彼が使用C-u C-u
または{の一つM-16
、C-16
、C-u 16
}(両方とも数値16を持っています)-他の多くの区別の中で。
しかし、そのような最も重要な違いはnil
vsとnon- nil
です。多くのコマンドは、ユーザーが接頭辞argを使用するかどうかによって動作が異なります。
「数字」接頭引数は、実際に機能することを単なる値でprefix-numeric-value
返しますが、生の前置引数に適用されます。IOW、それは実際の生のユーザー操作から整数へのマッピングと考えるのが一番です。
これは、接頭辞なし引数のデフォルトは整数1にマップするための使用を同じように、ユーザが実際に接頭引数を使用するかどうかを伝えることはできませんC-u 1
、M-1
またはC-1
。
生の接頭辞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"
、デフォルトの引数を1
orにするかどうかです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の回答(および便利なテストケース)にもう少し詳細を追加するだけです。
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番目の最後のキルを再挿入します。
nil
より好ましい1
ということは決してありません。(15ポイントを獲得するまで賛成できません)。int
int