Минибуфер

Минибуфер используется командами Emacs для чтения более сложных, чем простое число, аргументов. Аргументами минибуфера могут быть имена файлов, имена буферов, имена функций Лиспа, имена команд Emacs и много других вещей в зависимости от считывающих аргумент команд. Для редактирования аргументов в минибуфере могут быть использованы обычные команды редактирования Emacs.

Когда вы используете минибуфер, он появляется в эхо-области, и туда передвигается курсор терминала. Начало строки минибуфера показывает подсказку, которая говорит, какой ввод вы должны давать, и как он будет применен. Часто подсказка происходит от имени команды, для которой нужен этот аргумент. Подсказка обычно кончается двоеточием.

Иногда в круглых скобках после двоеточия появляется аргумент по умолчанию; он тоже является частью подсказки. Значение по умолчанию будет использовано как значение аргумента, если вы вводите пустой аргумент (например, просто наберете RET). К примеру, команды, считывающие имена буферов, всегда показывают значение, принимаемое по умолчанию; оно является именем буфера, который будет использован в дальнейшем, если вы просто наберете RET.

Простейший способ дать аргумент минибуферу -- набрать желаемый текст и завершить его RET, клавишей для выхода из минибуфера. Вы можете отменить команду, которая запрашивает аргумент, и выйти из минибуфера, набрав C-g.

Минибуфер использует пространство экрана, отведенное под эхо-область, но это может противоречить другим способам использования эхо-области в Emacs. Emacs обрабатывает такие конфликты следующим образом:

  • Если какая-то команда получает ошибку, пока вы находитесь в минибуфере, то это не отменяет минибуфер. Однако, эхо-область нужна для сообщения об ошибке, и поэтому сам минибуфер прячется на время. Он возвращается через несколько секунд или сразу же, как только вы наберете что-нибудь.
  • Если в минибуфере вы используете команду, чьей целью является печать сообщения в эхо-области, такую как C-x = , то сообщение отображается как обычно, а минибуфер прячется на время. Он возвращается через несколько секунд, или как только вы наберете что-то еще.
  • Когда используется минибуфер, эхо набираемых знаков не производится.

Минибуфер для имён файлов

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

Find File: /u2/emacs/src/

где `Find File: ' -- подсказка. Напечатав buffer.c, вы задаёте файл `/u2/emacs/buffer.c'. Чтобы найти файлы в соседних каталогах, используется ..; таким образом, если вы наберете ../lisp/simple.el, то получите файл с именем `/u2/emacs/lisp/simple.el'. Или вы можете уничтожить ненужное вам имя каталога с помощью M-DEL (смотрите раздел Слова).

Если вам не нужно ничего из каталога по умолчанию, вы можете уничтожить его с помощью C-a C-k. Но в этом нет необходимости; вы можете просто проигнорировать его. Вставьте после каталога по умолчанию абсолютное имя файла, начинающееся с косой черты или тильды. Например, чтобы задать файл `/etc/termcap', просто вставьте это имя, при этом вы получите в минибуфере такую строку:

Find File: /u2/emacs/src//etc/termcap

GNU Emacs придает двойной косой черте особое назначение (обычно нет смысла писать две косые черты подряд): они означают "пропустить все перед второй косой чертой в паре". Таким образом, `/u2/emacs/src/' в предыдущем примере будет проигнорировано, и вы получите файл `/etc/termcap'.

Если вы установите insert-default-directory равной nil, каталог по умолчанию не появляется в минибуфере. Таким образом, минибуфер появляется пустым. Но набираемое вами имя, если оно относительно, по-прежнему интерпретируется с учетом того же каталога по умолчанию.

Редактирование в минибуфере

Минибуфер -- это буфер Emacs (хотя и своеобразный), и обычные команды Emacs годятся для редактирования текста вводимых вами аргументов.

Так как RET в минибуфере определен для выхода, вы не можете использовать его для вставки ограничителя новой строки в минибуфер. Чтобы вставить перевод строки, введите C-o или C-q C-j. (Напомним, что ограничитель новой строки -- это на самом деле знак control-J.)

Минибуфер имеет свое собственное окно, которое всегда присутствует на экране, но действует так, как если бы его не было, когда минибуфер не используется. Когда же минибуфер используется, его ничем не отличается от всех остальных окон; вы можете перейти в другое окно с помощью C-x o, отредактировать текст в других окнах и может быть даже обратиться к нескольким файлам перед возвращением в минибуфер для представления аргумента. Вы можете уничтожить текст в другом окне, вернуться в окно минибуфера и затем восстановить этот текст, чтобы использовать его в аргументе. Смотрите раздел Множество окон.

