21.3 Чтение объектов Lisp с помощью Minibuffer

В этом разделе описываются функции для чтения объектов Lisp с помощью minibuffer.

Функция: read-minibuffer prompt &optional initial

Эта функция считывает объект Lisp с помощью minibuffer и возвращает его без вычисления. Аргументы prompt и initial используются так же, как в read-from-minibuffer.

Это упрощенный интерфейс к функции read-from-minibuffer:

(read-minibuffer prompt initial)
≡
(let (minibuffer-allow-text-properties)
  (read-from-minibuffer prompt initial nil t))

Вот пример, в котором мы предоставляем строку "(testing)" в качестве начального ввода:

(read-minibuffer
 "Введите выражение: " (format "%s" '(testing)))

;; Вот как отображается minibuffer:

---------- Буфер: Minibuffer ----------
Введите выражение: (testing)∗
---------- Буфер: Minibuffer ----------

Пользователь может нажать RET немедленно, чтобы использовать начальный ввод в качестве значения по умолчанию, или может отредактировать ввод.

Функция: eval-minibuffer prompt &optional initial

Эта функция считывает выражение Lisp с помощью minibuffer, вычисляет его, а затем возвращает результат. Аргументы prompt и initial используются так же, как в read-from-minibuffer.

Эта функция просто вычисляет результат вызова read-minibuffer:

(eval-minibuffer prompt initial)
≡
(eval (read-minibuffer prompt initial))
Функция: edit-and-eval-command prompt form

Эта функция считывает выражение Lisp в minibuffer, вычисляет его, а затем возвращает результат. Разница между этой командой и eval-minibuffer в том, что здесь начальный form не является необязательным и рассматривается как объект Lisp, который должен быть преобразован в представленное для печати представление, а не как текстовая строка. Он печатается с помощью prin1, поэтому, если это строка, символы двойных кавычек (‘"’) появляются в начальном тексте. См. Функции вывода.

В следующем примере мы предлагаем пользователю выражение с начальным текстом, который уже является допустимой формой:

(edit-and-eval-command "Пожалуйста, отредактируйте: " '(forward-word 1))

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

---------- Буфер: Minibuffer ----------
Пожалуйста, отредактируйте: (forward-word 1)∗
---------- Буфер: Minibuffer ----------

Нажатие RET сразу же выведет minibuffer и вычислит выражение, тем самым перемещая точку вперед на одно слово.