І для чого їх можна використовувати?
(interactive "p")приймає числовий аргумент universal argumentсправа? І універсальний аргумент - це лише інт, інакше, і що робить капітал (interactive "P")?
І для чого їх можна використовувати?
(interactive "p")приймає числовий аргумент universal argumentсправа? І універсальний аргумент - це лише інт, інакше, і що робить капітал (interactive "P")?
Відповіді:
Важко повірити, що люди описали це тут, не даючи також посилання на власні описи цього Emacs:
У посібнику Emacs введіть аргументи на вузол .
У посібнику Elisp введіть префікс командних аргументів .
"Запитайте Emacs!": C-h i Виберіть керівництво,i prefix argument RET.
Коротше кажучи, хоча це досить добре сказано в інших відповідях тут, і докладно описано в посібнику:
Аргумент "raw" префікса надає значення Lisp різного виду, і зокрема він розрізняє, чи користувач насправді використовував аргумент префікса (будь-якого типу).
З його допомогою, програма може розрізняти чи використовуватися користувач одного з { -, M--, C--} або один з { M-- 1, C-- 1, C-u -1} (обидва з яких мають той же числове значення префікс -1), і відрізнити їй? Він використовував C-u C-uабо один з { M-16, C-16, C-u 16} (обидва мають числове значення 16) - серед безлічі інших відмінностей.
Але найголовніше таке відмінність - nilпроти не- nil: багато команд діють по-різному залежно від того, користувач використовує аргумент префікса.
«Числовий» префікс аргумент дійсно тільки значення , яке функція 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. (Не можу подати заявку, поки я не отримаю 15 балів, btw).