원시 접두사 인수는 무엇입니까? (대화 형 대문자 P)


9

그리고 그들은 무엇을 위해 사용될 수 있습니까?

(interactive "p")universal argument오른쪽 에서 수치적인 주장을 합니까? 그리고 보편적 인 주장은 어느 쪽의 방식 (interactive "P")일까? 자본 은 무엇을 하는가?

답변:


11

사람들이 여기에 이맥스 자신의 설명에 대한 링크를 제공하지 않고 이것을 설명했다고 믿기가 어렵습니다.

"이맥스에게 물어보세요!":, 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을 가짐)-많은 다른 특징들.

    그러나 가장 중요한 차이점은 nilvs. 비- nil: 많은 명령이 사용자가 접두사 arg를 사용하는지 여부에 따라 다르게 작동합니다.

  • "숫자" 접두사 인수는 정말 기능하는 것이 바로 값 prefix-numeric-value을 반환 원시 접두사 인수에 적용. IOW는 실제 원시 사용자 상호 작용에서 정수로의 매핑으로 생각하는 것이 가장 좋습니다.

    그것은 사용자가 실제로 접두사 인수를 사용하는지 여부 국번없이 인수의 기본값은 정수 1로 매핑하기 때문에 사용을하지 것처럼, 당신에게 말할 수없는 C-u 1, M-1또는 C-1.


9

원시 접두사 대화식 코드 "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"기본 인자가되고 싶어 여부 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.

감사. 나는 때때로 얻는 nil것보다 낫다는 것을 1알지만, 랩을 갖는 것이 랩핑되지 않은 것보다 int바람직 하지는 않다 int. (btw 15 포인트를 얻을 때까지 공감할 수 없습니다).
24HrRevengeTherapist

@ 24HrRevengeTherapist : 방금 투표를 마쳤습니다. 마법의 15 점을 넘었습니다. 나가서 당신을 돕는 아이템에 대해 투표하십시오!
Dan

래핑되지 않은 정수와 래핑되지 않은 정수에 관한 것이 아닙니다. 정수에 관한 것이 아닙니다. 그리고 @kaushalmodi의 +1은 사용자가 원시 arg를 사용하여 (값이 있는지 여부를 확인하여) 접두사 arg를 사용했는지 여부를 알 수 있음을 강조합니다 nil.
Drew

7

@kaushalmodi의 답변 (및 유용한 테스트 사례)에 조금 더 자세히 설명하십시오.

원시 인수는 제공된 인수를 구별 할 수 있습니다 universal-argumentdigit-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 번째 킬을 다시 삽입하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.