І для чого їх можна використовувати?
(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).