21.6.2 Завершение и Minibuffer

В этом разделе описывается базовый интерфейс для чтения из minibuffer с завершением.

Функция: completing-read prompt collection &optional predicate require-match initial history default inherit-input-method

Эта функция считывает строку в minibuffer, помогая пользователю, предоставляя завершение. Она активирует minibuffer с подсказкой prompt, которая должна быть строкой.

Фактическое завершение выполняется путем передачи таблицы завершения collection и предиката завершения predicate функции try-completion (см. Базовые функции завершения). Это происходит в определенных командах, привязанных в локальных картусах клавиш, используемых для завершения. Некоторые из этих команд также вызывают test-completion. Таким образом, если predicate не является nil, он должен быть совместим с collection и completion-ignore-case. См. Определение test-completion.

См. Программируемое завершение, для подробных требований, когда collection является функцией.

Значение необязательного аргумента require-match определяет, как пользователь может выйти из minibuffer:

  • Если nil, обычные команды выхода из minibuffer работают независимо от ввода в minibuffer.
  • Если t, обычные команды выхода из minibuffer не выйдут, если ввод не завершается элементом collection.
  • Если confirm, пользователь может выйти с любым вводом, но ему будет задан вопрос о подтверждении, если ввод не является элементом collection.
  • Если confirm-after-completion, пользователь может выйти с любым вводом, но ему будет задан вопрос о подтверждении, если предыдущая команда была командой завершения (т.е. одной из команд в minibuffer-confirm-exit-commands) и результирующий ввод не является элементом collection. См. Команды Minibuffer, выполняющие завершение.
  • Если это функция, она вызывается с вводом в качестве единственного аргумента. Функция должна вернуть не-nil значение, если ввод приемлем.
  • Любое другое значение require-match ведет себя как t, за исключением того, что команды выхода не выйдут, если выполняется завершение.

Однако пустой ввод всегда разрешен, независимо от значения require-match; в этом случае completing-read возвращает первый элемент default, если это список; "", если default равен nil; или default. Строка или строки в default также доступны пользователю через команды истории (см. Команды Minibuffer). Кроме того, кандидаты завершения добавляются в «будущую историю», когда значения в default исчерпаны с помощью M-n; см. minibuffer-default-add-function.

Функция completing-read использует minibuffer-local-completion-map в качестве карты клавиш, если require-match равен nil, и использует minibuffer-local-must-match-map, если require-match не равен nil. См. Команды Minibuffer, выполняющие завершение.

Аргумент history указывает, какую переменную списка истории использовать для сохранения ввода и для команд истории minibuffer. По умолчанию это minibuffer-history. Если history является символом t, история не записывается. См. История minibuffer.

Аргумент initial в основном устарел; мы рекомендуем использовать не-nil значение только в сочетании с указанием ячейки cons для history. См. Начальный ввод. Для начального ввода используйте вместо этого default.

Если аргумент inherit-input-method не равен nil, то minibuffer наследует текущий метод ввода (см. Методы ввода) и настройку enable-multibyte-characters (см. Представления текста) из того буфера, который был активен до входа в minibuffer.

Если переменная completion-ignore-case не равна nil, завершение игнорирует регистр при сравнении ввода с возможными совпадениями. См. Базовые функции завершения. В этом режиме работы predicate также должен игнорировать регистр, иначе вы получите неожиданные результаты.

Вот пример использования completing-read:

(completing-read
 "Complete a foo: "
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 nil t "fo")

;; После вычисления предыдущего выражения,
;;   в minibuffer появится следующее:

---------- Buffer: Minibuffer ----------
Complete a foo: fo∗
---------- Buffer: Minibuffer ----------

Если пользователь затем вводит DEL DEL b RET, completing-read возвращает barfoo.

Функция completing-read привязывает переменные для передачи информации командам, которые фактически выполняют завершение. Они описаны в следующем разделе.

Переменная: completing-read-function

Значение этой переменной должно быть функцией, которую completing-read вызывает для выполнения своей работы. Она должна принимать те же аргументы, что и completing-read. Эту функцию можно привязать к другой функции, чтобы полностью переопределить обычное поведение completing-read.

Если вам нужно запросить у пользователя несколько строк, например, несколько элементов списка или несколько параметров (например, пользователь, хост и порт) соединения, вы можете использовать completing-read-multiple. Он позволяет вводить несколько строк, разделенных строкой-разделителем (по умолчанию, табуляция и запятые; настройте crm-separator, чтобы изменить это), и обеспечивает завершение для каждой отдельной строки, которую вводит пользователь. Он возвращает введенные строки в виде списка.