Разнообразные команды

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

Gnus

Gnus -- это пакет Emacs, разработанный в первую очередь для чтения и отправки новостей Usenet. Его также можно использовать для чтения и написания ответов на сообщения из многих других источников -- почты, удалённых каталогов, дайджестов и других.

Здесь мы даём введение в Gnus и описываем некоторые основные возможности. Для получения подробной информации о Gnus наберите M-x info и выберите затем руководство по Gnus.

Чтобы запустить Gnus, напечатайте M-x gnus RET.

Буферы Gnus

В противоположность большинству обычных пакетов Emacs, Gnus использует для показа информации и получения команд несколько разных буферов. Большую часть времени пользователи проводят в трех буферах: буфере групп, буфере резюме и буфере статьи.

Буфер групп содержит перечень групп. Это первый буфер, который Gnus показывает после запуска. Обычно в нем показаны только те группы, на которые вы подписаны, и в которых есть непрочтенные статьи. Используйте этот буфер для выбора конкретной группы.

Буфер резюме построчно перечисляет статьи одной группы. По умолчанию для каждой статьи показываются автор, заголовок и число строк, но это можно настроить по своему вкусу, как и большую часть того, что отображает Gnus. Буфер резюме создаётся, когда вы выбираете группу в буфере групп, и уничтожается, когда вы покидаете эту группу. Используйте этот буфер для выбора статьи.

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

Когда Gnus запускается

При запуске Gnus считывает ваш файл инициализации новостей `.newsrc' и пытается установить связь с локальным сервером новостей, который служит хранилищем статей. Сервер новостей не обязан быть тем же компьютером, на который вы вошли.

Если вы запустили Gnus и соединились с сервером, но не видите в буфере групп ни одной группы, наберите L или A k, чтобы получить перечень всех групп. Затем нажимайте u, чтобы переключать подписку на группы.

Когда вы запускаете Gnus первый раз, он подписывает вас на несколько избранных групп. Все остальные группы сначала уничтожены с вашей точки зрения; вы можете получить их перечень с помощью A k. Все новые группы, появляющиеся в дальнейшем на сервере, становятся для вас зомбированными; наберите A z, чтобы получить их перечень. Вы можете подписаться на группы, показанные в этих списках, используя команду u.

Когда вы покидаете Gnus при помощи q, он автоматически записывает в ваших файлах инициализации `.newsrc' и `.newsrc.eld' статус подписки всех групп. Обычно вам не стоит редактировать эти файлы вручную, но вы можете это делать, если знаете как.

Обзор команд Gnus

Чтение новостей -- это двухшаговый процесс:

  1. Выберите группу в буфере групп.
  2. Выбирайте статьи в буфере резюме. Каждая выбранная статья показывается в буфере статьи в большом окне под буфером резюме в маленьком окне.

Каждый буфер Gnus имеет свои особые команды; однако, смысл любого данного ключа в различных буферах Gnus обычно аналогичен, даже если и различается. Вот команды буферов групп и резюме:

q
В буфере групп, обновляет файл инициализации `.newsrc' и покидает Gnus. В буфере резюме, покидает текущую группу и возвращает в буфер групп. Таким образом, дважды нажав q, вы выйдете из Gnus.
L
В буфере групп, перечисляет все доступные группы на вашем сервере новостей (кроме тех, что вы уничтожили). Это может быть длинный список!
l
В буфере групп, перечисляет только те группы, на которые вы подписаны, и которые содержат непрочтенные статьи.
u
В буфере групп, отменяет подписку (или устанавливает её) на группу, перечисленную в строке, в которой находится точка. Когда вы выходите из Gnus, нажав q, Gnus перечисляет в вашем файле `.newsrc' те группы, на которые вы подписаны. При следующем запуске Gnus вы не увидите эту группу, потому что обычно Gnus показывает только группы, на которые вы подписаны.
C-k
В буфере групп, "уничтожает" группу на текущей строке -- даже не перечисляет её отныне в `.newsrc'. Это затрагивает как текущий сеанс Gnus, так и последующие. Когда вы покидаете Gnus при помощи q, Gnus записывает информацию в файле `.newsrc', описывая все группы, кроме тех, что вы "уничтожили".
SPC
В буфере групп, выбирает группу на строке под курсором и показывает первую непрочтенную статью в этой группе. В буфере резюме,
  • Выбирает статью под курсором, если ни одна ещё не выбрана.
  • Прокручивает текст текущей статьи (если такая есть).
  • Выбирает следующую непрочтенную статью, если текущая статья кончилась.
Таким образом, вы можете пройти по всем статьям, последовательно нажимая SPC.
DEL
В буфере групп, перемещает точку к предыдущей группе, содержащей непрочтенные статьи. В буфере резюме, прокручивает текст статьи назад.
n
Перемещает точку к следующей непрочитанной группе или выбирает следующую непрочитанную статью.
p
Перемещает точку к предыдущей непрочитанной группе или выбирает предыдущую непрочитанную статью.
C-n
C-p
Перемещает точку к следующему или предыдущему пункту, даже если он помечен как прочтенный. Это не выбирает группу или статью на той строке.
s
В буфере резюме, начинает наращиваемый поиск в тексте текущего буфера статьи, точно так же, как если бы вы переключились в буфер статьи и набрали C-s.
M-s regexp RET
В буфере резюме, производит поиск статей, содержащих совпадение с regexp.

Запуск команд оболочки из Emacs

В Emacs есть команды для передачи одиночных командных строк подчиненным процессам оболочки. Существует возможность интерактивного запуска оболочки с вводом и выводом в буфер Emacs с именем `*shell*'.

M-! кмд RET
Запустить командную строку оболочки кмд и показать её вывод (shell-command).
M-| кмд RET
Запустить командную строку оболочки кмд с содержимым области в качестве ввода; возможна замена содержимого области выводом команды (shell-command-on-region).
M-x shell
Запустить подоболочку с вводом и выводом через буфер Emacs. Затем вы можете задавать команды интерактивно.

Отдельные команды оболочки

M-! (shell-command) считывает в минибуфере строку текста и выполняет её как команду оболочки в подоболочке, созданной только для этой команды. Стандартный ввод команде поступает из нулевого устройства. Если команда оболочки производит какой-либо вывод, то он поступает в буфер Emacs с именем `*Shell Command Output*', который отражается не в выбранном, а в другом окне. Числовой аргумент, как в M-1 M-!, велит команде вставить весь вывод в текущий буфер. В этом случае точка остается перед выводом, а метка устанавливается за ним.

