Чтение текстовых строк с помощью минибуфера
Самый простой примитив для ввода в минибуфере — read-from-minibuffer, который можно использовать для чтения строки или объекта Lisp в текстовой форме. Функция read-regexp используется для чтения регулярных выражений (см. Регулярные выражения), представляющих собой особый вид строк. Также существуют специализированные функции для чтения команд, переменных, имён файлов и т. д. (см. Завершение ввода).
В большинстве случаев не следует вызывать функции ввода минибуфера в середине функции Lisp. Вместо этого выполняйте весь ввод в минибуфере при чтении аргументов команды, в спецификации interactive. См. Определение команд.
- Функция: read-from-minibuffer prompt &optional initial keymap read history default inherit-input-method
-
Эта функция — наиболее универсальный способ получить ввод из минибуфера. По умолчанию она принимает произвольный текст и возвращает его в виде строки; однако, если read не равен
nil, она используетreadдля преобразования текста в объект Lisp (см. Функции ввода).Сначала эта функция активирует минибуфер и отображает его с prompt (который должен быть строкой) в качестве подсказки. Затем пользователь может редактировать текст в минибуфере.
Когда пользователь вводит команду выхода из минибуфера,
read-from-minibufferформирует возвращаемое значение из текста в минибуфере. Обычно она возвращает строку, содержащую этот текст. Однако, если read не равенnil,read-from-minibufferчитает текст и возвращает полученный объект Lisp без вычисления. (Сведения о чтении см. в разделе Функции ввода.)Аргумент default задаёт значения по умолчанию, доступные через команды работы с историей. Это должна быть строка, список строк или
nil. Строка или строки становятся «будущей историей» минибуфера, доступной пользователю с помощью M-n. Кроме того, если вызов предоставляет завершение ввода (например, с помощью аргумента keymap), варианты завершения добавляются в «будущую историю», когда значения в default исчерпаны с помощью M-n; см. minibuffer-default-add-function.Если read не равен
nil, то default также используется как ввод дляread, если пользователь вводит пустую строку. Если default — список строк, в качестве ввода используется первая строка. Если default равенnil, пустой ввод приводит к ошибкеend-of-file. Однако в обычном случае (когда read равенnil)read-from-minibufferигнорирует default, если пользователь вводит пустую строку, и возвращает пустую строку,"". В этом отношении она отличается от всех остальных функций ввода минибуфера в этой главе.Если keymap не равен
nil, эта карта клавиш используется в качестве локальной карты клавиш минибуфера. Если keymap не указан или равенnil, в качестве карты клавиш используется значениеminibuffer-local-map. Указание карты клавиш — наиболее важный способ настроить минибуфер для различных задач, например для завершения ввода.Аргумент history задаёт переменную списка истории, используемую для сохранения ввода и работы команд истории в минибуфере. По умолчанию используется
minibuffer-history. Если history — символt, история не сохраняется. При необходимости можно также указать начальную позицию в списке истории. См. История минибуфера.Если переменная
minibuffer-allow-text-propertiesне равнаnilи привязана через let или локальна для буфера минибуфера, возвращаемая строка включает все свойства текста, имевшиеся в минибуфере. В противном случае при возврате значения все свойства текста удаляются. (По умолчанию эта переменная равнаnil.)Свойства текста в
minibuffer-prompt-propertiesприменяются к подсказке. По умолчанию этот список свойств задаёт оформление, используемое для подсказки. Если оно задано, то добавляется в конец списка оформлений и объединяется перед отображением.Если пользователь хочет полностью управлять видом подсказки, удобнее всего указать оформление
defaultв конце всех списков оформлений. Например:(read-from-minibuffer (concat (propertize "Bold" 'face '(bold default)) (propertize " and normal: " 'face '(default))))
Если аргумент inherit-input-method не равен
nil, минибуфер наследует метод ввода (см. Методы ввода) и значениеenable-multibyte-characters(см. Представление текста) из буфера, который был текущим до входа в минибуфер.Использование initial в основном считается устаревшим; рекомендуется применять значение, отличное от
nil, только вместе с указанием конс-ячейки для history. См. Начальный ввод.
- Функция: read-string prompt &optional initial history default inherit-input-method
-
Эта функция читает строку из минибуфера и возвращает её. Аргументы prompt, initial, history и inherit-input-method используются так же, как в
read-from-minibuffer. Используется карта клавишminibuffer-local-map.Необязательный аргумент default используется так же, как в
read-from-minibuffer, за исключением того, что, если он не равенnil, он также задаёт значение по умолчанию, возвращаемое при пустом вводе пользователя. Как и вread-from-minibuffer, это должна быть строка, список строк илиnil, что эквивалентно пустой строке. Если default — строка, она и является значением по умолчанию. Если это список строк, значением по умолчанию служит первая строка. (Все эти строки доступны пользователю в «будущей истории минибуфера».)Эта функция работает, вызывая функцию
read-from-minibuffer:(read-string prompt initial history default inherit) ≡ (let ((value (read-from-minibuffer prompt initial nil nil history default inherit))) (if (and (equal value "") default) (if (consp default) (car default) default) value))Если у вас есть длинная строка (например, состоящая из нескольких строк), которую нужно отредактировать,
read-stringможет оказаться не лучшим вариантом. В таком случае удобнее открыть новый обычный буфер, в котором пользователь сможет редактировать строку; для этого можно использовать функциюread-string-from-buffer.
- Функция: read-regexp prompt &optional defaults history
-
Эта функция читает регулярное выражение в виде строки из минибуфера и возвращает его. Если строка подсказки минибуфера prompt не заканчивается символом ‘:’ (за которым может следовать пробел), функция добавляет в конец ‘: ’, предваряя его возвращаемым значением по умолчанию (см. ниже), если оно не пусто.
Необязательный аргумент defaults задаёт значение по умолчанию, возвращаемое при пустом вводе пользователя. Он должен быть одним из следующих значений: строка;
nil, что эквивалентно пустой строке; список строк; или символ.Если defaults — символ,
read-regexpпроверяет значение переменнойread-regexp-defaults-function(см. ниже) и, если оно не равноnil, использует его вместо defaults. В этом случае значение должно быть одним из следующих:-
regexp-history-last, что означает использование первого элемента соответствующего списка истории минибуфера (см. ниже). - Функция без аргументов, возвращающая значение (которое должно быть
nil, строкой или списком строк), используемое в качестве значения defaults.
Теперь
read-regexpгарантирует, что результат обработки defaults будет списком (то есть, если значение равноnilили является строкой, оно преобразуется в список из одного элемента). Затемread-regexpдобавляет к этому списку несколько потенциально полезных вариантов ввода. Это:- Слово или символ в точке.
- Последнее регулярное выражение, использованное при инкрементальном поиске.
- Последняя строка, использованная при инкрементальном поиске.
- Последняя строка или шаблон, использованные в командах замены с запросом подтверждения.
Теперь функция располагает списком регулярных выражений, который передаёт в
read-from-minibufferдля получения ввода пользователя. Первый элемент списка используется как значение по умолчанию при пустом вводе. Все элементы списка доступны пользователю в виде списка «будущей истории минибуфера» (см. будущий список в Руководстве GNU Emacs).Необязательный аргумент history, если он не равен
nil, — это символ, задающий используемый список истории минибуфера (см. История минибуфера). Если он не указан или равенnil, по умолчанию используется список историиregexp-history.Пользователь может использовать команду M-s c, чтобы указать, следует ли учитывать регистр. Если пользователь воспользовался этой командой, возвращаемой строке будет задано свойство текста
case-foldсо значениемfoldилиinhibit-fold. Вызывающаяread-regexpсторона сама должна использовать это значение; для этого предусмотрена вспомогательная функцияread-regexp-case-fold-search. Типичный пример использования может выглядеть так:(let* ((regexp (read-regexp "Search for: ")) (case-fold-search (read-regexp-case-fold-search regexp))) (re-search-forward regexp)) -
- Пользовательская настройка: read-regexp-defaults-function
-
Функция
read-regexpможет использовать значение этой переменной для определения списка регулярных выражений по умолчанию. Если значение переменной не равноnil, оно должно быть одним из следующих:- Символ
regexp-history-last. - Функция без аргументов, возвращающая
nil, строку или список строк.
Подробное описание использования этих значений см. выше, в разделе
read-regexp. - Символ
- Переменная: minibuffer-allow-text-properties
-
Если эта переменная равна
nil, как и задано по умолчанию, тоread-from-minibufferи все функции, выполняющие ввод в минибуфере, удаляют все свойства текста из введённых данных перед их возвратом.Однако
read-minibufferи связанные с ней функции (см. Чтение объектов Lisp с помощью минибуфера) безусловно удаляют свойства текста независимо от значения этой переменной.Если эта переменная не равна
nilи привязана через let или локальна для буфера минибуфера, тоread-from-minibuffer,read-stringи все связанные с ними функции сохраняют свойства текста. Однако функции, выполняющие ввод в минибуфере с завершением, удаляют свойствоface, сохраняя остальные свойства текста.(minibuffer-with-setup-hook (lambda () (setq-local minibuffer-allow-text-properties t)) (completing-read "String: " (list (propertize "foobar" 'face 'baz 'data 'zot)))) => #("foobar" 0 6 (data zot))В этом примере пользователь ввёл ‘foo’, а затем нажал клавишу TAB; все свойства текста сохранены, кроме свойства
face.
- Переменная: minibuffer-local-map
-
Это локальная карта клавиш, используемая по умолчанию при чтении из минибуфера. По умолчанию в ней заданы следующие привязки:
- C-j
-
exit-minibuffer - RET
-
exit-minibuffer - M-<
-
minibuffer-beginning-of-buffer - C-g
-
abort-recursive-edit - M-n
- DOWN
-
next-history-element - M-p
- UP
-
previous-history-element - M-s
-
next-matching-history-element - M-r
-
previous-matching-history-element
Переменная
minibuffer-mode-mapявляется псевдонимом этой переменной.
- Функция: read-no-blanks-input prompt &optional initial inherit-input-method
-
Эта функция читает строку из минибуфера, но не допускает пробельные символы в качестве части ввода: вместо этого такие символы завершают ввод. Аргументы prompt, initial и inherit-input-method используются так же, как в
read-from-minibuffer.Это упрощённый интерфейс к функции
read-from-minibuffer; он передаёт значение карты клавишminibuffer-local-ns-mapв качестве аргумента keymap этой функции. Поскольку карта клавишminibuffer-local-ns-mapне переназначает C-q, в строку можно вставить пробел, экранировав его.
- Переменная: minibuffer-local-ns-map
-
Эта встроенная переменная — карта клавиш, используемая в качестве локальной карты клавиш минибуфера в функции
read-no-blanks-input. По умолчанию, помимо привязок изminibuffer-local-map, в ней заданы следующие привязки:- SPC
-
exit-minibuffer - TAB
-
exit-minibuffer - ?
self-insert-and-exit
- Функция: format-prompt prompt default &rest format-args
-
Форматирует prompt со значением по умолчанию default в соответствии с переменной
minibuffer-default-prompt-format.minibuffer-default-prompt-format— это строка формата (по умолчанию ‘" (default %s)"’), задающая форматирование фрагмента «значение по умолчанию» в подсказках вида ‘"Local filename (default somefile): "’.Чтобы пользователи могли настраивать способ отображения, код, запрашивающий у пользователя значение с учётом значения по умолчанию, должен выглядеть примерно так:
(read-file-name (format-prompt "Local filename" file) nil file)
Если format-args равно
nil, prompt используется как строка-литерал. Если format-args не равноnil, prompt используется как управляющая строка формата, а prompt и format-args передаются вformat(см. Форматирование строк).Значение
minibuffer-default-prompt-formatможет быть ‘""’, и в этом случае значения по умолчанию не отображаются.Если default равен
nil, значение по умолчанию отсутствует, поэтому строка «значение по умолчанию» не включается в результат. Если default — список, не равныйnil, в подсказке используется первый элемент списка.И prompt, и
minibuffer-default-prompt-formatобрабатываются функциейsubstitute-command-keys(см. Подстановка привязок клавиш в документации).
- Переменная: read-minibuffer-restore-windows
-
Если эта настройка не равна
nil(значение по умолчанию), при выходе из минибуфера восстанавливаются конфигурации окон рамки, из которой был открыт минибуфер, и, если это другая рамка, рамки, которой принадлежит окно минибуфера. Это означает, что, например, если пользователь разделит окно во время ввода в минибуфере в той же рамке, это разделение будет отменено при выходе из минибуфера.Если эта настройка равна
nil, такое восстановление не выполняется. Поэтому упомянутое выше разделение окна сохранится после выхода из минибуфера.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-from-Minibuffer.html