Що таке аргумент необробленого префікса? (інтерактивний капітал P)


9

І для чого їх можна використовувати?

(interactive "p")приймає числовий аргумент universal argumentсправа? І універсальний аргумент - це лише інт, інакше, і що робить капітал (interactive "P")?

Відповіді:


11

Важко повірити, що люди описали це тут, не даючи також посилання на власні описи цього Emacs:

"Запитайте 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.


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 балів, btw).
24HrRevengeTherapist

@ 24HrRevengeTherapist: якраз ви проголосували, переходячи вас за магічний поріг у 15 балів. Вийдіть і зробіть кілька голосів на тему, яка допоможе вам!
Дан

Йдеться не про загорнуті проти розгорнуті вставки. Це зовсім не про інтів. І +1 до @kaushalmodi, щоб підкреслити, що ви можете сказати, чи користувач використовував префікс arg тільки з використанням необробленого аргументу (перевіривши, чи є це значення nilчи ні).
Дрю

7

Просто для додання трохи детальніше до відповіді @ 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-е останнє вбивство.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.