Если командная строка оболочки завершается на `&', она выполняется асинхронно. Для синхронной команды оболочки shell-command возвращает выходное значение этой команды (0 обозначает успех), когда она вызывается из Лисп-программы.

M-| (shell-command-on-region) похожа на M-!, но команде оболочки передается в качестве стандартного ввода содержимое области, а не пустота. Если используется числовой аргумент, означающий вставку вывода в текущий буфер, то старая область сначала удаляется, а потом заменяется выводом. Она возвращает выходное значение команды, когда запускается из лисповской программы.

Обе команды M-! и M-| используют оболочку, указанную переменной shell-file-name. При запуске Emacs эта переменная инициализируется на основании вашей переменной среды `SHELL'. Если в имени этого файла не указывается каталог, то просматриваются каталоги в списке exec-path; этот список инициализируется при запуске Emacs по переменной среды `PATH'. Ваш файл `.emacs' может отменять либо одну, либо обе эти инициализации по умолчанию.

И M-! и M-| ожидают завершения команды оболочки. Чтобы остановить ожидание, используйте команду C-g; она завершает команду оболочки сигналом SIGINT -- тем же сигналом, который обычно генерируется оболочкой при вводе C-c. Emacs ждет, пока эта команда на самом деле завершится. Если команда оболочки не остановилась (потому что она игнорирует сигнал SIGINT), наберите C-g снова; это пошлет сигнал SIGKILL, который невозможно проигнорировать.

Чтобы указать систему кодирования для M-! или M-|, используйте команду C-x RET c непосредственно перед ними. Смотрите раздел Задание системы кодирования.

Сообщения команды об ошибках обычно перемежаются с обычным выводом. Если вы установите переменную shell-command-default-error-buffer равной строке, являющейся именем буфера, протокол ошибок будет вставляться перед точкой в буфере с этим именем.

Интерактивная подчинённая оболочка

Для запуска интерактивной подоболочки с сохранением протокола в буфере Emacs применяется M-x shell. Эта команда создаёт (или вновь использует) буфер с именем `*shell*' и запускает подоболочку с вводом, приходящим из этого буфера, и выводом, идущим в него. То есть, любой "терминальный ввод" для подоболочки приходит из текста в буфере, а любой "терминальный вывод" из подоболочки поступает в буфер, продвигая точку вперёд. Для передачи ввода в подоболочку необходимо отправиться в конец буфера, набрать нужное и завершить набором RET.

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

В качестве имени файла для загрузки подоболочки используется значение переменной explicit-shell-file-name, если оно не nil. В противном случае, используется переменная среды `ESHELL' если она установлена, или `SHELL'. Если указанное имя файла является относительным, просматриваются каталоги в списке exec-path; этот инициализируется по переменной среды `PATH' во время запуска Emacs. Ваш файл `.emacs' может перекрыть одну или обе из этих инициализаций.

Чтобы указать для оболочки систему кодирования, вы можете использовать команду C-x RET c непосредственно перед M-x shell. Вы также можете задать систему кодирования после запуска оболочки с помощью команды C-x RET p в её буфере. Смотрите раздел Задание системы кодирования.

Как только оболочка запускается, на вход ей подается содержимое файла `~/.emacs_имя-оболочки', если этот файл существует, где имя-оболочки является именем файла, из которого загружается оболочка. Например, если вы используете bash, то ей посылается файл `~/.emacs_bash'.

Команды cd, pushd и popd, передаваемые подчиненной оболочке, отслеживаются в Emacs так, чтобы каталог по умолчанию буфера `*shell*' всегда совпадал с рабочим каталогом оболочки. Эти команды распознаются синтаксически проверкой посылаемых строк ввода. Если вы используете для этих команд псевдонимы, то вы можете указать Emacs, что их тоже следует распознавать. Например, если значение переменной shell-pushd-regexp соответствует началу командной строки оболочки, то эта строка воспринимается как команда pushd. Если для `pushd' используются псевдонимы, то необходимо изменить эту переменную. Аналогично, shell-popd-regexp и shell-cd-regexp используются для распознавания команд, обозначающих `popd' и `cd'. Причем эти команды распознаются только в начале командной строки оболочки.

Если Emacs получает ошибку при попытке обработать то, что он считает командами `cd', `pushd' или `popd', он запускает ловушку shell-set-directory-error-hook (смотрите раздел Ловушки).

Если Emacs не отслеживает правильно изменения текущего каталога подоболочки, используйте команду M-x dirs, чтобы спросить оболочку, какой у нее текущий каталог. Эта команда работает для оболочек, поддерживающих наиболее распространенный синтаксис команд; она не работает с необычными оболочками.

Вы также можете использовать M-x dirtrack-mode, чтобы включить (или выключить) альтернативный и более агрессивный метод отслеживания изменений текущего каталога.

Emacs определяет в подоболочке переменную среды `EMACS' со значением t. Сценарий оболочки может проверить эту переменную, чтобы определить, запущен ли он из подоболочки Emacs.

Режим Shell

Буферы оболочки использует режим Shell, в котором определено несколько специальных ключей, привязанных к префиксу C-c. Они выбраны так, что имитируют обычные клавиши редактирования и управления заданиями, присутствующие в оболочках вне Emacs, с той лишь разницей, что сначала вы должны набрать C-c. Ниже приведён полный список таких ключей режима Shell.