Однако существуют некоторые ограничения на использование окна минибуфера. Вы не можете переключить в нем буферы -- минибуфер и его окно связаны вместе. Точно также, вы не можете поделить или уничтожить окно минибуфера. Но вы можете сделать его выше обычным способом с помощью C-x ^. Если вы включите режим Resize-Minibuffer, то окно минибуфера по необходимости увеличивается вертикально, чтобы вместить текст, который вы поместили в минибуфер. Используйте M-x resize-minibuffer-mode, чтобы включить или выключить этот второстепенный режим (смотрите раздел Второстепенные режимы).

Прокрутка работает в окне минибуфера особым образом. Когда высота минибуфера равна только одной строке, и он содержит длинную строку текста, которая не уместилась бы не экране, с помощью прокрутки автоматически поддерживается перекрытие одной строки продолжения другой на определённое число знаков. Переменная minibuffer-scroll-overlap указывает число знаков, на которое нужно делать перекрытие; по умолчанию это 20.

Если во время нахождения в минибуфере вы запускаете команду, которая показывает в другом окне справочный текст любого вида, вы можете использовать в минибуфере команду C-M-v для прокрутки этого окна. Это свойство вступает в действие, если попытка получить завершение в минибуфере даёт вам список возможных вариантов. Смотрите раздел Использование других окон.

Emacs обычно запрещает большинство команд, использующих минибуфер, когда минибуфер активен. Это правило было введено, чтобы рекурсивные минибуферы не запутывали начинающих пользователей. Если вы хотите получить возможность использования таких команд в минибуфере, установите переменную enable-recursive-minibuffers не равной nil.

Завершение

Для ввода значений некоторых видов аргументов вы можете использовать завершение. Завершение означает, что вы набираете часть аргумента, а Emacs явно дополняет остаток полностью или настолько, насколько можно определить по набранной вами части.

Когда завершение доступно, определённые клавиши -- TAB, RET и SPC -- перепривязываются для дополнения представленного в минибуфере текста до более длинной строки, которую этот текст представляет, путем сопоставления его с вариантами завершения, которые предоставляются командой, считывающей этот аргумент. Знак ? определен как показывающий список возможных завершений того, что вы уже ввели.

Например, когда M-x использует минибуфер для чтения имени команды, она предоставляет для завершения список всех имеющихся имён команд Emacs. Клавиши завершения сопоставляют текст в минибуфере со всеми именами команд, находят какие-то дополнительные знаки имени, которые подразумеваются уже представленными в минибуфере, и добавляют эти знаки к тем, которые вы дали. Поэтому можно напечатать M-x ins SPC b RET вместо M-x insert-buffer RET (например).

Регистр обычно имеет значение при завершении, так как он имеет значение в большинстве имен, которые вы можете завершить (имена буферов, файлов, команд). Таким образом, `fo' не завершится до `Foo'. Когда вы завершаете имя, в котором регистр не имеет значения, то при завершении регистр может быть проигнорирован.

Пример завершения

Здесь может помочь конкретный пример. Если вы наберете M-x au TAB, TAB ищет варианты (в данном случае имена команд), которые начинаются с `au'. Их несколько, включая auto-fill-mode и auto-save-mode, но все они одинаково начинаются на auto-, поэтому `au' в минибуфере изменяется на `auto-'.

Если вы немедленно снова наберете TAB, то появятся несколько возможностей для следующих знаков -- это может быть любой из `cfilrs', -- поэтому больше ничего не добавляется, но в другом окне показывается список всех возможных завершений.

Если вы продолжаете набирать f TAB, то этот TAB увидит `auto-f'. Единственное имя команды, которое так начинается, --- это auto-fill-mode, таким образом завершение вставляет её остаток. Теперь вы имеете в минибуфере `auto-fill-mode' просто после набора au TAB f TAB. Заметьте, что TAB обладает в минибуфере таким действием, потому что когда возможно завершение, он привязан к команде minibuffer-complete.

Команды завершения

Здесь представлен список всех команд завершения, определённых в минибуфере, когда завершение доступно.

TAB
Завершить представленный в минибуфере текст насколько возможно (minibuffer-complete).
SPC
Завершить текст в минибуфере, но не прибавлять более одного слова (minibuffer-complete-word).
RET
Представить текст в минибуфере как аргумент, возможно сначала дополняя его, как описано ниже (minibuffer-complete-and-exit).
?
Напечатать список всех возможных завершений текста в минибуфере (minibuffer-list-completions).

SPC завершает очень похоже на TAB, но никогда не идет дальше следующего дефиса или пробела. Если в минибуфере есть `auto-f', и вы наберете SPC, он обнаружит, что завершение --- это `auto-fill-mode', но остановит завершение после `fill-'. Это даст `auto-fill-'. Еще один SPC в этом месте завершает полностью до `auto-fill-mode'. SPC в минибуфере, когда возможно завершение, запускает функцию minibuffer-complete-word.

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

