답변:
사람들이 여기에 이맥스 자신의 설명에 대한 링크를 제공하지 않고 이것을 설명했다고 믿기가 어렵습니다.
Emacs 매뉴얼에서 node Arguments 입니다.
Elisp 매뉴얼에서 node Prefix Command Arguments 노드 .
"이맥스에게 물어보세요!":, C-h i
매뉴얼을 선택하십시오i prefix argument RET
.
간단히 말해서, 여기에 다른 답변으로 충분히 언급되어 있지만 매뉴얼에 자세히 설명되어 있습니다.
"원시" 접두어 인수는 다른 종류의 리스프 값을 제공하고, 특히 그 구별 은 사용자가 실제로 사용 여부 (모든 종류의) 접두사 인수.
이를 이용하여, 프로그램이 사용자가 {중 하나를 사용할지 여부를 구분할 수 -
, 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. 비- nil
: 많은 명령이 사용자가 접두사 arg를 사용하는지 여부에 따라 다르게 작동합니다.
"숫자" 접두사 인수는 정말 기능하는 것이 바로 값 prefix-numeric-value
을 반환 원시 접두사 인수에 적용. IOW는 실제 원시 사용자 상호 작용에서 정수로의 매핑으로 생각하는 것이 가장 좋습니다.
그것은 사용자가 실제로 접두사 인수를 사용하는지 여부 국번없이 인수의 기본값은 정수 1로 매핑하기 때문에 사용을하지 것처럼, 당신에게 말할 수없는 C-u 1
, M-1
또는 C-1
.
원시 접두사 대화식 코드 "P"
가 사용되면 인수는 그대로 전달되는 반면 "p"
인수는 숫자로 변환됩니다.
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"
또는 "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의 답변 (및 유용한 테스트 사례)에 조금 더 자세히 설명하십시오.
원시 인수는 제공된 인수를 구별 할 수 있습니다 universal-argument
와 digit-argument
.
숫자 접두사 arg를 사용하면 범용 인수 C-u
를 접두사 arg 4 (예 :) 와 구별 할 수 없습니다 C-4
. : 원시 인수로이 다릅니다 (4)
대 4
.
에도 동일하게 적용됩니다 negative-argument
. 원시 인수로서 당신은 구별 할 수 C--
및 C-- 1
: 첫 번째는 당신을 줄 것이다 -
두번째 동안 -1
. 숫자 인수로 변환하면 둘 다입니다 -1
.
따라서 원시 인수를 사용하면 더 많은 가치를 얻을 수 있다는 이점이 있습니다. 인수 지정 방법에 따라 다르게 동작하는 명령을 작성할 수 있습니다.
예를 들어에 대한 doc 문자열을 살펴보십시오 yank
. 이 명령은 다음 C-u
과 같이 취급합니다 C-4
.
Cu를 인수로 사용하여 시작 부분을 가리키고 끝 부분을 표시하십시오. 인수 N을 사용하여 가장 최근의 N 번째 킬을 다시 삽입하십시오.
nil
것보다 낫다는 것을1
알지만, 랩을 갖는 것이 랩핑되지 않은 것보다int
바람직 하지는 않다int
. (btw 15 포인트를 얻을 때까지 공감할 수 없습니다).