22.12 Аргументы команд префикса

Большинство команд Emacs могут использовать аргумент префикса, число, указанное перед самой командой. (Не путайте аргументы префикса с префиксными клавишами.) Аргумент префикса всегда представляется значением, которое может быть nil, что означает, что в настоящее время нет аргумента префикса. Каждая команда может использовать аргумент префикса или игнорировать его.

Существуют два представления аргумента префикса: сырое и числовое. Цикл команд редактора использует сырое представление внутренне, как и переменные Lisp, хранящие эту информацию, но команды могут запрашивать любое из представлений.

Ниже приведены возможные значения сырого аргумента префикса:

Мы иллюстрируем эти возможности, вызывая следующую функцию с различными префиксами:

(defun display-prefix (arg)
  "Отображает значение сырого аргумента префикса."
  (interactive "P")
  (message "%s" arg))

Ниже приведены результаты вызова display-prefix с различными сырыми аргументами префикса:

        M-x display-prefix  -| nil

C-u     M-x display-prefix  -| (4)

C-u C-u M-x display-prefix  -| (16)

C-u 3   M-x display-prefix  -| 3

M-3     M-x display-prefix  -| 3      ; (То же, что и C-u 3.)

C-u -   M-x display-prefix  -| -

M--     M-x display-prefix  -| -      ; (То же, что и C-u -.)

C-u - 7 M-x display-prefix  -| -7

M-- 7   M-x display-prefix  -| -7     ; (То же, что и C-u -7.)

Emacs использует две переменные для хранения аргумента префикса: prefix-arg и current-prefix-arg. Команды, такие как universal-argument, которые устанавливают аргументы префикса для других команд, хранят их в prefix-arg. В отличие от этого, current-prefix-arg передает аргумент префикса текущей команде, поэтому установка его не влияет на аргументы префикса для будущих команд.

Обычно команды указывают, какое представление использовать для аргумента префикса — числовое или сырое — в спецификации interactive. (См. Использование interactive.) Альтернативно, функции могут напрямую смотреть на значение аргумента префикса в переменной current-prefix-arg, но это менее чисто.

Функция: prefix-numeric-value arg

Эта функция возвращает числовое значение допустимого сырого аргумента префикса arg. Аргумент может быть символом, числом или списком. Если это nil, возвращается значение 1; если это -, возвращается значение -1; если это число, возвращается это число; если это список, возвращается CAR этого списка (который должен быть числом).

Переменная: current-prefix-arg

Эта переменная хранит сырой аргумент префикса для текущей команды. Команды могут проверять его напрямую, но обычный способ доступа к нему — это (interactive "P").

Переменная: prefix-arg

Значение этой переменной — это сырой аргумент префикса для следующей команды редактирования. Команды, такие как universal-argument, которые указывают аргументы префикса для следующей команды, работают путем установки этой переменной.

Переменная: last-prefix-arg

Значение сырого аргумента префикса, использованное предыдущей командой.

Следующие команды существуют для настройки аргументов префикса для следующей команды. Не вызывайте их по какой-либо другой причине.

Команда: universal-argument

Эта команда считывает ввод и указывает аргумент префикса для следующей команды. Не вызывайте эту команду сами, если не знаете, что делаете.

Команда: digit-argument arg

Эта команда добавляет к аргументу префикса для следующей команды. Аргумент arg — это сырой аргумент префикса, как он был до этой команды; он используется для вычисления обновленного аргумента префикса. Не вызывайте эту команду сами, если не знаете, что делаете.

Команда: negative-argument arg

Эта команда добавляет к числовому аргументу следующей команды. Аргумент arg — это сырой аргумент префикса, как он был до этой команды; его значение инвертируется для формирования нового аргумента префикса. Не вызывайте эту команду сами, если не знаете, что делаете.