Минибуфер
Минибуфер используется командами 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
.
Запуск команд по имени
Команды Emacs, которые применяются часто или должны быстро набираться, привязываются к ключам -- коротким последовательностям знаков -- для удобства использования. Другие команды Emacs, не нуждающиеся в краткости, не привязаны к ключам; чтобы запустить их, вы должны обратиться к ним по имени.
По соглашению имя команды создается из одного или более слов, разделенных дефисами; например, auto-fill-mode
или manual-entry
. Использование английских слов делает имена команд более легкими для запоминания, чем составленные из непонятных знаков ключи, даже если слова дольше набирать.
Чтобы запустить на выполнение команду по имени, сначала наберите M-x, за ним имя команды и закончите набором RET. `M-x' использует минибуфер для чтения имени команды. RET выходит из минибуфера и запускает команду на выполнение. Строка `M-x' показывается в начале буфера как подсказка, чтобы напомнить вам, что вы должны ввести имя команды, которая будет запущена на выполнение. Смотрите раздел Минибуфер, для полной информации о свойствах минибуфера.
При вводе имени команды вы можете использовать завершение. Например, команда forward-char
может быть запущена по имени при помощи
M-x forward-char RET
или
M-x forw TAB c RET
Заметим, что forward-char
-- это та же самая команда, которую вы вызываете с помощью ключа C-f. Любая команда Emacs может быть вызвана по имени с использованием M-x независимо от того, существует ли связанный с ней ключ.
Если во время считывания имя команды вы набираете C-g, то вы отменяете команду M-x и покидаете минибуфер, по завершении поднимаясь на верхний уровень.
Чтобы передать числовой аргумент команде, которую вы вызываете с помощью M-x, задайте числовой аргумент перед M-x. M-x передает аргумент команде, которую вызывает. Значение аргумента появляется в подсказке в то время, когда считывается имя команды.
Если набираемая вами команда привязана к собственному ключу, Emacs говорит об этом в эхо-области спустя две секунды после завершения команды (если вы до этого ничего не ввели). Например, если вы напечатаете M-x forward-word, вы получите сообщение, говорящее, что эту же команду можно запустить более просто, введя M-f. Вы можете отключить эти сообщения, установив suggest-key-bindings
в значение nil
.
В этом руководстве при описании команд, запускаемых по имени, мы обычно опускаем RET, который необходим для ограничения имени. То есть мы чаще пишем M-x auto-fill-mode, а не M-x auto-fill-mode RET. Мы упоминаем RET, только когда необходимо подчеркнуть его присутствие, например при описании последовательности ввода, которая содержит имя команды и следующие за ним аргументы.
M-x определен на выполнение команды execute-extended-command
, которая отвечает за считывание имени другой команды и ее запуск.
Справка
Emacs предоставляет широкие возможности предоставления справки, которые доступны через один знак, C-h. C-h -- это префиксный ключ, который используется только для команд печати документации. Знаки, которые вы можете набрать после C-h, называются параметрами справки. Одним из них является C-h; c его помощью вы запрашиваете информацию об использовании C-h. Функциональная клавиша F1 служит эквивалентом C-h.
C-h C-h (help-for-help
) печатает список всех возможных параметров справки с кратким описанием каждого из них. До набора параметра справки вы можете пролистать этот список с помощью SPC или DEL.
C-h или F1 означает "помощь" также и во многих других контекстах. Например, в процессе работы query-replace
они описывают доступные возможные действия над текущим найденным совпадением. После префиксного ключа они выводят перечень вариантов, которые могут следовать за этим префиксным ключом. (Некоторые префиксные ключи не поддерживают C-h, потому что они определяют для него другие значения; но все они поддерживают F1.)
Большинство справочных буферов используют специальный основной режим, режим Help, который позволяет вам удобно делать прокрутку с помощью SPC и DEL.
Ниже приведен обзор всех определенных команд для получения справки.
- C-h a regexp RET
- Показать список команд, чьи имена соответствуют регулярному выражению regexp (
apropos-command
). - C-h b
- Показать таблицу всех привязок ключей, действующих на данный момент в следующем порядке: привязки текущих второстепенных режимов, привязки основного режима и глобальные привязки (
describe-bindings
). - C-h c ключ
- Напечатать имя команды, которую запускает на выполнение заданный ключ (
describe-key-briefly
). Здесь c означает `character' (`знак'). Для получения более подробной информации о ключе, используйте C-h k. - C-h f функция RET
- Показать документацию на лисповскую функцию с именем функция (
describe-function
). Так как команды являются лисповскими функциями, вы можете использовать имя команды. - C-h h
- Вывести файл `hello', который показывает примеры различных наборов знаков.
- C-h i
- Запустить Info, программу для просмотра файлов документации (
info
). Полное руководство по Emacs существует как диалоговый файл в Info. - C-h k ключ
- Показать имя и описание команды, которую запускает ключ (
describe-key
). - C-h l
- Показать описание последних 100 набранных вами знаков (
view-lossage
). - C-h m
- Показать описание текущего основного режима (
describe-mode
). - C-h n
- Показать описание изменений в Emacs, первым самое последнее (
view-emacs-news
). - C-h p
- Найти пакет по ключевому слову (
finder-by-keyword
). - C-h s
- Показать текущее содержимое синтаксической таблицы и объяснить, что оно означает (
describe-syntax
). Смотрите раздел Синтаксическая таблица. - C-h t
- Войти в интерактивный самоучитель по Emacs (
help-with-tutorial
). - C-h v пер RET
- Показать описание лисповской переменной пер (
describe-variable
). - C-h w команда RET
- Напечатать, какие ключи запускают на выполнение команду с именем команда (
where-is
). - C-h C кодировка RET
- Вывести описание системы кодирования с именем кодировка (
describe-coding-system
). - C-h C RET
- Описать используемую в данный момент систему кодирования.
- C-h I метод RET
- Описать метод ввода (
describe-input-method
). - C-h L языковая-среда RET
- Показать сведения о наборах знаков, системах кодирования и методах ввода, используемых в языковой-среде (
describe-language-environment
). - C-h C-c
- Показать условия копирования GNU Emacs.
- C-h C-d
- Показать информацию о получении новых версий GNU Emacs.
- C-h C-f функция RET
- Войти в Info и перейти к ноде, описывающей функцию Emacs с именем функция (
Info-goto-emacs-command-node
). - C-h C-k ключ
- Войти в Info и перейти к ноде, описывающей заданную последовательность ключей (
Info-goto-emacs-key-command-node
). - C-h C-p
- Показать информацию о Проекте GNU.
- C-h TAB языковой-символ RET
- Показать документацию Info на языковой-символ в соответствии с языком программирования, на котором вы пишите (
info-lookup-symbol
).
Описания для ключей
Основными параметрами для C-h являются C-h c (describe-key-briefly
) и C-h k (describe-key
). C-h c ключ печатает в эхо-области имя команды, к которой привязан ключ. Например, C-h c C-f печатает `forward-char'. Поскольку имена команд выбираются так, чтобы они описывали действие команды, это удобный способ получить очень короткое описание того, что делает ключ.
C-h k ключ похожа на предыдущую, но дает больше информации. Она показывает строку документации команды, а также ее имя. Это слишком много для эхо-области, поэтому для показа используется окно.
C-h c и C-h k работают для любых видов ключей, включая функциональные клавиши и события от мыши.
Справка по имени команды или переменной
C-h f (describe-function
) читает имя функции Лиспа, используя минибуфер, затем показывает строку документации этой функции в окне. Так как команды -- это лисповские функции, вы можете пользоваться этим для получения описания команды, известной по имени. Например,
C-h f auto-fill-mode RET
выдает документацию для auto-fil-mode
. Это единственный способ увидеть документацию команды, которая не привязана к какому-нибудь ключу (одной из тех, которых вы обычно вызываете при помощи M-x).
C-h f также полезна для лисповских функций, которые вы планируете использовать в программе на Лиспе. Например, если вы просто написали выражение (make-vector len)
и хотите быть уверенными в том, что вы верно использовали make-vector
, наберите C-h f make-vector RET. Так как C-h f воспринимает имена всех функций, а не только имена команд, то вы можете обнаружить, что некоторые из ваших любимых сокращений, которые работают в M-x, не работают в C-h f. Сокращения могут быть уникальными среди имен команд и уже не быть уникальными, когда рассматриваются также и имена других функций.
Имя функции для C-h f имеет значение по умолчанию, которое используется, если вы наберете RET, оставляя минибуфер пустым. По умолчанию это будет функция, вызванная самым глубоким лисповским выражением в буфере в районе точки, при условии, что это правильное, определенное имя функции Лиспа. Например, если точка расположена вслед за текстом `(make-vector (car x)', то самый глубокий список, содержащий точку, это тот, что начинается с `(make-vector'; таким образом, по умолчанию будет описана функция make-vector
.
C-h f часто полезна просто для проверки правильности написания имени функции с точки зрения орфографии. Если C-h f упоминает в подсказке значение по умолчанию, то вы набрали имя определенной лисповской функции. Если это все, что вы хотели узнать, просто наберите C-g, чтобы отменить команду C-h f и продолжить редактирование.
C-h w команда RET сообщает вам, какие ключи привязаны к команде. Она печатает список ключей в эхо-области. Если она говорит, что команда не привязана ни к одному ключу, вы должны использовать для вызова этой команды M-x. C-h w запускает команду where-is
.
C-h v (describe-variable
) похожа на C-h f, но описывает переменные Лиспа, а на функции. Ее значение по умолчанию --- это лисповский символ поблизости или перед точкой, но только если это имя известной лисповской переменной. Смотрите раздел Переменные.
Поиск по контексту
Более сложный вид запросов -- это вопросы вроде "Какие команды используются для работы с файлами?" Чтобы задать такой вопрос, наберите C-h a file RET, которая покажет список всех имен команд, которые содержат `file', такие как copy-file
, find-file
и так далее. Вместе с именем команды показывается краткое описание того, как ее использовать, и какие ключи ее запускают. Например, вам сообщат, что вы можете запустить find-file
, набрав C-x C-f. Здесь а в C-h -- это сокращение для `Apropos', C-h a запускает на выполнение функцию command-apropos
. Эта команда проверяет только команды (интерактивные функции); если вы зададите префиксный аргумент, она просмотрит также и неинтерактивные функции.
Так как C-h a ищет только функции, чьи имена содержат заданную вами строку, вы должны быть изобретательны в выборе строк. Если вы ищете команды для уничтожения в обратном направлении, и C-h a kill-backward RET ничего не показывает, не отчаивайтесь. Попробуйте просто kill, или просто backward или просто back. Будьте настойчивы. Притворитесь, что вы играете в Adventure. Также отметим, что для большей гибкости вы можете использовать в качестве аргумента регулярное выражение (смотрите раздел Синтаксис регулярных выражений).
Здесь представлен набор аргументов для передачи в C-h a, который охватывает множество классов команд, так как существуют строгие соглашения для имен стандартных команд Emacs. Давая вам почувствовать принятые соглашения об именовании, этот набор также должен служить вам помощью в совершенствовании технических приемов для подбора строк apropos
.
char, line, word, sentence, paragraph, region, page, sexp, list, defun, rect, buffer, frame, window, face, file, dir, register, mode, beginning, end, forward, backward, next, previous, up, down, search, goto, kill, delete, mark, insert, yank, fill, indent, case, change, set, what, list, find, view, describe, default.
Для получения перечня всех пользовательских переменных, которые соответствуют регулярному выражению, используйте команду M-x apropos-variable. Эта команда показывает по умолчанию только пользовательские переменные; если вы зададите префиксный аргумент, она просмотрит все переменные.
Чтобы перечислить все лисповские символы, которые содержат совпадение с регулярным выражением, а не только те, которые определены в качестве команд, используйте команду M-x apropos, а не C-h a. По умолчанию эта команда не проверяет привязки ключей; если вы хотите узнать их, задайте этой команде префиксный аргумент.
Команда apropos-documentation
похожа на apropos
, но производит поиск совпадений с регулярным выражением не только в именах символов, но и в строках описания.
Команда apropos-value
действует как apropos
, за исключением того, что ищет совпадения с регулярным выражением в значениях символов. Эта команда по умолчанию не проверяет определения функций или списки свойств; задайте ей числовой аргумент, если вы хотите проверить и их.
Если переменная apropos-do-all
не равна nil
, то все описанные выше команды ведут себя так, как-будто им задан префиксный аргумент.
Если вы хотите получить больше информации об определении функции, о переменной или о свойствах символа, перечисленных в буфере Apropos, вы можете щелкнуть на них Mouse-2 или переместиться туда и нажать RET.
Поиск в библиотеках Лиспа по ключевым словам
Команда C-h p позволяет вам производить поиск в стандартных библиотеках Emacs Lisp по тематическим ключевым словам. Вот неполный перечень ключевых слов, которые вы можете использовать:
abbrev --- управление сокращениями, быстрые клавиши, макросы.
bib --- поддержка обработчика библиографий bib
.
c --- поддержка языков Си и Си++.
calendar --- поддержка календаря и операций со временем.
comm --- коммуникации, сети, удаленный доступ к файлам.
data --- поддержка редактирования файлов с данными.
docs --- поддержка документации Emacs.
emulations --- эмуляция других редакторов.
extensions --- расширения языка Emacs Lisp.
faces --- поддержка разных начертаний (шрифтов и цветов).
frames --- поддержка фреймов и оконных систем.
games --- игры, шутки и развлечения.
hardware --- поддержка интерфейсов с экзотической аппаратурой.
help --- поддержка интерактивных справочных систем.
hypermedia --- поддержка для ссылок внутри текста.
i18n --- поддержка разных языков и алфавитов.
internal --- внутренний код Emacs, сборка, значения по умолчанию.
languages --- специализированные режимы для редактирования кода.
lisp --- поддержка использования Лиспа (включая Emacs Lisp).
local --- библиотеки, локальные для вашей системы.
maint --- средства поддержки для группы разработчиков Emacs.
mail --- режимы для работы с электронной почтой.
matching --- поисковые программы.
news --- поддержка чтения и отправки сетевых новостей.
non-text --- поддержка для редактирования нетекстовых файлов.
oop --- поддержка объектно-ориентированного программирования.
outlines --- просмотр иерархической структуры текста.
processes --- процессы, оболочка, компиляция и управление задачами.
terminals --- поддержка разных типов терминалов.
tex --- поддержка для программы компьютерного набора TeX.
tools --- утилиты для программирования.
unix --- интерфейсы или эмуляторы возможностей Unix.
vms --- поддержка VMS.
wp --- обработка текста.
Справка о поддержке различных языков
Для получения справки о поддержке определенной языковой среды используйте команду C-h L (describe-language-environment
). Смотрите раздел Языковые среды. Эта команда говорит вам, для каких языков полезна данная языковая среда, и перечисляет наборы знаков, системы кодирования и методы ввода, которые используются в этой среде. Она также показывает образец текста для демонстрации его внешнего вида.
Команда C-h h (view-hello-file
) отображает файл `etc/HELLO', который показывает, как сказать "Здравствуйте" на разных языках.
Команда C-h I (describe-input-method
) описывает метод ввода, либо заданный явно, либо, по умолчанию, используемый в данный момент. Смотрите раздел Методы ввода.
Команда C-h C (describe-coding-system
) описывает систему кодирования, либо заданную явно, либо, по умолчанию, используемые в данный момент. Смотрите раздел Системы кодирования.
Команды режима Help
Справочные буферы предоставляют команды режима View (смотрите раздел Разнообразные действия над файлами) плюс несколько собственных особых команд.
- SPC
- Прокручивает вперед.
- DEL
- Прокручивает назад.
- RET
- Переходит по перекрестной ссылке в точке.
- TAB
- Перемещает вперед к следующей перекрестной ссылке.
- S-TAB
- Перемещает назад к предыдущей перекрестной ссылке.
- Mouse-2
- Переходит по перекрестной ссылке, на которой вы щелкнули.
Когда в описании появляется имя команды (смотрите раздел Запуск команд по имени) или имя переменной (смотрите раздел Переменные), оно обычно показывается в парных одиночных кавычках. Вы можете щелкнуть на имени с помощью Mouse-2 или передвинуть к нему точку и нажать RET, чтобы просмотреть документацию на эту команду или переменную. Используйте C-c C-b для возврата.
Есть удобные команды для перемещения точки к перекрестным ссылкам в тексте справки. TAB (help-next-ref
) передвигает точку вперед к следующей перекрестной ссылке. Чтобы переместить точку к предыдущей ссылке, используйте S-TAB (help-previous-ref
).
Другие команды для получения справки
C-h i (info
) запускает на выполнение программу Info, которая используется для просмотра структурированных файлов документации. Внутри Info имеется полное руководство по Emacs. В конце концов там будет доступна вся документация по системе GNU. Чтобы запустить самоучитель по использованию Info, наберите h после входа в Info.
Если вы зададите числовой аргумент, C-h i запросит имя файла документации. Таким образом вы сможете просмотреть файл, для которого нет вхождения в меню Info верхнего уровня. Это также удобно, когда вам нужно получить документацию быстро, и вы знаете точное имя этого файла.
Существуют две специальные справочные команды для получения документации по Emacs через Info. C-h C-f функция RET входит в Info и переходит непосредственно к описанию функции Emacs с именем функция. C-h C-k ключ входит в Info и переходит к описанию ключа. Эти ключи запускают команды Info-goto-emacs-command-node
и Info-goto-emacs-key-command-node
.
При редактировании программы, если у вас есть Info-версия руководства для этого языка программирования, вы можете использовать команду C-h C-i для просмотра описания символа (ключевого слова, функции или переменной). Детали работы этой программы зависят от основного режима.
Если происходит что-то странное, и вы не уверены, какую команду вы набрали, используйте C-h l (view-lossage
). C-h l печатает последние 100 набранных вами командных знаков. Если вы увидели команды, которые вам не знакомы, вы можете использовать C-h c, чтобы отыскать информацию о том, что они делают.
Emacs имеет множество основных режимов, каждый из которых переопределяет несколько ключей и делает некоторые другие изменения в работе редактора. C-h m (describe-mode
) печатает документацию о текущем основном режиме, в которой обычно описаны все команды, измененные в этом режиме.
C-h b (describe-bindings
) и C-h s (describe-syntax
) предоставляют другую информацию о текущем режиме Emacs. C-h b показывает список всех привязанных ключей, действующих в данный момент; сначала идут локальные привязки текущих второстепенных режимов, за ними локальные привязки текущего основного режима и, наконец, глобальные привязки (смотрите раздел Настройка привязок ключей). C-h s показывает содержимое синтаксической таблицы с объяснением синтаксиса каждого знака (смотрите раздел Синтаксическая таблица).
Вы можете получить подобный перечень для конкретного префиксного ключа, набрав после него C-h. (Есть несколько префиксных ключей, для которых это не работает -- они придают свои привязки для C-h. Один из них -- это ESC, потому что ESC C-h на самом деле эквивалентен C-M-h, который помечает определение функции.)
Другие параметры C-h показывают разнообразные файлы с полезной информацией. C-h C-w показывает подробности об отсутствии гарантий для GNU Emacs. С-h n (view-emacs-news
) показывает файл `emacs/etc/NEWS', который содержит описание изменений в Emacs, сортированное в хронологическом порядке. C-h F (view-emacs-FAQ
) выводит список часто отвечаемых вопросов о Emacs. C-h t (help-with-tutorial
) показывает обучающее руководство по Emacs. C-h C-c (describe-copying
) показывает файл `emacs/etc/COPYING', который объясняет условия, которые вы должны выполнить при распространении копий Emacs. C-h C-d (describe-distribution
) показывает файл `emacs/etc/DISTRIB', в котором рассказывается, как вы можете заказать копию последней версии Emacs. C-h C-p (describe-project
) выводит общую информацию о Проекте GNU.
Пометка и область
Существует множество команд Emacs, которые работают с произвольной непрерывной частью текущего буфера. Чтобы задать текст, над которым работают такие команды, вы устанавливаете метку в одном конце этого текста, и передвигаете точку в другой его конец. Текст, расположенный между точкой и меткой, называется областью. Если вы задействовали режим Transient Mark, Emacs выделяет область цветом (смотрите раздел Режим Transient Mark).
Чтобы регулировать границы области, вы можете двигать точку или метку. Не имеет значения, которая из них установлена первой в хронологическом порядке, или какая появляется первой в тексте. Как только метка установлена, она остается до тех пор, пока не будет установлена снова в другом месте. Каждый буфер имеет свою собственную метку, таким образом, когда вы возвращаетесь в буфер, который выбирался прежде, он сохраняет ту же самую метку, что и прежде.
Многие команды, которые вставляют текст, например C-y (yank
) и M-x insert-buffer, располагают метку в одном из концов вставленного текста, противоположном тому, где помещается точка, таким образом, область содержит только что вставленный текст.
Помимо ограничения области, пометка также полезна для запоминания места, к которому вы, возможно, захотите вернуться. Чтобы сделать эту возможность более полезной, Emacs запоминает 16 предыдущих позиций метки в списке пометок.
Установка метки
Здесь приводятся некоторые команды для установки метки:
- C-SPC
- Установить метку в точке (
set-mark-command
). - C-@
- То же самое.
- C-x C-x
- Поменять местами метку и точку (
exchange-point-and-mark
). - Drag-Mouse-1
- Установить точку и пометить текст, по которому вы провели.
- Mouse-3
- Установить метку в точке и переместить точку к позиции, на которой вы щелкнули. (
mouse-save-then-kill
).
Например, если вы хотите преобразовать часть буфера так, чтобы он весь был набран прописными буквами, вы можете использовать команду C-x C-u (upcase-region
), которая оперирует с текстом в области. Вы можете сначала отправится в начало текста, который должен быть написан прописными буквами, набрать C-SPC, чтобы установить там метку, передвинуться в конец текста и затем набрать C-x C-u. Либо вы можете установить метку в конце текста, сдвинуться в начало и затем набрать C-x C-u.
Наиболее общий способ установки метки -- делать это с помощью команды C-SPC (set-mark-command
). Так устанавливается пометка в позиции точки. Затем вы можете отодвинуть точку, оставляя метку на месте.
Есть два способа установить метку с помощью мыши. Вы можете провести мышью с нажатой первой кнопкой по отрезку текста; это поместит точку там, где вы отпустили кнопку мыши, и установит метку на другом конце этого отрезка. Или вы можете щелкнуть третьей кнопкой мыши, что устанавливает метку в точке (как C-SPC) и затем перемещает точку (как Mouse-1). Оба этих способа помимо установки метки копируют область в список уничтожений; такое поведение соответствует поведению других оконных приложений, но если вы не хотите изменять список уничтожений, вы должны использовать для установки метки команды клавиатуры. Смотрите раздел Команды мыши для редактирования.
На обычных терминалах есть только один курсор, так что Emacs не может показать вам местонахождение метки. Вы должны его помнить. Обычный выход из ситуации -- установить метку, а затем быстро ее использовать до того, как вы забудете, где она расположена. Но вы можете увидеть позицию метки с помощью команды C-x C-x (exchange-point-and-mark
), которая устанавливает метку туда, где была точка, а точку туда, где была метка. Положение области остается неизменным, а курсор и точка находятся теперь в предыдущей позиции метки. В режиме Transient Mark эта команда активизирует пометку.
C-x C-x также полезна, когда вы удовлетворены положением точки, но хотите передвинуть другой конец области (где находится метка); сделайте C-x C-x для того, чтобы установить точку на место метки, и затем вы можете двигать метку. Используя C-x C-x во второй раз, если это необходимо, вы установите метку в новой позиции, а точку вернете в ее прежнюю позицию.
В ASCII не существует знака C-SPC; когда вы набираете SPC, удерживая CTRL в нажатом положении, на большинстве обычных терминалов вы получите знак C-@. Это и есть ключ, фактически привязанный к set-mark-command
. Но если вы не настолько неудачливы, чтобы получить терминал, где набирая C-SPC, вы не получаете C-@, вы можете думать об этом знаке как о C-SPC. Под X, C-SPC на самом деле является отдельным знаком, но привязан он все равно к set-mark-command
.
Режим Transient Mark
Emacs может подсвечивать текущую область, используя X Windows. Но обычно он этого не делает. Почему?
Подсветка области обычно не работает в Emacs хорошо, потому что как только вы поставили метку, всегда есть область (в этом буфере). А постоянная подсветка области раздражала бы.
Вы можете включить подсветку помеченной области, задействовав режим Transient Mark. Это более жесткий режим действий, в котором область "существует" только временно, так что вы должны задавать область для каждой команды, которая ее использует. В режиме Transient Mark большую часть времени области нет; таким образом, подсветка области, когда она существует, удобна.
Чтобы включить режим Transient Mark, выполните команду M-x transient-mark-mode. Эта команда переключает данный режим, а значит вы можете повторить ее для выключения этого режима.
Вот подробности о режиме Transient Mark:
- Чтобы установить метку, введите C-SPC (
set-mark-command
). Это сделает метку активной; при перемещении точки вы увидите, что область увеличивается или уменьшается. - Команды мыши для задания пометки также делают ее активной. То же делают и команды клавиатуры, чья цель -- установить область, включая M-@, C-M-@, M-h, C-M-h, C-x C-p и C-x h.
- Когда метка активна, вы можете выполнять команды, действующие на область, такие как уничтожение, создание отступа или запись в файл.
- Любое изменение буфера, например вставка или удаление знака, деактивизирует пометку. Это означает, что последующие команды, действующие на область, получат ошибку и не смогут работать. Вы можете сделать область снова активной, введя C-x C-x.
- Команды вроде M-> и C-s, которые "оставляют метку" помимо какой-то другой основной цели, не активизируют новую метку. Вы можете активизировать новую область, выполнив C-x C-x (
exchange-point-and-mark
). - C-s не изменяет метку, если она активна.
- Выход с помощью C-g деактивизирует метку.
Для подсветки области используется начертание region
; вы можете настроить способ подсветки области, изменив это начертание. Смотрите раздел Настройка начертаний.
Когда несколько окон показывают один и тот же буфер, они имеют разные области, потому что у них могут быть разные значения точки (хотя все они имеют одинаковую позицию метки.) Обычно только выбранное окно подсвечивает область (смотрите раздел Множество окон). Однако, если переменная highlight-nonselected-windows
не равна nil
, то каждое окно подсвечивает свою область (если включен режим Transient Mark, и метка в буфере этого окна активна).
Когда режим Transient Mark не включен, каждая команда, устанавливающая метку, также и активизирует ее, но ничто не деактивизирует метку.
Если в режиме Transient Mark переменная mark-even-if-inactive
не равна nil
, то команды могут использовать метку и область, даже если они не активны. Подсветка области появляется и исчезает так же, как обычно в режиме Transient Mark, но метка на самом деле не исчезает, когда исчезает подсветка.
Режим Transient Mark также известен как "режим Zmacs", потому что редактор Zmacs на MIT Lisp Machine обращался с пометкой похожим образом.
Работа с областью
Как только вы создали область, и метка активна, вы можете делать различные вещи с текстом этой области:
- Уничтожить его с помощью C-w (смотрите раздел Удаление и уничтожение).
- Записать его в регистр с помощью C-x r s (смотрите раздел Регистры).
- Записать его в буфер или файл (смотрите раздел Накопление текста).
- Преобразовать регистр с помощью C-x C-l или C-x C-u (смотрите раздел Команды преобразования регистра).
- Сделать отступ с помощью C-x TAB или C-M-\ (смотрите раздел Отступы).
- Заполнить его как текст с помощью M-x fill-region (смотрите раздел Заполнение текста).
- Распечатать с помощью M-x print-region (смотрите раздел Вывод твердой копии).
- Вычислить его как Лисп-код с помощью M-x eval-region (смотрите раздел Вычисление выражений Emacs-Lisp).
Большинство команд, которые оперируют с текстом в области, в своем имени содержат слово region
.
Команды для пометки текстуальных объектов
Здесь представлены команды для помещения точки и метки вокруг текстуальных объектов, таких как слово, список, абзац или страница.
- M-@
- Установить метку после конца следующего слова (
mark-word
). Эта и следующая команды не передвигают точку. - C-M-@
- Установить метку после конца следующего Лисп-выражения (
mark-sexp
). - M-h
- Установить область вокруг абзаца (
mark-paragraph
). - C-M-h
- Установить область вокруг текущего определения функции Лиспа (
mark-defun
). - C-x h
- Установить область вокруг всего текущего буфера (
mark-whole-buffer
). - C-x C-p
- Установить область вокруг текущей страницы (
mark-page
).
M-@ (mark-word
) устанавливает метку в конце следующего слова, а C-M-@ (mark-sexp
) устанавливает ее в конец следующего выражения Лиспа. Эти команды обрабатывают свои аргументы так же, как M-f и C-M-f.
Другие команды устанавливают как метку, так и точку, чтобы ограничить объект в буфере. Например, M-h (mark-paragraph
) передвигает точку в начало абзаца, который окружает точку или следует за ней, и устанавливает метку в конце этого абзаца (смотрите раздел Абзацы). Эта команда подготавливает область, чтобы вы могли сделать отступы, переключить регистр или уничтожить весь абзац.
C-M-h (mark-defun
) также устанавливает точку впереди, а метку после текущего или следующего определения функции (смотрите раздел Определения функций). C-x C-p (mark-page
) устанавливает точку перед текущей страницей, а метку -- в конце страницы (смотрите раздел Страницы). Пометка идет после ограничителя страницы (чтобы включить и его), точка идет после ограничителя предыдущей страницы (чтобы исключить его). Числовой аргумент задает более позднюю страницу (если аргумент положителен) или более раннюю (если он отрицателен) вместо текущей страницы.
Наконец, C-x h (mark-whole-buffer
) помечает весь буфер как область, устанавливая точку в начало, а метку в конец.
В режиме Transient Mark все эти команды активизируют метку.
Список пометок
Помимо ограничения области, пометка служит также для запоминания места, в которое вы хотели бы вернуться. Чтобы сделать эту возможность более полезной, Emacs запоминает 16 предыдущих позиций метки в списке пометок. Большинство команд, которые устанавливают метку, вставляют старую метку в этот список. Чтобы вернуться к отмеченной позиции, используют C-u C-SPC (или C-u C-@), это команда set-mark-command, которой дан числовой аргумент. Она передвигает точку туда, где была пометка, и восстанавливает метку из списка прежних пометок. Так, повторное использование этой команды передвигает точку ко всем старым пометкам в списке, к одной за другой. Метки, через которые вы проходите, попадают в конец списка, таким образом ни одна из них не пропадает.
Каждый буфер имеет свой собственный список пометок. Все команды редактирования используют список пометок текущего буфера. В частности, C-u C-SPC всегда остается в том же самом буфере.
Многие команды, передвигающие на большие расстояния, такие, например, как M-< (beginning-of-buffer
), начинают с установки метки и записи старого значения в список пометок. Это сделано для того, чтобы вам было легче впоследствии вернуться назад. Поиски делают это за исключением тех случаев, когда они фактически не двигают точку. Вы можете видеть, когда какая-либо команда устанавливает метку, по тому, что она печатает в эхо-области сообщение `Mark Set'.
Если вы хотите возвращаться к одному и тому же месту снова и снова, список пометок может оказаться недостаточно удобным. В таком случае вы можете записать позицию в регистр для последующего получения (смотрите раздел Запись позиций в регистры).
Переменная mark-ring-max
задает максимальное число элементов в списке пометок. Если уже имеется максимальное количество элементов, и заталкивается еще один, то последний из существующего списка сбрасывается. Повторение C-u C-SPC прокручивает среди позиций, которые находятся в данный момент в списке.
Переменная mark-ring
хранит сам список пометок как список помеченных объектов, где первым идет записанный самым последним. Данная переменная является локальной в каждом буфере.
Глобальный список пометок
Кроме обычного списка пометок, который принадлежит каждому буферу, в Emacs есть единый глобальный список пометок. В нем записывается последовательность буферов, в которых вы недавно устанавливали метки, чтобы вы могли вернуться к этим буферам.
При установке метки всегда создается вхождение в списке пометок текущего буфера. Если вы переключали буферы после предыдущей установки метки, позиция новой метки вносится также и в глобальный список пометок. В результате глобальный список пометок хранит последовательность буферов, в которых вы побывали, и место в каждом из них, где вы поставили метку.
Команда C-x C-SPC (pop-global-mark
) переводит к буферу и позиции последнего вхождения в глобальном списке пометок. Она также проматывает этот список, чтобы последовательное применение команды C-x C-SPC перемещало вас ко все более ранним буферам.
Уничтожение и перемещение текста
Уничтожение означает стирание текста и запись его в список уничтожений, из которого он может быть получен с помощью восстановления. Некоторые системы, ставшие недавно популярными, используют для обозначения этих операций термины "вырезка" и "вставка".
Самый распространенный способ переноса или копирования текста в Emacs --- сначала уничтожить его, а потом восстановить в одном или нескольких местах. Это очень надежно, так как все уничтоженные за последнее время куски текста запоминаются. И это удобно, так как многочисленные команды для уничтожения синтаксических единиц могут быть также использованы и для их перемещения. Но есть и другие способы копирования текста для особых целей.
Emacs хранит единый для всех буферов список уничтожений, так что вы можете уничтожить текст в одном буфере и восстановить его в другом.
Удаление и уничтожение
Большинство команд, которые стирают текст из буфера, сохраняют его в списке уничтожений, чтобы вы могли перенести или скопировать его в другие части буфера. Эти команды известны как команды уничтожения. Остальные команды, стирающие текст, не записывают его в список уничтожений; они известны как команды удаления. (Такое отличие делается только для стирания текста в буфере). Если вы уничтожили или удалили текст по ошибке, вы можете использовать команду C-x u (undo
) для отмены изменений (смотрите раздел Отмена сделанных изменений).
Команды удаления включают C-d (delete-char
) и DEL (delete-backward-char
), которые удаляют только один знак за один раз, и те команды, которые удаляют только пробелы или ограничители новой строки. Команды, которые могут уничтожить существенное количество нетривиальных данных, обычно являются командами уничтожения. Имена команд и их описания используют слова `kill' и `delete', чтобы пояснять что они делают.
Удаление
- C-d
- Удалить следующий знак (
delete-char
). - DEL
- Удалить предыдущий знак (
delete-backward-char
). - M-\
- Удалить все пробелы и табуляцию вокруг точки (
delete-horizontal-space
). - M-SPC
- Удалить пробелы и табуляцию вокруг точки, оставляя один пробел (
just-one-space
). - C-x C-o
- Удалить пустые строки вокруг текущей строки (
delete-blank-lines
). - M-^
- Объединить две строки, удаляя находящийся между ними ограничитель новой строки и любой отступ, следующий за ним (
delete-indentation
).
Самые основные команды удаления -- это C-d (delete-char
) и DEL (delete-backward-char
). C-d удаляет знак после точки, над которым находится курсор. Точка не передвигается. DEL удаляет знак перед курсором и передвигает точку назад. Ограничитель новой строки может быть удален точно также, как и любой другой знак в буфере. Удаление ограничителя новой строки объединяет две строки. Фактически C-d и DEL не всегда являются командами удаления; если им дать аргумент, они уничтожают, так как этим способом они могут стереть уже более одного знака.
Другие команды удаления -- это те, что удаляют только пробельные знаки: пробелы, табуляцию и ограничители новых строк. M-\ (delete-horizontal-space
) удаляет все пробелы и символы табуляции перед и после точки. M-SPC (just-one-space
) делает то же самое, но оставляет одиночный пробел после точки, независимо от количества пробелов, существовавших прежде (даже если оно было равно нулю).
C-x C-o (delete-blank-lines
) уничтожает все пустые строки после текущей строки. Если текущая строка пустая, то также уничтожает все пустые строки, предшествующие текущей строке (оставляя одну пустую строку, текущую).
M-^ (delete-indentation
) объединяет текущую строку и предшествующую ей, удаляя ограничитель новой строки и все окружающие пробелы, обычно оставляя одиночный пробел. Смотрите раздел Отступы.
Уничтожение строк
- C-k
- Уничтожить остаток строки, либо одну или несколько строк (
kill-line
).
Простейшей командой уничтожения является C-k. Если она дается в начале строки, то уничтожает весь текст на строке, оставляя ее пустой. Если команда дана на пустой строке, то уничтожает всю строку, включая ее ограничитель. Чтобы уничтожить непустую строку целиком, перейдите в ее начало и нажмите C-k дважды.
В более общем виде, C-k уничтожает все от точки вплоть до конца строки, если это не происходит в конце строки. В этом случае она уничтожает ограничитель новой строки, следующий за строкой, таким образом происходит слияние следующей строки с текущей. При решении вопроса о том, какой случай применять, невидимые пробелы и табуляция в конце строки игнорируются, так, если точка выглядит стоящей в конце строки, вы можете быть уверены, что C-k уничтожит перевод строки.
Если C-k будет присвоен положительный аргумент, она уничтожит ровно столько строк вместе со следующими за ними ограничителями (однако, текст на текущей строке перед точкой сохраняется). С отрицательным аргументом -n она уничтожает n строк, предшествующих текущей (вместе с текстом на текущей строке перед точкой). Таким образом, C-u - 2 C-k в начале строки уничтожает две предыдущие строки.
C-k с аргументом, равным нулю, уничтожает текст перед точкой на текущей строке.
Если переменная kill-whole-line
не равна nil
, C-k в самом начале строки уничтожает всю эту строку, включая последующий перевод строки. Эта переменная обычно равна nil
.
Другие команды уничтожения
- C-w
- Уничтожить область (от точки до метки) (
kill-region
). - M-d
- Уничтожить слово (
kill-word
). Смотрите раздел Слова. - M-DEL
- Уничтожить предыдущее слово (
backward-kill-word
). - C-x DEL
- Уничтожить назад до начала предложения (
backward-kill-sentence
). Смотрите раздел Предложения. - M-k
- Уничтожить до конца предложения (
kill-sentence
). - C-M-k
- Уничтожить s-выражение (
kill-sexp
). Смотрите раздел Списки и s-выражения. - M-z знак
- Уничтожить вплоть до следующего появления знака (
zap-to-char
).
C-w (kill-region
) -- очень распространенная команда уничтожения, которая уничтожает все между точкой и меткой. С помощью этой команды вы можете уничтожить любую непрерывную последовательность знаков, если сначала установите метку в одном ее конце и отправитесь в другой конец.
Удобный способ уничтожения -- это уничтожение скомбинированное с поиском: M-z (zap-to-char
) считывает знак и уничтожает от точки вплоть до следующего появления этого знака (и включая его) в буфере. Числовой аргумент действует как счетчик повторов. Отрицательный аргумент означает поиск в обратную сторону и уничтожение текста перед точкой.
Могут уничтожаться другие синтаксические единицы: слова, с помощью M-DEL и M-d (смотрите раздел Слова); s-выражения, с помощью C-M-k (смотрите раздел Списки и s-выражения); и предложения, с помощью C-x DEL и M-k (смотрите раздел Предложения).
Вы можете использовать команды уничтожения в буферах, доступных только для чтения. На самом деле они не изменяют буфер и подают звуковой сигнал, чтобы предупредить вас об этом, но они действительно копируют текст, который вы попытались уничтожить, в список уничтожений, так что вы можете восстановить его в других буферах. Большинство команд уничтожения передвигают точку по тексту, который они копируют таким способом, поэтому последовательные команды уничтожения, как обычно, создают единое вхождение в списке уничтожений.
Восстановление
Восстановление возвращает обратно текст, который был ранее уничтожен. Это то же самое, что в других системах называется "вставкой". Обычный способ копирования или перемещения текста --- уничтожить его, а затем восстановить один или несколько раз.
- C-y
- Восстановить последний уничтоженный текст (
yank
). - M-y
- Заменить только что восстановленный текст предшествующим куском уничтоженного текста (
yank-pop
). - M-w
- Сохранить область как последний уничтоженный текст без фактического уничтожения (
kill-ring-save
). - C-M-w
- Добавить следующее уничтожение к последнему куску уничтоженного текста (
append-next-kill
).
Список уничтожений
Весь уничтоженный текст записывается в кольцевой список уничтожений, список блоков текста, который был уничтожен. Существует только один список уничтожений, используемый во всех буферах, таким образом вы можете уничтожить текст в одном буфере и восстановить его в другом. Это обычный способ перемещения текста из одного файла в другой. (Смотрите раздел Накопление текста, для получения информации о других способах).
Команда C-y (yank
) вновь вставляет текст, уничтоженный самым последним. Она оставляет курсор в конце текста, метка устанавливается в его начале. Смотрите раздел Пометка и область.
C-u C-y оставляет курсор перед текстом и устанавливает метку после него. Это происходит, только если аргумент задан с помощью просто C-u. Любой другой вид аргумента, включая C-u и цифры, обозначают восстановление уничтоженного ранее (смотрите раздел Восстановление ранее уничтоженного).
Если вы хотите скопировать блок текста, вы можете использовать M-w (kill-ring-save
), которая копирует область в список уничтожений без удаления его из буфера. Это приблизительный эквивалент C-w, за которой следует C-x u, за исключением того, что M-w не изменяет историю восстановлений и не изменяет на время экран.
Добавление уничтожений
Обычно каждая команда уничтожения добавляет новый блок в список уничтожений. Однако, две или более команды уничтожения подряд объединяют текст в единый элемент, так что одиночная C-y возьмет весь его обратно таким, каким он был перед уничтожением.
Таким образом, если вы хотите восстановить текст как одно целое, вы не должны уничтожать весь этот текст одной командой; вы можете продолжать уничтожение строки за строкой или слова за словом до тех пор, пока не уничтожите весь текст полностью, и вы можете получить его обратно сразу целиком.
Команды, которые уничтожают текст вперед от точки, добавляют уничтоженное в конец предыдущего уничтоженного текста. Команды, которые уничтожают назад от точки, добавляют это в начало. Таким образом, любая последовательность смешанных команд уничтожения перед точкой и после нее объединяет весь уничтоженный текст в один элемент без переупорядочения. Числовой аргумент не прерывает последовательность добавления уничтожений. Например, предположим, что буфер содержит такой текст:
Это пример строки -!-с образцом текста.
с точкой, показанной как -!-. Если вы наберете M-d M-DEL M-d M-DEL, уничтожая по очереди вперед и назад, то в конце получите `пример строки с образцом' в качестве одного вхождения в списке уничтожений и `Это текста.' в буфере. (Обратите внимание на двойной пробел, который вы можете очистить с помощью M-SPC или M-q.)
Другой способ уничтожить тот же текст -- переместиться назад на два слова с помощью M-b M-b и уничтожить все четыре слова вперед командой C-u M-d. Это дает такой же результат в буфере и в списке уничтожений. M-f M-f C-u M-DEL уничтожает тот же текст, проходя все время назад; и опять результат будет тем же. Текст в элементе списка уничтожений всегда имеет тот же порядок, что он имел в буфере до того, как вы его уничтожили.
Если команда уничтожения отделена от предыдущей другими командами (не просто числовым аргументом), то она начинает новый элемент в списке уничтожений. Но вы можете заставить эту команду уничтожения добавлять текст к предыдущему элементу, набрав перед ней команду C-M-w (append-next-kill
). C-M-w приказывает следующей команде, если это команда уничтожения, добавить уничтоженный ею текст к последнему уничтоженному тексту вместо того, чтобы начинать новый элемент. С помощью C-M-w вы можете уничтожить несколько отдельных кусков текста и накопить их для дальнейшего восстановления в одном месте.
Команда уничтожения, следующая после M-w, не добавляет к тексту, который M-w скопировала в список уничтожений.
Восстановление ранее уничтоженного
Для того чтобы вернуть уничтоженный текст, который уже не является последним уничтоженным, используйте команду M-y (yank-pop
). Она берет прежде восстановленный текст, и заменяет его текстом более раннего уничтожения. Так, чтобы вернуть текст, предшествующий последнему уничтоженному, сначала используйте C-y, чтобы восстановить последнее уничтожение, а затем M-y, чтобы заменить его предыдущим. M-y может использоваться только после C-y или другой M-y.
M-y можно понимать в терминах указателя на "последнее восстановление", который указывает на элемент в списке уничтожения. Каждый раз, когда вы уничтожаете, указатель на "последнее восстановление" передвигается в последний созданный элемент в начале списка. C-y восстанавливает элемент, на который ссылается указатель "последнего восстановления". M-y двигает указатель на "последнее восстановление" к другому элементу, и текст в буфере соответственно изменяется. Достаточное количество команд M-y может переместить указатель к любому элементу в списке, таким образом, вы можете получить любой элемент в буфере. Когда наконец указатель достигает последнего элемента списка, следующая команда M-y снова помещает его на первый элемент.
M-y двигает указатель на "последнее восстановление" по списку, но это не меняет порядок элементов, которые всегда идут от самого последнего уничтожения до самого старого, которое еще хранится.
M-y может получить числовой аргумент, который говорит, на сколько элементов вперед продвинуть указатель на "последнее восстановление". Отрицательный аргумент двигает этот указатель по направлению к началу списка; от начала списка он двигает к последнему элементу и продолжает движение вперед оттуда.
Как только искомый текст помещен в буфер, вы можете прекратить запускать команды M-y, и текст останется там. Это просто копия элемента списка уничтожения, поэтому редактирование его в буфере не изменяет содержимое этого списка. До тех пор, пока не делается новое уничтожение, указатель на "последнее восстановление" остается в том же самом месте в списке уничтожений, таким образом, повторение C-y восстановит еще одну копию того же самого старого уничтожения.
Если вы знаете, сколько команд M-y необходимо набрать, чтобы найти интересующий вас текст, вы можете восстановить этот текст за один шаг, используя C-y с числовым аргументом. C-y с аргументом восстанавливает текст, записанный в списке уничтожения на заданное число элементов назад. Таким образом, C-u 2 C-y достает следующий за последним блок уничтоженного текста. Это эквивалентно C-y M-y. C-y c числовым аргументом начинает подсчет от указателя на "последнее восстановление" и устанавливает этот указатель на элемент, который эта команда восстанавливает.
Длина списка уничтожений управляется переменной kill-ring-max
; не может быть записано больше блоков текста, чем определено этой величиной.
Действительное содержимое списка уничтожений хранится в переменной kill-ring
; вы можете просмотреть все содержимое списка уничтожений с помощью команды C-h v kill-ring.
Накопление текста
Обычно мы копируем или переносим текст путем его уничтожения и восстановления, но существуют и другие способы, удобные для копирования одного блока текста во многие места или для копирования многих рассеянных блоков текста в одно место. Чтобы скопировать один блок во много мест, запишите его в регистр (смотрите раздел Регистры). Здесь мы описываем команды для накопления разбросанных кусков текста в буфер или в файл.
- M-x append-to-buffer
- Добавить область в заданный буфер после точки.
- M-x prepend-to-buffer
- Добавить область в заданный буфер перед точкой.
- M-x copy-to-buffer
- Копировать область в заданный буфер, удаляя старое содержимое буфера.
- M-x insert-buffer
- Вставить содержимое заданного буфера в текущий буфер в точке.
- M-x append-to-file
- Добавить область в конец заданного файла.
Для накопления текста в буфере используется M-x append-to-buffer. Она считывает имя буфера, а затем вставляет в этот буфер копию области. Если буфер с таким именем не существует, то append-to-buffer
создаст его. Текст вставляется в то место в этом буфере, где находится точка. Если вы использовали этот буфер для редактирования, скопированный текст вставляется в середину текста, где оказалась точка.
Точка в этом буфере остается в конце копируемого текста, таким образом, последовательное использование append-to-buffer
накапливает текст в заданном буфере в том же самом порядке, в котором части были скопированы. Строго говоря, append-to-buffer
не всегда добавляет к тексту, уже находящемуся в буфере -- она добавляет, если точка находится в конце этого буфера. Однако, если append-to-buffer
является единственной командой, которую вы используете для изменения буфера, точка всегда расположена в конце.
M-x prepend-to-buffer подобна append-to-buffer
за исключением того, что точка в другом буфере остается перед скопированным текстом, таким образом, последовательное применение этой команды добавляет текст в обратном порядке. M-x copy-to-buffer действует так же, за исключением того, что любой существующий текст в другом буфере удаляется, так что в буфере остается лишь вновь скопированный текст.
Чтобы вернуть накопленный текст из другого буфера, используйте команду M-x insert-buffer; она также принимает имя буфера как аргумент. Эта команда вставляет копию текста из буфера с заданным именем в выбранный буфер. Или вы можете выбрать другой буфер для редактирования, возможно, перемещая впоследствии текст из него путем уничтожения. Смотрите раздел Использование множества буферов, для получения базовой информации о буферах.
Вместо накопления текста внутри буфера Emacs вы можете добавить текст непосредственно в файл с помощью команды M-x append-to-file, которая использует имя файла в качестве аргумента. Она добавляет текст области в конец заданного файла. Файл на диске изменяется сразу.
Вы должны использовать append-to-file
только с файлами, к которым вы не обращаетесь из Emacs. Использование этой команды для файла, к которому обратились из Emacs, может изменить файл без ведома Emacs, что может привести к потере некоторых результатов вашего редактирования.
Прямоугольники
Команды для прямоугольников работают с прямоугольными областями текста: всеми знаками между определенной парой столбцов в определенном диапазоне строк. Эти команды предназначены для уничтожения прямоугольников, восстановления уничтоженных прямоугольников, их очистки, заполнения пробелами или текстом, или удаления. Команды для прямоугольников полезны для работы с текстом в многоколоночных форматах и для приведения текста к такому формату или извлечения из него.
Когда вам нужно задать прямоугольник для команды, которая будет с ним работать, вы делаете это, устанавливая метку в одном углу и точку в противоположном. Прямоугольник, описанный таким образом, называется областью-прямоугольником, так как вы управляете им почти так же, как и областью. Но помните, что данная комбинация значений точки и метки может быть интерпретирована и как область, и как прямоугольник в зависимости от команды, которая их использует.
Если точка и метка находятся на одном столбце, то прямоугольник, который они ограничивают, пуст. Если они находятся на одной строке, то прямоугольник имеет высоту в одну строку. Эта несимметричность между строками и столбцами происходит из того, что точка (и метка) располагается между двух столбцов, но внутри строки.
- C-x r k
- Уничтожить текст области-прямоугольника, сохраняя его содержимое в качестве "последнего уничтоженного прямоугольника" (
kill-rectangle
). - C-x r d
- Удалить текст области-прямоугольника (
delete-rectangle
). - C-x r y
- Восстановить последний уничтоженный прямоугольник, помещая его верхний левый угол в точке (
yank-rectangle
). - C-x r o
- Вставить пустое место, заполняя пространство области-прямоугольника (
open-rectangle
). Предыдущее содержимое области-прямоугольника выталкивается вправо. - M-x clear-rectangle
- Очистить область-прямоугольник, заменяя ее содержимое пробелами.
- M-x delete-whitespace-rectangle
- Удалить пробельные знаки в каждой строке заданного прямоугольника, начиная с его самого левого столбца.
- C-x r t строка RET
- Вставить строку в каждую строку области-прямоугольника (
string-rectangle
).
Операции, работающие с прямоугольниками, делятся на два класса: команды удаления и вставки прямоугольников и команды для пустых прямоугольников.
Существует два способа избавиться от текста в прямоугольнике: вы можете сбросить (удалить) его или записать его как "последний уничтоженный" прямоугольник. Для этого используются две команды C-x r d (delete-rectangle
) и C-x r k (kill-rectangle
). В обоих случаях часть каждой строки, которая попала внутрь границ прямоугольника, удаляется, заставляя последующий текст в строке (если он существует) сдвигаться влево.
Заметьте, что "уничтожение" прямоугольника не есть уничтожение в обычном понимании; этот прямоугольник хранится не в списке уничтожений, а в специальном месте, которое в состоянии записать только самое последнее уничтожение прямоугольника. Это происходит из-за того, что восстановление прямоугольника настолько отличается от восстановления линейного текста, что для этого должны использоваться другие команды восстановления, и в этом случае трудно приписать смысл команде, выдающей более ранние уничтожения.
Чтобы вставить последний уничтоженный прямоугольник, наберите C-x r y (yank-rectangle
). Восстановление прямоугольника -- это противоположность уничтожения. Левый верхний угол задается положением точки. Туда помещается первая строка прямоугольника, вторая строка прямоугольника помещается в позиции точки, но строкой ниже, и так далее. Число затронутых строк определяется высотой записанного прямоугольника.
Вы можете превратить списки из одной колонки в списки из двух колонок, используя уничтожение и восстановление прямоугольников; уничтожьте вторую половину списка как прямоугольник и затем восстановите его рядом с первой строчкой списка. Смотрите раздел Редактирование текста в две колонки, другой способ редактировать двухколоночный текст.
Прямоугольники также могут быть скопированы в регистры и из регистров с помощью C-x r r r и C-x r i r. Смотрите раздел Запись прямоугольников в регистры.
Есть две команды для работы с пустыми прямоугольниками: M-x clear-rectangle, чтобы расписать пробелами существующий текст, и C-x r o (open-rectangle
), чтобы вставить пустой прямоугольник. Очистка прямоугольника эквивалентна его удалению с последующей вставкой на его место пустого прямоугольника такого же размера.
Команда M-x delete-whitespace-rectangle удаляет горизонтальное пустое пространство, начиная с определенного столбца. Это относится к каждой строке в прямоугольнике, а столбец задается левым краем прямоугольника. Правый край прямоугольника не имеет значения для этой команды.
Команда C-x r t (M-x string-rectangle
) замещает прямоугольник заданной строкой (вставляя ее один раз в каждую строку). Ширина строки не обязана совпадать с шириной прямоугольника. Если ширина строки меньше, текст после прямоугольника смещается влево; если строка шире прямоугольника, текст после него смещается вправо.
Регистры
Регистры Emacs -- это места, куда вы можете записать текст или позиции для дальнейшего использования. Текст или прямоугольник, однажды записанный в регистр, может быть скопирован в буфер один или несколько раз; позицию, записанную в регистр, можно один или несколько раз использовать для передвижения к ней точки.
Каждый регистр имеет имя, состоящее из одиночного знака. Регистр может хранить кусок текста, позицию, прямоугольник, конфигурацию окна или имя файла, но только что-то одно из перечисленного в каждый конкретный момент. Всякий раз, когда вы сохраняете что-то в регистре, оно остается там до тех пор, пока вы не поместите в этот регистр что-то еще. Чтобы узнать, что содержит регистр r, используйте M-x view-register.
- M-x view-register RET r
- Выдать описание того, что содержит регистр r.
Запись позиций в регистры
Сохранение позиции записывает местоположение в буфере, так что вы можете вернуться туда позже. Перенос в записанную позицию заново выбирает буфер и передвигает точку в это место.
- C-x r SPC r
- Записать положение точки в регистр r (
point-to-register
). - C-x r j r
- Перейти в позицию, записанную в регистре r (
jump-to-register
).
Чтобы записать текущее положение точки в регистр, выберите имя r и наберите C-x r SPC r. Регистр r сохраняет записанное таким образом положение до тех пор, пока вы не запишете в этот регистр что-то другое.
Команда C-x j r передвигает точку в позицию, записанную в регистре r. Регистр не затрагивается, он продолжает хранить ту же самую позицию. Вы можете перейти в одну и ту же позицию, используя один и тот же регистр, любое число раз.
Если вы используете C-x r j для перехода к записанной позиции, но буфер, в котором она была записана, уже уничтожен, C-x r j пытается снова создать буфер, обращаясь к тому же файлу. Конечно, это работает только для буферов, которые обращались к файлам.
Запись текста в регистры
Если вы захотите вставить копию одного и того же куска текста несколько раз, использование списка уничтожений может оказаться неудобным, так как каждое последующее уничтожение сдвигает кусок текста все дальше вглубь списка. Альтернативой этому методу является сохранение текста в регистре с последующим его восстановлением.
- C-x r s r
- Копировать область в регистр r (
copy-to-register
). - C-x r i r
- Вставить текст из регистра r (
insert-register
).
C-x r s r записывает копию текста области в регистр с именем r. Запущенная с числовым аргументом, C-x r s r кроме того удаляет текст из буфера.
C-x r i r вставляет в буфер текст из регистра r. Обычно эта команда оставляет точку перед текстом, а метку располагает после него, но с числовым аргументом (C-u), наоборот, точку ставит после текста, а метку перед ним.
Запись прямоугольников в регистры
Регистр может содержать вместо линейного текста прямоугольник. Прямоугольники представляются в виде списка строк. Смотрите раздел Прямоугольники, для получения основной информации по прямоугольникам и о том, как они определяются в буфере.
- C-x r r r
-
Копирует область-прямоугольник в регистр r (
copy-region-to-rectangle
). С числовым аргументом еще и удаляет его. - C-x r i r
- Вставляет прямоугольник, который записан в регистре r (если тот содержит прямоугольник) (
insert-register
).
Команда C-x r i r вставляет строку текста, если регистр содержит строку, и вставляет прямоугольник, если регистр содержит прямоугольник.
Смотрите также команду sort-columns
, которую можно рассматривать как команду сортировки прямоугольника. Смотрите раздел Сортировка текста.
Запись конфигурации окон в регистры
Вы можете записать в регистр конфигурацию окон в выбранном фрейме или даже конфигурацию всех окон во всех фреймах и позднее восстановить эту конфигурацию.
- C-x r w r
- Записать состояние окон выбранного фрейма в регистр r (
window-configuration-to-register
). - C-x r f r
- Записать состояние всех фреймов, включая все их окна, в регистр r (
frame-configuration-to-register
).
Используйте C-x r j r для восстановления конфигурации окон или фреймов. Это та же команда, что используется для восстановления позиции курсора. Когда вы восстанавливаете конфигурацию фреймов, все существующие фреймы, не входящие в эту конфигурацию, становятся невидимыми. Если вы вместо этого хотите удалить эти фреймы, используйте C-u C-x r j r.
Хранение чисел в регистрах
Существуют команды для записи числа в регистр, вставки его в буфер в десятичном виде и для увеличения этого числа. Эти команды могут быть полезны в макросах клавиатуры (смотрите раздел Клавиатурные макросы).
- C-u число C-x r n рег
-
Записать число в регистр рег (
number-to-register
). - C-u число C-x r + рег
-
Увеличить число в регистре рег на заданное число (
increment-register
). - C-x r g рег
- Вставить число из регистра рег в буфер.
C-x r g -- это та же команда, что используется для вставки в буфер содержимого регистров другого типа.
Запись имен файлов в регистры
Если вы часто обращаетесь к определенным именам файлов, вам будет удобно поместить эти имена в регистры. Вот код на Лиспе, используемый для записи имени файла в регистр:
(set-register ?r '(file . имя))
Например,
(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))
помещает показанное имя файла в регистр `z'.
Чтобы обратиться к файлу, чье имя находится в регистре r, наберите C-x r j r. (Это та же команда, что используется для перехода к записанной позиции или восстановления конфигурации фреймов.)
Закладки
Закладки отчасти похожи на регистры тем, что они записывают позиции, к которым вы можете перейти. В отличие от регистров, они имеют длинные имена и сохраняются автоматически от одного сеанса Emacs до другого. Шаблонное применение закладок -- запись места "где вы читали" в различных файлах.
- C-x r m RET
- Заложить закладку в текущем файле в позиции точки.
- C-x r m закладка RET
-
Заложить в точке закладку с именем закладка (
bookmark-set
). - C-x r b закладка RET
-
Перейти к закладке с именем закладка (
bookmark-jump
). - C-x r l
-
Перечислить все закладки (
list-bookmarks
). - M-x bookmark-save
- Сохранить все текущие значения закладок в файле закладок, используемом по умолчанию.
Как правило закладки используются для записи одной текущей позиции в каждом из нескольких файлов. Таким образом, команда C-x r m, устанавливающая закладку, по умолчанию использует в качестве имени закладки имя файла, к которому вы обращаетесь в данный момент. Если вы называете каждую закладку по имени файла, на который она указывает, то сможете удобно повторно обратиться к любому из этих файлов с помощью C-x r b и в то же время переместиться к позиции закладки.
Чтобы отобразить список всех ваших закладок в отдельном буфере, наберите C-x r l (list-bookmarks
). Если вы переключитесь в этот буфер, вы сможете отредактировать определения закладок или дать им описания. Наберите в этом буфере C-h m для получения более подробных сведений о специальных командах редактирования в нем.
Когда вы уничтожаете Emacs, он предложит вам сохранить значения закладок в вашем файле закладок по умолчанию, `~/.emacs.bmk', если вы изменяли какие-либо из этих значений. Вы также можете сохранить закладки в любое время с помощью команды M-x bookmark-save. Команды, работающие с закладками, автоматически загружают ваш файл закладок по умолчанию. Благодаря этим сохранениям и загрузкам закладки переходят от одного сеанса Emacs к другому.
Если вы установите переменную bookmark-save-flag
в значение 1, то каждая команда, устанавливающая закладку, также будет записывать ваши закладки; при этом вы не потеряете значения закладок, даже если Emacs останавливается аварийно. (Это значение, если оно является числом, говорит, сколько изменений закладок проходит между сохранениями.)
Значения позиций в закладках сохраняются вместе с окружающим контекстом, так что bookmark-jump
может найти правильную позицию, даже если файл был слегка изменен. Переменная bookmark-search-size
говорит, сколько знаков контекста по обе стороны от позиции закладки нужно записывать.
Вот несколько дополнительных команд для работы с закладками:
- M-x bookmark-load RET имя-файла RET
-
Загрузить файл с именем имя-файла, содержащий список значений закладок. Вы можете использовать эту команду, как и команду
bookmark-write
, для работы с другими файлами закладок помимо вашего файла закладок по умолчанию. - M-x bookmark-write RET имя-файла RET
- Сохранить все текущие значения закладок в файле имя-файла.
- M-x bookmark-delete RET закладка RET
- Удалить закладку с именем закладка.
- M-x bookmark-insert-location RET закладка RET
- Вставить в буфер имя файла, на который указывает закладка закладка.
- M-x bookmark-insert RET закладка RET
- Вставить в буфер содержимое файла, на который указывает закладка закладка.