Что такое необработанный префиксный аргумент? (заглавная буква P в интерактивном режиме)

9

И для чего они могут быть использованы?

(interactive "p")принимает числовой аргумент universal argumentсправа? И универсальный аргумент - это просто int в любом случае, так что же делает капитал (interactive "P")?

24HrRevengeTherapist
источник

Ответы:

11

Трудно поверить, что люди описали это здесь, не дав вам ссылки на собственные описания Emacs:

"Спросите Emacs!": C-h i Выберите руководство,i prefix argument RET.

В двух словах, хотя об этом достаточно хорошо сказано в других ответах здесь, и подробно описано в руководстве:

  • «Сырой» префикс Arg обеспечивает значения лисповские различных видов, и , в частности , он различает , действительно ли или нет пользователь использует префикс аргумент (любого вида).

    С его помощью, программа может различать ли использоваться пользователь одного из { -, M--, C--} или один из { M-- 1, C-- 1, C-u -1} (оба из которых имеют тот же числовое значение префикс -1), и отличить ли ей? Он использовал C-u C-uили один из { M-16, C-16, C-u 16} (оба имеют числовое значение 16) - среди множества других различий.

    Но самое важное такое различие - это nilне- nil: многие команды действуют по-разному в зависимости от того, использует ли пользователь префикс arg.

  • «Числовой» префикс аргумент действительно только значение , которое функция prefix-numeric-valueвозвращает при применении к сырой приставке арг. Таким образом, это лучше всего рассматривать как отображение фактического необработанного взаимодействия с пользователем в целое число.

    Он не может сказать вам , действительно ли пользователь использовал префикс аргумент, так как по умолчанию без префикса аргумента сопоставляется с целым числом 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"является ли вы хотите, чтобы аргумент по умолчанию был 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чем 1, но никогда не бывает, что иметь завернутую упаковку intпредпочтительнее, чем развернутую int. (Не могу проголосовать до 15 баллов, кстати).
24HRevengeTherapist
@ 24HrRevengeTherapist: просто за тебя проголосовали, и ты преодолел магический порог в 15 баллов. Выйди и сделай голосование по пунктам, которые тебе помогут!
Дан
Это не о завернутых против развернутых целых. Это вообще не о целых. И +1 к @kaushalmodi за то, что вы подчеркиваете, что вы можете сказать, использовал ли пользователь префиксный аргумент arg, только используя необработанный аргумент arg (проверяя, является ли значение значением nil).
Дрю
7

Просто добавьте немного подробностей в ответ @ kaushalmodi (и полезный тестовый пример):

Необработанный аргумент позволяет вам различать аргументы, поставляемые с universal-argumentи digit-argument.

С числовым префиксом arg невозможно отличить универсальный аргумент C-uот префикса arg, равного 4 (т.е. C-4). С сырым аргументом они различны: (4)против 4.

То же самое относится и к negative-argument. В качестве исходного аргумента вы можете различить C--и C-- 1: первое даст вам, -а второе -1. При преобразовании в числовой аргумент они оба будут -1.

Таким образом, преимущество использования необработанного аргумента состоит в том, что он дает вам больше возможных значений. Вы можете писать команды, которые ведут себя по-разному, в зависимости от того, как указан аргумент.

В качестве примера рассмотрим строку документа для yank. Эта команда обрабатывает C-uи по- C-4разному:

Используя только Cu в качестве аргумента, поставьте точку в начале и отметьте в конце. С аргументом N повторно вставьте N-е самое последнее уничтожение.

glucas
источник