Mouse-2
Щелчок второй кнопкой мыши выбирает одно из завершений из перечня возможных вариантов (mouse-choose-completion). Обычно вы используете эту команду, когда точка находится в минибуфере; но вы должны щёлкнуть в перечне завершений, а не самом минибуфере.
PRIOR
M-v
Нажатие PRIOR (или PAGE-UP) или M-v, когда вы находитесь в минибуфере, выбирает окно, показывающее буфер с перечнем завершений (switch-to-completions). Это прокладывает путь к использованию команд, перечисленных ниже. (Выбор это окна обычным способом имеет тот же эффект, но этот способ удобнее.)
RET
Нажатие RET в буфере с перечнем завершений выбирает завершение, на котором или после которого находится точка (choose-completion). Чтобы использовать эту команду, вы должны сначала переключиться в окно, показывающее перечень завершений.
RIGHT
Нажатие правой курсорной стрелки RIGHT в буфере с перечнем завершений передвигает точку к следующему завершению (next-completion).
LEFT
Нажатие левой курсорной стрелки LEFT в буфере с перечнем завершений передвигает точку ближе к началу буфера, к предыдущему завершению (previous-completion).

Строгое завершение

Существует три различных варианта работы RET при завершении в минибуфере, зависящие от того, как будет использован аргумент.

  • Строгое завершение используется, когда бессмысленно давать какой-либо другой аргумент, кроме одной из известных альтернатив. Например, когда C-x k считывает имя буфера для уничтожения, то бессмысленно давать что либо, кроме имени существующего буфера. При строгом завершении RET отказывается выходить, если текст в минибуфере не завершается с точным соответствием шаблону.
  • Осторожное завершение подобно строгому завершению за исключением того, что RET выходит, только если текст уже совпадал в точности с шаблоном, не нуждающемся в завершении. Если текст -- не точное совпадение, RET не выходит, но делает завершение текста. Если это завершает текст до точного совпадения, то второй RET выйдет. Осторожное завершение используется для чтения имён файлов, которые должны уже существовать.
  • Свободное завершение используется, когда любая строка является подходящей, и список альтернатив завершения даётся просто для справки. Например, когда C-x C-f считывает имя файла для обращения, допустимо любое имя файла, на случай, если вы захотите создать новый файл. При свободном завершении RET берёт текст в минибуфере точно как он дан, не завершая его.

Команды завершения показывают в окне список всех возможных вариантов всякий раз, когда возможно более чем одно завершение для следующего знака. Кроме того, набор ? явно запрашивает такой список. Если перечень завершений длинный, вы можете прокрутить его с помощью C-M-v (смотрите раздел Использование других окон).

Параметры завершения

При завершении имён файлов определённые имена обычно игнорируются. Переменная completion-ignored-extension содержит список строк; файл, чье имя кончается на любую из этих строк, игнорируется как возможное завершение. Стандартное значение этой переменной имеет несколько элементов, включая ".о", ".elc", ".dvi" и "~". Действие таково: например, `foo' может завершиться до `foo.c', даже если `foo.o' также существует. Однако, если все возможные завершения кончаются на "игнорируемые" строки, тогда они не игнорируются. Игнорируемые расширения не относятся к спискам завершений -- эти списки всегда упоминают все возможные завершения.

Обычно команда завершения, которая обнаруживает, что следующий знак нельзя определить, автоматически показывает список всех возможных завершений. Если переменная completion-auto-help установлена в значение nil, этого не происходит, и чтобы просмотреть возможные варианты, вы должны набрать ?.

