И для чего они могут быть использованы?
(interactive "p")
принимает числовой аргумент universal argument
справа? И универсальный аргумент - это просто int в любом случае, так что же делает капитал (interactive "P")
?
И для чего они могут быть использованы?
(interactive "p")
принимает числовой аргумент universal argument
справа? И универсальный аргумент - это просто int в любом случае, так что же делает капитал (interactive "P")
?
Ответы:
Трудно поверить, что люди описали это здесь, не дав вам ссылки на собственные описания Emacs:
В руководстве по Emacs, узел Аргументы .
В руководстве Elisp, Аргументы команды Prefix узла .
"Спросите 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
.
При использовании необработанного префикса « Интерактивный код» "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
.
Таким образом, преимущество использования необработанного аргумента состоит в том, что он дает вам больше возможных значений. Вы можете писать команды, которые ведут себя по-разному, в зависимости от того, как указан аргумент.
В качестве примера рассмотрим строку документа для yank
. Эта команда обрабатывает C-u
и по- C-4
разному:
Используя только Cu в качестве аргумента, поставьте точку в начале и отметьте в конце. С аргументом N повторно вставьте N-е самое последнее уничтожение.
nil
чем1
, но никогда не бывает, что иметь завернутую упаковкуint
предпочтительнее, чем развернутуюint
. (Не могу проголосовать до 15 баллов, кстати).