RET
В конце буфера, посылает строку в качестве ввода; в противном случае копирует текущую строку в конец буфера и посылает её (send-shell-input). При копировании строки любой текст в её начале, соответствующий переменной shell-prompt-pattern, пропускается; значение этой переменной должно быть регулярным выражением, которое соответствует подсказкам, используемым в вашей оболочке.
TAB
Завершает имя команды или файла перед точкой в буфере оболочки (comint-dynamic-complete). TAB также завершает ссылки на историю (смотрите раздел Ссылки на историю оболочки) и имена переменных среды. Переменная shell-completion-fignore задаёт список расширений файлов, которые должны игнорироваться при завершении в режиме Shell. Установка по умолчанию игнорирует имена файлов, заканчивающиеся на `~', `#' или `%'. Другие родственные с Comint режимы используют переменную comint-completion-fignore.
M-?
Временно показывает список возможных завершений имени файла перед точкой в буфере оболочки (comint-dynamic-list-filename-completions).
C-d
Либо удаляет один знак, либо посылает EOF (comint-delchar-or-maybe-eof). Набранный в конце буфера оболочки, C-d посылает подоболочке EOF. Набранный в любой другой позиции в этом буфере, C-d удаляет один знак, как обычно.
C-c C-a
Перемещает в начало строки, но после подсказки, если она есть (comint-bol). Если вы наберете эту команду два раза подряд, на второй раз она возвращает к метке процесса, то есть к началу ввода, который вы ещё не послали подоболочке. (Обычно это одно и то же место --- конец подсказки в текущей строке -- но после C-c SPC метка процесса может оказаться на предыдущей строке.)
C-c SPC
Накапливает несколько строк ввода, и потом посылает их вместе. Эта команда вставляет перед точкой перевод строки, но не посылает предшествующий текст на вход подоболочки -- по крайней мере не сейчас. Обе строки, и та, что перед переводом строки, и та, что после, будут посланы вместе (и с разделяющим их переводом строки), когда вы нажмете RET.
C-c C-u
Уничтожает весь текст, который ещё не был послан в качестве ввода (comint-kill-input).
C-c C-w
Уничтожает слово перед точкой (backward-kill-word).
C-c C-c
Прерывает оболочку или её текущее подзадание, если оно существует (comint-interrupt-subjob). Эта команда уничтожает также весь предназначенный для ввода текст, который ещё не был послан.
C-c C-z
Останавливает оболочку или её текущее подзадание, если оно существует (comint-stop-subjob). Эта команда уничтожает также весь текст, который ещё не был послан в качестве ввода.
C-c C-\
Посылает сигнал выхода оболочке или её текущему подзаданию, если оно существует (comint-quit-subjob). Эта команда уничтожает также весь предназначенный для ввода текст, который ещё не был послан.
C-c C-o
Уничтожает последнюю порцию вывода от команды оболочки (comint-kill-output). Это полезно, если команда оболочки извергает много текста, который только мешает.
C-c C-r
C-M-l
Прокручивает окно так, чтобы начало последней порции вывода оказалось вверху; также перемещает туда курсор (comint-show-output).
C-c C-e
Прокручивает окно, чтобы начало последней порции вывода оказалось внизу (comint-show-maximum-output).
C-c C-f
Перемещает вперёд на одну команду оболочки, но в пределах текущей строки (shell-forward-command). Переменная shell-command-regexp указывает, как распознать конец команды.
C-c C-b
Перемещает назад на одну команду оболочки, но в пределах текущей строки (shell-backward-command).
C-c C-l
Показывает историю команд оболочки этого буфера в другом окне (comint-dynamic-list-input-ring).
M-x dirs
Спрашивает оболочку о текущем каталоге, чтобы Emacs скоординировался с оболочкой.
M-x send-invisible RET текст RET
Считывает текст и посылает его на вход оболочки без эхо. Это полезно, когда команда оболочки запускает программу, спрашивающую пароль. Или вы можете сообщить Emacs, как распознавать запросы пароля и выключать для них эхо:
(add-hook 'comint-output-filter-functions
 'comint-watch-for-password-prompt)
M-x comint-continue-subjob
Возобновляет процесс оболочки. Это полезно, если вы нечаянно приостановили процесс оболочки.(12)
M-x comint-strip-ctrl-m
Убирает все знаки control-M из текущей порции вывода оболочки. Наиболее удобный способ использовать эту команду -- запускать её автоматически, когда вы получаете вывод от подоболочки. Чтобы сделать так, вычислите следующее лисповское выражение:
(add-hook 'comint-output-filter-functions
 'comint-strip-ctrl-m)
M-x comint-truncate-buffer
Эта команда усекает буфер оболочки до определённого максимального числа строк, задаваемого переменной comint-buffer-maximum-size. Это можно сделать автоматически каждый раз при получении вывода от подоболочки таким способом:
(add-hook 'comint-output-filter-functions
 'comint-truncate-buffer)

Режим Shell также настраивает команды работы с абзацами таким образом, что только подсказки оболочки начинают абзацы. Таким образом, абзац состоит из введенной команды плюс из следующего за ней в буфере вывода.

Режим Shell происходит от режима Comint, режима общего назначения для общения с интерактивными подпроцессами. Большинство возможностей режима Shell в действительности даёт режим Comint, как вы можете понять из имен перечисленных выше команд. Особые средства режима Shell включают выбор регулярного выражения для распознавания подсказки, средство отслеживания каталогов и несколько пользовательских команд.

Другие средства Emacs, которые используют варианты режима Comint, включают GUD (смотрите раздел Запуск отладчиков в Emacs) и M-x run-lisp (смотрите раздел Запуск внешнего Лиспа).

Вы можете использовать M-x comint-run для выполнения любой программы по вашему выбору в неизмененном режиме Comint -- без особенностей режима Shell.

История команд оболочки

Буферы оболочки поддерживают три способа повторения более ранних команд. Вы можете использовать те же ключи, что используются в минибуфере; они работают во многом так же, как в минибуфере, вставляя текст предыдущих команд, всегда оставляя точку в конце буфера. Вы можете переместиться по буферу назад к предыдущим командам в их начальной позиции и затем снова послать их или скопировать в конец. Или вы можете использовать знак `!' для ссылок на старые команды.

Список истории оболочки

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

Буферы оболочки предоставляют историю ранее введенных команд. Чтобы снова использовать команды оболочки, сохраненные в истории, используйте команды редактирования M-p, M-n, M-r и M-s. Они работают так же, как команды истории минибуфера, за тем лишь исключением, что действуют на текст в конце буфера оболочки, где вы вставляли бы текст для отправки оболочке.

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

Команды поиска в истории, M-r и M-s, считывают регулярное выражение и производят поиск совпадающей команды в истории. Кроме предоставления выбора, какую именно команду вы хотите извлечь, они работают точно так же, как M-p и M-r. Если вы введете пустое регулярное выражение, будет использовано то регулярное выражение, которое вы предоставили в последний раз.

Когда вы нашли желаемый предыдущий ввод, вы можете снова послать его, нажав RET, или сначала отредактировать и затем послать, если хотите.

Часто бывает полезно заново выполнить несколько последовательных команд оболочки, которые ранее выполнялись по порядку. Чтобы сделать это, сначала найдите и выполните первую команду в последовательности. Затем наберите C-c C-x; это извлечет следующую команду -- ту, которая шла за только что повторенной. Затем нажмите RET, чтобы заново выполнить эту команду. Вы можете повторить несколько последовательных команд, набирая C-c C-x RET снова и снова.

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

Некоторые оболочки сохраняют истории их команд в файлах, чтобы вы могли сослаться на старые команды из предыдущих сеансовx. Emacs считывает файл истории команд для выбранной вами оболочки, чтобы проинициализировать свою собственную историю команд. Этот файл называется `~/.bash_history' в bash, `~/.sh_history' в ksh и `~/.history' в других оболочках.

Копирование истории оболочки

C-c C-p
Перемещает к предыдущей подсказке (comint-previous-prompt).
C-c C-n
Перемещает точку к следующей подсказке (comint-next-prompt).
C-c RET
Копирует команду ввода, в которой находится точка, вставляя её копию в конец буфера (comint-copy-old-input). Это полезно, если вы переместили точку назад к предыдущей команде. После того, как вы скопировали эту команду, вы можете послать копию в качестве ввода, нажав RET. Если вы хотите, вы можете отредактировать копию перед отправлением.

Перемещение к предыдущему вводу и последующее его копирование с помощью C-c RET даёт тот же результат -- то же содержимое буфера -- какой вы получили бы применением M-p достаточное число раз, чтобы извлечь эту старую команду из списка истории. Однако, C-c RET копирует текст из буфера, которые может отличаться от того, что находится в списке истории, если вы редактировали в буфере введенный текст после того, как он был послан.

Ссылки на историю оболочки

Различные оболочки, включая csh и bash, поддерживают ссылки на историю, которые начинаются с `!' и `^'. Режим Shell может понимать такие конструкции и делать для вас подстановку. Если вы вставили ссылку на историю и нажали TAB, это приведет к поиску совпадающей команды в истории ввода, подстановке, если она необходима, и помещению в буфер результата на место ссылки. Например, вы можете извлечь самую недавнюю команду, начинающуюся на `mv', с помощью ! m v TAB. Вы можете отредактировать эту команду, если хотите, и затем послать её оболочке, нажав RET.

Ссылки на историю действуют только после подсказки оболочки. Переменная shell-prompt-pattern указывает, как распознать подсказку. Вообще, режимы Comint используют для определения подсказки переменную comint-prompt-regexp; режим Shell использует shell-prompt-pattern, чтобы установить локальное значение comint-prompt-regexp.

В режиме Shell есть возможность раскрывать ссылки на историю, когда вы отправляете их оболочке. Чтобы затребовать это, установите переменную comint-input-autoexpand равной input.

Вы можете сделать так, чтобы SPC производил раскрытие истории, привязав SPC к команде comint-magic-space.

Параметры режима Shell

Если переменная comint-scroll-to-bottom-on-input не равна nil, команды вставки и восстановления прокручивают выбранное окно книзу перед вставкой.

Если comint-scroll-show-maximum-output не равна nil, то прокрутка из-за поступления вывода старается разместить последнюю строку текста на нижней строке окна, чтобы вы видели как можно больше полезного текста. (Это имитирует поведение прокрутки на многих терминалах.) По умолчанию эта переменная равна nil.

Установкой comint-scroll-to-bottom-on-output вы можете сделать так, чтобы точка перескакивала в конец буфера всякий раз при поступлении вывода -- независимо от того, где точка была раньше. Если значение равно this, точка перескакивает в выбранном окне. Если значение равно all, точка перескакивает в каждом окне, показывающем этот буфер Comint. Если значение равно other, точка перескакивает во всех невыбранных окнах, показывающих текущий буфер. По умолчанию это nil, что означает, что точка не должна перемещаться в конец.

Переменная comint-input-ignoredups говорит, нужно ли сохранять в истории последовательные одинаковые строки ввода. Отличное от nil значение велит опускать ввод, идентичный предыдущему. По умолчанию эта переменная равна nil; это значит, что сохраняется любой ввод, даже если он эквивалентен предыдущему.

Завершение имён файлов управляется тремя переменными. Переменная comint-completion-addsuffix говорит, вставляет ли завершение пробел или косую черту, чтобы обозначить полностью завершенное имя файла или каталога (не-nil велит вставлять пробел или косую черту). comint-completion-recexact, если не равна nil, указывает TAB выбирать наименьшее возможное завершение, если обычный алгоритм завершения Emacs не может добавить даже одного знака. comint-completion-autolist, если не равна nil, велит перечислять все возможные завершения, когда нельзя найти точное завершение.

Команда comint-dynamic-complete-variable завершает имя переменной, используя установки переменных среды внутри Emacs. Переменные, управляющие завершением имён файлов, применяются и к завершению имён переменных. Эта команда обычно доступна через меню.

При завершении команд обычно рассматриваются только исполняемые файлы. Если вы установите shell-command-execonly равной nil, будут рассматриваться также имена и неисполняемых файлов.

Вы можете сконфигурировать поведение `pushd'. Есть переменные, которые указывают, ведет ли себя pushd, как cd, если ей не задан аргумент (shell-pushd-tohome), выталкивает ли она каталог, а не прокручивает, если ей задан числовой аргумент (shell-pushd-dextract), и добавляет ли она каталоги в стек только в том случае, если их ещё нет в нем (shell-pushd-dunique). Выбранные вами значения должны, разумеется, соответствовать вашей оболочке.

Оболочка на удалённой машине

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

M-x telnet RET имя-машины RET
Устанавливает с компьютером имя-машины соединение по Telnet.
M-x rlogin RET имя-машины RET
Устанавливает с компьютером имя-машины соединение по Rlogin.

Используйте M-x telnet, чтобы установить соединение по Telnet с другим компьютером. (Telnet -- это стандартный протокол Internet для захода на удалённую систему.) Она считывает в минибуфере имя другого компьютера в качестве аргумента. Когда соединение установлено, общение с другим компьютером работает похоже на общение с подоболочкой: вы можете редактировать ввод с помощью обычных команд Emacs и посылать его построчно, набирая RET. Вывод вставляется в буфер вперемешку со вводом.

Используйте M-x rlogin для установки соединения по Rlogin. Rlogin -- это другой протокол общения с удалённой системой, во многом похожий на Telnet, но не совместимый с ним и поддерживаемый только на некоторых системах. Преимущества Rlogin состоят в том, что вы можете сделать так, чтобы вам необязательно было задавать имя пользователя и пароль при общении между часто используемыми машинами, и что вы можете установить восьмибитное соединение. (Чтобы сделать это в Emacs, установите rlogin-explicit-args равной ("-8") перед запуском Rlogin.)

M-x rlogin устанавливает каталог по умолчанию данного буфера Emacs, чтобы получать доступ к удалённой машине через FTP (смотрите раздел Имена файлов), и отслеживает команды оболочки, которые изменяют текущий каталог, так же, как режим Shell.

Есть два способа отслеживания каталогов в буфере Rlogin -- либо с помощью имён удалённых каталогов `/машина:кат/', либо с помощью локальных имён (это работает, если "удалённая" машина разделяет файловые системы с вашей начальной машиной). Вы можете использовать команду rlogin-directory-tracking-mode, чтобы переключать эти режимы. Отсутствие аргумента обозначает использование имён удалённых каталогов, положительный аргумент обозначает использование локальных имен, а отрицательный выключает отслеживание каталогов.

Использование Emacs в качестве сервера

Различные программы, такие как mail, могут вызывать выбранный вами редактор для редактирования определённого текста, например, отправляемого сообщения. По соглашению, большинство этих программ используют переменную среды `EDITOR', чтобы определить, какой редактор надо запускать. Если вы установите `EDITOR' равной `emacs', они вызовут Emacs -- но неудобным способом, запуская новый отдельный процесс Emacs. Это неудобно, потому что занимает время и потому что новый процесс Emacs не разделяет буферы с существующим процессом.

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

Во-первых, подготовка. Внутри Emacs, вызовите функцию server-start. (Ваш файл `.emacs' может делать это автоматически, если вы добавите в него выражение (server-start).) Затем, извне Emacs, установите переменную среды `EDITOR' равной `emacsclient'. (Заметьте, что некоторые программы используют другую переменную среды; например, чтобы TeX использовал `emacsclient', вам нужно установить переменную среды `TEXEDIT' равной `emacsclient +%d %s'.)

Впоследствии, когда любая программа вызывает указанную программу `EDITOR', в результате вашему главному Emacs будет отправлено сообщение, чтобы он обратился к файлу. (Программа emacsclient делает именно это.) Emacs немедленно показывает этот буфер, и вы сразу можете начать его редактирование.

Когда вы завершите редактирование этого буфера, наберите C-x # (server-edit). Это сохранит файл и пошлет программе emacsclient сообщение, приказывающее выйти. Программы, использующие `EDITOR', ожидают, пока "редактор" (на самом деле, emacsclient) не выйдет. C-x # также проверяет другие отложенные внешние запросы на редактирование различных файлов и выбирает следующий.

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

Если вы установите переменную server-window равной окну или фрейму, C-x # будет показывать серверный буфер в этом окне или фрейме.

Пока mail или другое приложение ожидает завершения emacsclient, emacsclient не читает терминальный ввод. Поэтому терминал, который использовала mail, как бы блокируется на это время. Чтобы редактировать в вашем главном Emacs, вам нужна возможность использовать Emacs без этого терминала. Есть два способа добиться этого:

  • Используя оконную систему, запускайте mail и главный Emacs в двух разных окнах. Пока mail ожидает emacsclient, окно, в котором она запущена, блокируется, но вы можете использовать Emacs, переключив окно.
  • Используйте для запуска других программ, таких как mail, режим Shell в Emacs; тогда emacsclient блокирует только подоболочку в Emacs, и вы можете продолжать использовать Emacs для редактирования этого файла.

Некоторые программы записывают для вашего редактирования временные файлы. После того, как вы отредактировали такой временный файл, программа считывает его и удаляет. Если сервер Emacs позже попросят отредактировать файл с тем же именем, он не должен предполагать, что этот файл имеет какое-либо отношение к предыдущему появлению этого же имени. Сервер делает это, уничтожая буфер временного файла, когда вы закончили с ним. Используйте переменную server-temp-file-regexp, чтобы указать, какие файлы являются временными в этом смысле; её значением должно быть регулярное выражение, совпадающее с именами временных файлов.

Если вы запускаете emacsclient с ключом --no-wait, он возвращается сразу, не дожидаясь, пока вы "завершите" с буфером в Emacs.

Вывод твердой копии

Команды Emacs для создания твердой копии позволяют вам напечатать весь буфер или только его часть с заголовками или без них. Смотрите также команды печати Dired (смотрите раздел Разнообразные действия над файлами) и дневника (смотрите раздел Команды для просмотра записей в дневнике).

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

Все команды печати (кроме использующих Postscript) передают программе lpr дополнительные ключи, базирующиеся на значении переменной lpr-switches. Её значение должно быть списком строк, причем каждая строка -- это ключ, начинающийся с `-'. Например, чтобы сделать ширину строк равной восьмидесяти столбцам для всех распечаток, получаемых из Emacs, установите lpr-switches так:

(setq lpr-switches '("-w80"))

Вы можете указать, какой принтер должен использоваться, установив переменную printer-name.

Переменная lpr-command задаёт имя используемой программы печати; значение по умолчанию зависит от типа вашей операционной системы. На большинстве систем это "lpr". Переменная lpr-headers-switches похожим образом задаёт дополнительные ключи для создания заголовков страниц. Переменная lpr-add-switches указывает, нужно ли передавать программе печати ключи `-T' и `-J' (подходящие для lpr): nil означает, что добавлять их не надо. lpr-add-switches должна быть равна nil, если ваша программа печати не совместима с lpr.

Печать через Postscript

Эти команды преобразуют содержимое буфера в Postscript и либо печатают его, либо оставляют в другом буфере Emacs.

M-x ps-print-buffer
Выводит распечатку текущего буфера в форме Postscript.
M-x ps-print-region
Выводит распечатку текущей области в форме Postscript.
M-x ps-print-buffer-with-faces
Выводит распечатку текущего буфера в форме Postscript, показывая использованные в тексте начертания средствами Postscript.
M-x ps-print-region-with-faces
Выводит распечатку текущей области в форме Postscript, показывая использованные в тексте начертания средствами Postscript.
M-x ps-spool-buffer
Генерирует Postscript для текста текущего буфера.
M-x ps-spool-region
Генерирует Postscript для текущей области.
M-x ps-spool-buffer-with-faces
Генерирует Postscript для текущего буфера, показывая использованные начертания.
M-x ps-spool-region-with-faces
Генерирует Postscript для текущей области, показывая использованные начертания.

Команды работы с Postscript, ps-print-buffer и ps-print-region, печатают содержимое буфера в форме Postscript. Одна команда печатает весь буфер, другая -- только область. Соответствующие команды с окончанием `-with-faces', ps-print-buffer-with-faces и ps-print-region-with-faces, используют средства Postscript для передачи начертаний (шрифтов и цветов) в свойствах печатаемого текста.

Если вы используете цветной дисплей, вы можете напечатать буфер, содержащий код программы, с цветовой подсветкой, включив в этом буфере режим Font-Lock и вызвав ps-print-buffer-with-faces.

Команды, чьи имена содержат `spool' на месте `print', генерируют вывод Postscript в буфере Emacs, а не посылают его на принтер.

Переменные, управляющие печатью в Postscript

Все команды печати через Postscript используют переменные ps-lpr-command и ps-lpr-switches, указывающие, как нужно печатать. ps-lpr-command задаёт имя запускаемой команды, ps-lpr-switches задаёт ключи командной строки, а ps-printer-name задаёт принтер. Если вы не установили первые две переменные сами, они получают свои начальные значения от lpr-command и lpr-switches. Если ps-printer-name равна nil, используется printer-name.

Переменная ps-print-header контролирует, будут ли эти команды добавлять строки заголовка для каждой страницы, -- установите её равной nil, чтобы выключить заголовки. Вы можете отключить обработку цветов, установив ps-print-color-p в значение nil.

Переменная ps-paper-type указывает, для какого размера станицы нужно форматировать; допустимые значения включают a4, a3, a4small, b4, b5, executive, ledger, legal, letter, letter-small, statement, tabloid. По умолчанию это letter. Вы можете определить дополнительные размеры бумаги, изменяя переменную ps-page-dimensions-database.

Переменная ps-landscape-mode указывает ориентацию текста на странице. По умолчанию она равна nil, что обозначает "портретный" режим. Любое отличное от nil значение задаёт "ландшафтный" режим.

Переменная ps-number-of-columns задаёт число колонок; она играет роль и в "портретном", и в "ландшафтном" режиме. По умолчанию это 1.

Переменная ps-font-family указывает, какое семейство шрифтов нужно использовать при печати обычного текста. Допустимые значения включают Courier, Helvetica, NewCenturySchlbk, Palatino и Times. Переменная ps-font-size задаёт размер шрифта для обычного текста. По умолчанию это 8.5 пунктов.

Многие другие переменные для настройки этих команд определены и описаны в файле на Лиспе `ps-print.el'.

Сортировка текста

Emacs предоставляет несколько команд для сортировки текста в буфере. Все они оперируют с содержимым области (текстом между точкой и меткой). Эти команды разделяют текст области на большое число записей сортировки, определяют ключ сортировки для каждой записи и затем переставляют записи в порядке, определяемом ключами сортировки. Записи располагаются таким образом, чтобы их ключи находились в алфавитном или, для числовой сортировки, числовом порядке. При алфавитной сортировке все буквы верхнего регистра от `A' до `Z' идут перед `а' нижнего регистра, в соответствии с последовательностью знаков ASCII.

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

M-x sort-lines
Разделить область на строки и отсортировать в соответствии с полным текстом строки. Числовой аргумент означает сортировку по убыванию.
M-x sort-paragraphs
Разделить область на абзацы и отсортировать, сравнивая текст абзацев целиком (за исключением пустых строк в начале). Числовой аргумент означает сортировку по убыванию.
M-x sort-pages
Разделить область на страницы и отсортировать, сравнивая полный текст страниц (за исключением пустых строк в начале). Числовой аргумент означает, что сортировка производится по убыванию.
M-x sort-fields
Разделить область на строки и отсортировать, сравнивая содержимое одного поля в каждой строке. Поля разделяются пропусками, так что первый отрезок последовательных непробельных знаков в строке составляет поле 1, второй такой отрезок составляет поле 2, и так далее. Поле, по которому должна производится сортировка, указывается с помощью числового аргумента: 1 используется для сортировки по полю 1, и так далее. Отрицательный аргумент означает отсчет полей справа, а не слева; то есть минус 1 обозначает сортировку по последнему полю. Если содержание полей сортировки в нескольких строках одинаково, эти строки остаются в том же относительном порядке, в каком они были изначально.
M-x sort-numeric-fields
Эта команда подобна M-x sort-fields, за исключением того, что для каждой строки указанное поле превращается в число, и сравниваются уже эти числа. `10' предшествует `2', когда рассматривается как текст, но следует за `2', когда рассматривается как число.
M-x sort-columns
Как M-x sort-fields, за исключением того, что используемый для сравнения текст получается в пределах каждой строки из фиксированного диапазона столбцов. Объяснение приведено ниже.
M-x reverse-region
Обратить порядок строк в области. Это полезно для сортировки в порядке убывания по полям или колонкам, так как данные команды сортировки не имеют средств для этого.

Например, если буфер содержит такой текст:

On systems where clash detection (locking of files being edited) is
implemented, Emacs also checks the first time you modify a buffer
whether the file has changed on disk since it was last visited or
saved. If it has, you are asked to confirm that you want to change
the buffer.

применение M-x sort-lines ко всему буферу даст следующее:

On systems where clash detection (locking of files being edited) is
implemented, Emacs also checks the first time you modify a buffer
saved. If it has, you are asked to confirm that you want to change
the buffer.
whether the file has changed on disk since it was last visited or

где заглавная `O' идет перед всеми строчными буквами. Если вы вместо этого примените C-u 2 M-x sort-fields, то получите следующее:

implemented, Emacs also checks the first time you modify a buffer
saved. If it has, you are asked to confirm that you want to change
the buffer.
On systems where clash detection (locking of files being edited) is
whether the file has changed on disk since it was last visited or

где ключами сортировки были `Emacs', `If', `buffer', `systems' и `the'.

M-x sort-columns требует более подробного объяснения. Вы указываете колонки, устанавливая точку на одном столбце, а метку -- на другом. Так как это означает, что вы не можете поставить точку или метку в начале первой строки, с которой должна начаться сортировка, то эта команда использует необычное определение `области': вся строка с точкой рассматривается как часть области, и так же все содержимое строки, в которой находится метка, и все строки между ними.

Например, для сортировки таблицы по информации, размещенной в столбцах с 10 по 15, метку можно поставить в первой строке таблицы в столбце 10, а точку в столбце 15 в последней строке таблицы и затем запустить sort-columns. Или вы можете поставить метку в столбце 15 в первой строке, а точку -- в столбце 10 в последней строке.

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

Многие команды сортировки игнорируют при сравнениях различие в регистре букв, если sort-fold-case не равна nil.

Сужение

Сужение означает сосредоточение на некоторой части буфера, при котором оставшаяся часть становится временно недоступной. Та часть, в которую вы всё ещё можете попасть, называется доступной частью. Отмена сужения и переход в состояние, когда весь буфер снова становится доступным, называется расширением. Размер действующего сужения буфера в какое-либо время называется ограничением этого буфера.

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

C-x n n
Сузить до области между точкой и меткой (narrow-to-region).
C-x n w
Расширить так, чтобы буфер снова стал полностью доступным (widen).
C-x n p
Сузить до текущей страницы (narrow-to-page).
C-x n d
Сузить до текущего определения функции (narrow-to-defun).

Когда вы сделали сужение до части буфера, эта часть -- все, что вы видите. Вы не можете видеть остальную часть, в нее невозможно перейти (команды движения не выйдут за пределы доступной части) и нельзя изменить её никаким образом. Но она не пропала, и если вы сохраняете файл, то сохранится и недоступная часть текста. При действии сужения в строке режима появляется слово `Narrow'.

Основной командой сужения является C-x n n (narrow-to-region). Она устанавливает ограничения для текущего буфера таким образом, что остается доступным только текст текущей области, но весь текст перед областью и после нее становится недоступным. Точка и метка не изменяются.

Еще вы можете использовать C-x n p (narrow-to-page) для сужения до текущей страницы. Смотрите раздел Страницы, определение страницы. C-x n d (narrow-to-defun) сужает до определения функции, содержащего точку (смотрите раздел Определения функций).

Отмена сужения выполняется командой C-x n w (widen). Она делает весь текст буфера снова доступным.

Вы можете получить информацию о том, до какой части сужен буфер, применив команду C-x =. Смотрите раздел Информация о позиции курсора.

Поскольку сужение может легко запутать пользователя, не понимающего его, команда narrow-to-region обычно заблокирована. При попытке её использования запрашивается подтверждение и предоставляется возможность её включения; если вы задействовали эту команду, подтверждение больше не требуется. Смотрите раздел Блокирование команд.

Редактирование текста в две колонки

Режим Two-column позволяет вам удобно редактировать текст в две колонки. Он использует два расположенных рядом окна, каждое из которых показывает свой буфер.

Есть два способа войти в двухколоночный режим:

F2 2 или C-x 6 2
Входит в режим two-column, слева появляется текущий буфер, а справа появляется буфер, чье имя основано на имени текущего буфера (2C-two-columns). Если правый буфер ещё не существует, изначально он делается пустым; содержимое текущего буфера не изменяется. Эта команда подходит, если текущий буфер пуст или содержит текст только одной колонки, и вы хотите добавить вторую.
F2 s or C-x 6 s
Разделяет текущий буфер с текстом в двух колонках на два буфера и показывает их рядом друг с другом (2C-split). Текущий буфер становится левым буфером, но текст из правой колонки перемещается в правый буфер. Текущий столбец определяет точку раздела. Разделение начинается от текущей строки и продолжается до конца буфера. Эта команда полезна, если у вас уже есть буфер с двухколоночным текстом, и вы хотите временно разделить колонки.
F2 b буфер RET
C-x 6 b буфер RET
Входит в режим two-column, используя текущий буфер в качестве левого и буфер буфер в качестве правого (2C-associate-buffer).

F2 s или C-x 6 s ищет разделитель колонок, который является строкой, стоящей между двух колонок на каждой строке. Вы можете задать ширину разделителя с помощью числового аргумента для F2 s; столько знаков, стоящих перед точкой, выразят строку-разделитель. По умолчанию ширина равна 1, поэтому разделитель колонок -- это знак перед точкой.

Когда строка содержит разделитель на своём месте, F2 s помещает текст после разделителя в правый буфер и удаляет разделитель. Строки, не имеющие разделителя колонок, оставляются неразбитыми; они остаются в левом буфере, а в правый буфер помещается для соответствия пустая строка. (Таким образом можно написать строку, которая "проходит по обеим колонкам в двухколоночном режиме": написать её в левом буфере и сделать пустую строку в правом буфере.)

Команда C-x 6 RET или F2 RET (2C-newline) вставляет знак новой строки в оба буфера в соответствующих позициях. Это самый простой способ добавить новую строку в двухколоночном тексте, когда вы редактируете его в разных буферах.

Когда вы отредактировали оба буфера, как вам хотелось, объедините их с помощью F2 1 или C-x 6 1 (2C-merge). Это копирует текст из правого буфера как вторую колонку другого буфера. Чтобы вернуться к редактированию в две колонки, используйте F2 s.

Используйте F2 d или C-x 6 d, чтобы разъединить два буфера, оставляя каждый как есть (2C-dissociate). Если другой буфер, не текущий в момент, когда вы набрали F2 d, оказался пустым, F2 d уничтожает его.

Редактирование двоичных файлов

Существует специальный основной режим для редактирования двоичных файлов: режим Hexl. Чтобы воспользоваться им, вызовите для обращения к файлу M-x hexl-find-file вместо C-x C-f. Эта команда преобразует содержимое файла в шестнадцатиричные числа и позволяет вам редактировать их. Когда вы сохраняете этот файл, он автоматически преобразуется обратно в двоичный формат.

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

Обычные знаки в режиме Hexl перезаписывают поверх существующего текста. Это сделано для уменьшения риска нечаянной потери выравнивания данных в файле. Для вставки есть особые команды. Вот перечень команд режима Hexl:

C-M-d
Вставляет байт с введенным десятичным кодом.
C-M-o
Вставляет байт с введенным восьмиричным кодом.
C-M-x
Вставляет байт с введенным шестнадцатиричным кодом.
C-x [
Перемещает на начало 1k-байтной "страницы".
C-x ]
Перемещает на конец 1k-байтной "страницы".
M-g
Перемещает к адресу, заданному шестнадцатиричным числом.
M-j
Перемещает к адресу, заданному десятичным числом.
C-c C-c
Покидает режим Hexl, возвращаясь к тому основному режиму, который был в этом буфере до того, как вы вызвали hexl-mode.

Сохранение сеансов Emacs

Вы можете использовать библиотеку Desktop для сохранения состояния Emacs от одного сеанса к другому. Сохранение состояния означает, что Emacs запускается с тем же самым набором буферов, основных режимов, позиций в буферах и прочим, какие были в предыдущем сеансе Emacs.

Чтобы использовать Desktop, вы должны воспользоваться буфером Customization (смотрите раздел Интерфейс для простой настройки) и установить desktop-enable в отличное от nil значение или добавить такие строки в ваш файл `.emacs':

(desktop-load-default)
(desktop-read)

Первый раз, когда вы сохраняете состояние сеанса Emacs, вы должны сделать это вручную, с помощью команды M-x desktop-save. Как только вы это сделали, при выходе из Emacs состояние будет сохраняться снова -- не только в существующем сеансе Emacs, но и во всех последующих. Вы также можете записать состояние в любое время не выходя из Emacs, снова набрав M-x desktop-save.

Чтобы Emacs восстановил состояние предыдущего сеанса, вы обязаны запустить его из того же каталога, который вы использовали в прошлом сеансе. Это необходимо, потому что desktop-read просматривает в поисках файла, который она должна прочитать, именно текущий каталог. Это означает, что вы можете хранить отдельные сохраненные сеансы в разных каталогах; каталог, в котором вы запускаете Emacs, будет указывать, какой из сохраненных сеансов вы хотите восстановить.

Переменная desktop-files-not-to-save говорит, какие файлы исключаются при сохранении состояния. Её значение -- это регулярное выражение, совпадающее с именами исключаемых файлов. По умолчанию исключаются удалённые (полученные по FTP) файлы; потому что повторное к ним обращение в последующем сеансе может быть медленным. Если вы хотите включить эти файлы в сохраненное состояние, установите desktop-files-not-to-save равной "^$". Смотрите раздел Удаленные файлы.

Уровни рекурсивного редактирования

Рекурсивное редактирование -- это ситуация, в которой вы используете команды Emacs для выполнения произвольного редактирования, находясь в середине другой команды Emacs. Например, при наборе команды C-r внутри query-replace происходит вход в рекурсивное редактирование, где можно изменить текущий буфер. Выходя из этого рекурсивного редактирования, вы возвращаетесь в query-replace.

Выход из рекурсивного редактирования означает возврат к незаконченной команде, которая продолжает выполняться. Выход производится с помощью команды C-M-c (exit-recursive-edit).

Вы можете также прервать рекурсивное редактирование. Это похоже на выход, но при этом происходит также и незамедлительный выход из незаконченной команды. Прерывание рекурсивного редактирования производится по команде C-] (abort-recursive-edit). Смотрите раздел Выход и аварийное завершение.

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

Возможно пребывание в рекурсивных редактированиях внутри рекурсивных редактирований. Например, после набора команды C-r в query-replace можно набрать команду, которая входит в отладчик. Это начинает уровень рекурсивного редактирования для отладчика внутри уровня рекурсивного редактирования для C-r. Строки режима показывают пару квадратных скобок для каждого работающего в данный момент уровня рекурсивного редактирования.

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

Напротив, команда M-x top-level прерывает все уровни рекурсивного редактирования, возвращаясь непосредственно на верхний командный уровень.

Текст, редактируемый внутри режима рекурсивного редактирования, не обязан быть тем же, что редактируется на верхнем уровне. Это зависит от того, для чего предназначалось рекурсивное редактирование. Если команда, которая запускает рекурсивное редактирование, выбирает вначале другой буфер, то он и будет буфером, который рекурсивно редактируется. В любом случае, внутри рекурсивного редактирования можно переключать буферы обычным способом (если ключи, переключающие буферы, не перепривязаны). Вероятно, можно оставаться внутри рекурсивного редактирования и до конца сеанса, обращаясь к файлам и делая там все прочее. Но время от времени это может приводить к неожиданным результатам (например, к переполнению стека). Поэтому не забывайте прерывать рекурсивное редактирование или выходить из него, если оно вам больше не нужно.

В основном мы стараемся минимизировать использование уровней рекурсивного редактирования в GNU Emacs. Это так, потому что они обязывают вас "возвращаться" в определённом порядке -- от самого внутреннего уровня к верхнему уровню. Если возможно, мы представляем различные виды деятельности в разных буферах, чтобы вы могли переключаться между ними, как вам нравится. Некоторые команды переключают в новый основной режим, который предоставляет команду для переключения назад. Эти методы дают вам большую гибкость для возврата к незаконченным занятиям в том порядке, в каком вы пожелаете.

Эмуляция

GNU Emacs может быть запрограммирован для эмуляции (в большей или меньшей степени) большинства других редакторов. Стандартные средства могут эмулировать следующее:

EDT (редактор DEC VMS)
Эмуляция EDT включается с помощью команды M-x edt-emulation-on. Команда M-x edt-emulation-off восстанавливает обычные для Emacs привязки. Большинство команд эмуляции EDT являются ключами вспомогательной клавиатуры, и большинство стандартных привязок ключей в Emacs остаются доступными. Перепривязки при эмуляции EDT выполняются в глобальной таблице ключей, таким образом, при нахождении в режиме эмуляции EDT нет проблемы переключения буферов или основных режимов.
vi (редактор Беркли)
Viper -- новейший эмулятор vi. Он реализует несколько уровней эмуляции: уровень 1 ближе всех к vi, тогда как уровень 5 отходит от строгой эмуляции, чтобы воспользоваться возможностями Emacs. Чтобы вызвать Viper, наберите M-x viper-mode; это проведет вас по остальному пути и спросит об уровне эмуляции. Смотрите Info файл `viper', ноду `Top'.
vi (другой эмулятор)
M-x vi-mode входит в основной режим, который заменяет прежде установленный режим. Все команды vi, которые в настоящем vi входят в режим "ввода", запрограммированы для возврата в предыдущий основной режим. Таким образом, обычный Emacs служит режимом "ввода" для vi. Поскольку эмуляция vi работает через основные режимы, переключать буфера в процессе эмуляции нельзя. Сначала необходимо вернуться в обычный Emacs. Если вы планируете часто использовать эмуляцию vi, то, вероятно, появится желание привязать ключ к команде vi-mode.
vi (еще один эмулятор)
M-x vip-mode вызывает ещё один эмулятор vi, про который говорят, что он соответствует настоящему vi более полно, чем M-x vi-mode. Режим "ввода" в этом эмуляторе отличается от обычного Emacs, так что для возврата в режим эмуляции vi можно использовать ESC. Для возврата из режима эмуляции vi в обычный Emacs необходимо набрать C-z. Этот режим эмуляции не работает через основные режимы, что обеспечивает возможность различных вариантов переключения буферов внутри эмулятора. Приписывать ключ команде vip-mode нет так необходимо, как в случае vi-mode, поскольку завершение режима вставки не использует её. Смотрите Info файл `vip', ноду `Top', для получения полной информации.

Диссошиэйтед Пресс

M-x dissociated-press -- это команда для перемешивания текстового файла слово за словом или знак за знаком. Имея в начале буфер с нормальным текстом, она формирует крайне забавный вывод. Ввод производится из текущего буфера Emacs. Диссошиэйтед Пресс записывает свой вывод в буфер с именем `*Dissociation*', при этом, чтобы облегчить его постепенное чтение, через каждую пару строк (примерно) содержимое буфера показывается заново.

Диссошиэйтед Пресс время от времени спрашивает, продолжать ли действие. Для остановки необходимо ответить n. Остановить можно также в любое время с помощью C-g. Диссоциированная выдача сохраняется в буфере `*Dissosiation*', чтобы по желанию можно было скопировать её в другое место.

Диссошиэйтед Пресс в процессе работы совершает беспорядочные прыжки из одной точки буфера в другую. Для получения правдоподобного вывода, а не тарабарщины, она соблюдает некоторое перекрытие между концом одного отрезка последовательности слов или знаков и началом следующего. Так, если только что она напечатала слово `президент' и теперь решает прыгнуть в другую точку файла, то она может заметить `ент' в слове `пентагон' и продолжить вывод отсюда, выдавая в результате `президентагон'.(13) Наилучшие результаты получаются на длинных выборках.

Положительный аргумент M-x dissociated-press велит ей работать познаково и определяет число перекрывающихся знаков. Отрицательный аргумент заставляет её действовать слово за словом и определяет количество перекрывающихся слов. В этом режиме целые слова, а не знаки, трактуются как переставляемые элементы. Отсутствие аргумента эквивалентно аргументу, равному двум. К сновашему сведению, вывод осуществляется только в буфер `*Dissociation*'. Буфер, с которого вы начали, не изменяется.

Диссошиэйтед Пресс производит примерно те же результаты, что и марковская цепь, основанная на частотной таблице, построенной по выборочному тексту. Однако, этот метод является независимым, игноригинальным изобретением. Диссошиэйтед Пресс повсеметодически копирует несколько последовательных знаков из выборки от прыжка к прыжку, тогда как цепь Маркова делала бы случайный выбор для каждого слова или знака. В итоге все это работает быстрее и придает результату более благозвучный вид.

Еще ркнем, что излишне интенсивное использование Диссошиэйтед Пресс может стать постомехой в вашей реальной работе. Подчас до уровня совергедии. И избегайте диссошислов в своей документации, если вы хотите быть для пользователей вполнятными и правословными. Позабавьтесь. Ваши бредложения горячо приветствуются.

Другие развлечения

Если вы немного заскучали, можете попробовать M-x hanoi. Если вам очень скучно, то задайте ей численный аргумент. Если вам очень-очень скучно, то попробуйте задать аргумент 9. Откиньтесь на спинку кресла и наблюдайте.

Если вам хочется больше личного участия, попробуйте команду M-x gomoku, которая сыграет с вами в пять-в-ряд.

M-x blackbox и M-x mpuz -- это две головоломки. blackbox предлагает вам определить с помощью томографии положение объектов внутри черного ящика. mpuz показывает задачу на умножение, где цифры заменены буквами, а как, вы должны догадаться. Чтобы сделать предположение, наберите букву, а затем цифру, которая, как вы думаете, обозначена этой буквой.

M-x dunnet запускает приключенческую игру; это большая головоломка.

Если вас расстроили, запустите знаменитую программу Eliza. Наберите просто M-x doctor. Каждый ввод заканчивайте двойным набором RET.

Когда вам будет не по себе, наберите M-x yow.

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



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