Библиотека complete реализовывает более мощный вид завершения, который может дополнять несколько слов одновременно. Например, она может завершить сокращение имени команды p-b до print-buffer, потому что ни одна другая команда не начинается с двух слов, чьи первые буквы -- это `p' и `b'. Чтобы использовать эту библиотеку, напишите (load "complete") в вашем файле `~/.emacs' (смотрите раздел Файл инициализации, `~/.emacs').

Режим Icomplete предоставляет постоянно обновляющуюся информацию, говорящую вам, какие завершения доступны для уже введенного текста. Этот второстепенный режим включается и выключается с помощью команды M-x icomplete-mode.

История минибуфера

Все введенные вами в минибуфер аргументы сохраняются в списке истории минибуфера, чтобы вы могли снова использовать их позже в новом аргументе. Текст старых аргументов вставляется в минибуфер особыми командами. Они сбрасывают старое содержимое минибуфера, так что вы можете думать о них как о командах движения по списку предыдущих аргументов.

UP
M-p
Перемещается к предыдущей строке аргумента, сохраненной в истории минибуфера (previous-history-element).
DOWN
M-n
Перемещается к следующей строке аргумента, сохраненной в истории минибуфера (next-history-element).
M-r regexp RET
Перемещается к более раннему аргументу в истории минибуфера, в котором есть совпадение с regexp (previous-matching-history-element).
M-s regexp RET
Перемещается к более позднему аргументу в истории минибуфера, в котором есть совпадение с regexp (next-matching-history-element).

Простейший способ повторно использовать сохраненные аргументы из списка истории -- передвигаться по списку истории по одному аргументу. Находясь в минибуфере, используйте M-p или стрелку вверх (previous-history-element) чтобы "перейти" к предыдущему вводу минибуфера, и M-n или стрелку вниз (next-history-element) для "перехода" к следующему.

Предыдущий ввод, который вы извлекаете из истории, полностью замещает содержимое минибуфера. Чтобы использовать его в качестве аргумента, выйдите из минибуфера как обычно, с помощью RET. Вы также можете отредактировать текст перед использованием; это не изменяет элемент истории, к которому вы "перешли", но ваш новый аргумент вставляется в конец списка истории как отдельный элемент.

Для многих аргументов минибуфера есть значение "по умолчанию". В некоторых случаях команды истории знают значение по умолчанию. Тогда вы можете вставить это значение в минибуфер в виде текста, используя M-n для перехода "в будущее" по истории. Мы надеемся в конце концов сделать это свойство доступным всегда, когда у минибуфера есть значение по умолчанию.

Также есть команды для поиска вперёд или назад по истории; они производят поиск элементов истории, которые соответствуют задаваемому вами в минибуфере регулярному выражению. M-r (previous-matching-history-element) производит поиск более старых элементов истории, тогда как M-s (next-matching-history-element) производит поиск более новых элементов. По особому разрешению эти команды могут использовать минибуфер для считывания аргументов, хотя вы уже находитесь в минибуфере, когда запускаете их. Как и при наращиваемом поиске, заглавная буква в регулярном выражении делает поиск регистрозависимым (смотрите раздел Поиск и регистр букв).

Каждое использование минибуфера записывает ваш ввод в список истории, но есть отдельные списки для различных видов аргументов. Например, есть список для имен файлов, используемый всеми командами, считывающими имена файлов. (У него есть особенность: этот список истории записывает абсолютное имя файла, не больше и не меньше, даже если вы ввели его иначе.)

Существуют несколько других особенных списков истории, включая список для имен команд, считываемых командой M-x, список для имён буферов, список для аргументов команд вроде query-replace и список команд компиляции, считываемых командой compile. И наконец, есть список истории для "разного", который используют большинство аргументов минибуфера.

Переменная history-length задаёт максимальную длину списка истории минибуфера; как только список дорастает до этой длины, самый старый элемент удаляется при добавлении нового. Если значение history-length равно t, то ограничения на длину нет, и элементы не удаляются никогда.

Повтор команд минибуфера

Каждая команда, которая использует минибуфер по крайней мере один раз, записывается в специальный список истории вместе со значением аргументов минибуфера, так что вы можете легко её повторить. В частности, записывается каждое использование M-x, так как M-x использует минибуфер для чтения имени команды.

C-x ESC ESC
Повторное выполнение последней команды минибуфера (repeat-complex-command).
M-x list-command-history
Вывести полную историю всех команд, которые может повторить C-x ESC ESC, начиная с более новых.

C-x ESC ESC используется для повторного выполнения недавней команды, использовавшей минибуфер. Запущенная без аргумента, она повторяет последнюю такую команду. Числовой аргумент определяет, какую команду повторить; единица означает первую от конца, а большие числа определяют более ранние команды.

C-x ESC ESC действует при помощи превращения предыдущей команды в выражение Лиспа и последующего входа в минибуфер, инициализированый текстом этого выражения. Если вы набираете просто RET, то команда повторяется как прежде. Вы можете также изменить команду путем редактирования лисповского выражения. То выражение, что вы в конце концов представите, и будет выполнено. Повторенная команда добавляется в начало истории команд, если она не идентична самой последней выполненной команде, которая уже была там.

Даже если вы не понимаете синтаксиса Лиспа, вероятнее всего будет очевидно, какая команда отражается для повторения. Если вы не меняли текст, вы можете быть уверены, что он повторится точно так, как прежде.

Находясь в минибуфере по команде C-x ESC ESC, вы можете использовать команды истории минибуфера (M-p, M-n, M-r, M-s; смотрите раздел История минибуфера) для продвижения по списку сохраненных полностью команд. После того, как вы найдете желаемую предыдущую команду, вы можете как обычно отредактировать её выражение и затем предоставить его снова, набрав RET.

Перечень предыдущих команд, использовавших минибуфер, хранится как лисповский список в переменной command-history. Каждый элемент --- это лисповское выражение, которое описывает одну команду и её аргументы. Программы на Лиспе могут повторно выполнять команды путём передачи в eval соответствующего элемента command-history.

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024