Эта глава содержит несколько небольших тем, которые не вписываются в другие главы: чтение сетевых новостей, запуск команд оболочки и подпроцессов оболочки, использование одного разделяемого Emacs для утилит, которые предполагают запуск редактора как подпроцесса, печать твердой копии, сортировка текста, сужение отображения до части буфера, редактирование двухколоночных и двоичных файлов, сохранение сеансов Emacs для последующего продолжения, эмуляция других редакторов и различные развлечения.
Gnus -- это пакет Emacs, разработанный в первую очередь для чтения и отправки новостей Usenet. Его также можно использовать для чтения и написания ответов на сообщения из многих других источников -- почты, удаленных каталогов, дайджестов и других.
Здесь мы даем введение в Gnus и описываем некоторые основные возможности. Для получения подробной информации о Gnus наберите M-x info и выберите затем руководство по Gnus.
Чтобы запустить Gnus, напечатайте M-x gnus RET.
В противоположность большинству обычных пакетов Emacs, Gnus использует для показа информации и получения команд несколько разных буферов. Большую часть времени пользователи проводят в трех буферах: буфере групп, буфере резюме и буфере статьи.
Буфер групп содержит перечень групп. Это первый буфер, который Gnus показывает после запуска. Обычно в нем показаны только те группы, на которые вы подписаны, и в которых есть непрочтенные статьи. Используйте этот буфер для выбора конкретной группы.
Буфер резюме построчно перечисляет статьи одной группы. По умолчанию для каждой статьи показываются автор, заголовок и число строк, но это можно настроить по своему вкусу, как и большую часть того, что отображает Gnus. Буфер резюме создается, когда вы выбираете группу в буфере групп, и уничтожается, когда вы покидаете эту группу. Используйте этот буфер для выбора статьи.
Буфер статьи показывает саму статью. При обычном использовании Gnus вы не выбираете этот буфер -- все полезные команды, предназначенные для действий над статьей, работают из буфера резюме. Но вы можете выбрать буфер статьи и выполнять все команды Gnus из него, если хотите.
При запуске Gnus считывает ваш файл инициализации новостей `.newsrc' и пытается установить связь с локальным сервером новостей, который служит хранилищем статей. Сервер новостей не обязан быть тем же компьютером, на который вы вошли.
Если вы запустили Gnus и соединились с сервером, но не видите в буфере групп ни одной группы, наберите L или A k, чтобы получить перечень всех групп. Затем нажимайте u, чтобы переключать подписку на группы.
Когда вы запускаете Gnus первый раз, он подписывает вас на несколько избранных групп. Все остальные группы сначала уничтожены с вашей точки зрения; вы можете получить их перечень с помощью A k. Все новые группы, появляющиеся в дальнейшем на сервере, становятся для вас зомбированными; наберите A z, чтобы получить их перечень. Вы можете подписаться на группы, показанные в этих списках, используя команду u.
Когда вы покидаете Gnus при помощи q, он автоматически записывает в ваших файлах инициализации `.newsrc' и `.newsrc.eld' статус подписки всех групп. Обычно вам не стоит редактировать эти файлы вручную, но вы можете это делать, если знаете как.
Чтение новостей -- это двухшаговый процесс:
Каждый буфер Gnus имеет свои особые команды; однако, смысл любого данного ключа в различных буферах Gnus обычно аналогичен, даже если и различается. Вот команды буферов групп и резюме:
В Emacs есть команды для передачи одиночных командных строк подчиненным процессам оболочки. Существует возможность интерактивного запуска оболочки с вводом и выводом в буфер Emacs с именем `*shell*'.
shell-command
).
shell-command-on-region
).
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, в котором определено несколько специальных ключей, привязанных к префиксу C-c. Они выбраны так, что имитируют обычные клавиши редактирования и управления заданиями, присутствующие в оболочках вне Emacs, с той лишь разницей, что сначала вы должны набрать C-c. Ниже приведен полный список таких ключей режима Shell.
send-shell-input
). При копировании строки любой текст в ее
начале, соответствующий переменной shell-prompt-pattern
,
пропускается; значение этой переменной должно быть регулярным
выражением, которое соответствует подсказкам, используемым в вашей
оболочке.
comint-dynamic-complete
). TAB также завершает ссылки на
историю (смотрите раздел Ссылки на историю оболочки) и имена переменных среды.
Переменная shell-completion-fignore
задает список расширений
файлов, которые должны игнорироваться при завершении в режиме Shell.
Установка по умолчанию игнорирует имена файлов, заканчивающиеся на
`~', `#' или `%'. Другие родственные с Comint режимы
используют переменную comint-completion-fignore
.
comint-dynamic-list-filename-completions
).
comint-delchar-or-maybe-eof
). Набранный в конце буфера
оболочки, C-d посылает подоболочке EOF. Набранный в любой
другой позиции в этом буфере, C-d удаляет один знак, как обычно.
comint-bol
). Если вы наберете эту команду два раза подряд, на
второй раз она возвращает к метке процесса, то есть к началу ввода,
который вы еще не послали подоболочке. (Обычно это одно и то же место
--- конец подсказки в текущей строке -- но после C-c SPC
метка процесса может оказаться на предыдущей строке.)
comint-kill-input
).
backward-kill-word
).
comint-interrupt-subjob
). Эта команда уничтожает также весь
предназначенный для ввода текст, который еще не был послан.
comint-stop-subjob
). Эта команда уничтожает также весь текст,
который еще не был послан в качестве ввода.
comint-quit-subjob
). Эта команда уничтожает также
весь предназначенный для ввода текст, который еще не был послан.
comint-kill-output
). Это полезно, если команда оболочки
извергает много текста, который только мешает.
comint-show-output
).
comint-show-maximum-output
).
shell-forward-command
). Переменная shell-command-regexp
указывает, как распознать конец команды.
shell-backward-command
).
comint-dynamic-list-input-ring
).
(add-hook 'comint-output-filter-functions
'comint-watch-for-password-prompt)
(add-hook 'comint-output-filter-functions
'comint-strip-ctrl-m)
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 и 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' в других оболочках.
comint-previous-prompt
).
comint-next-prompt
).
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
.
Если переменная 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, чтобы установить соединение по 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
, чтобы переключать эти
режимы. Отсутствие аргумента обозначает использование имен удаленных
каталогов, положительный аргумент обозначает использование локальных
имен, а отрицательный выключает отслеживание каталогов.
Различные программы, такие как 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 (смотрите раздел Разнообразные действия над файлами) и дневника (смотрите раздел Команды для просмотра записей в дневнике).
print-buffer
, но печатать только текущую область.
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 и либо печатают его, либо оставляют в другом буфере Emacs.
Команды работы с 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 используют переменные
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.
Различие команд сортировки состоит в том, как они делят текст на записи сортировки, и какая часть каждой записи используется в качестве ключа сортировки. Большинство команд считают каждую строку отдельной записью, но некоторые используют в качестве таких записей абзацы или страницы. Большинство команд сортировки используют всю запись сортировки в качестве своего собственного ключа, но некоторые используют в качестве ключа сортировки только часть записи.
Например, если буфер содержит такой текст:
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
.
Сужение означает сосредоточение на некоторой части буфера, при котором оставшаяся часть становится временно недоступной. Та часть, в которую вы все еще можете попасть, называется доступной частью. Отмена сужения и переход в состояние, когда весь буфер снова становится доступным, называется расширением. Размер действующего сужения буфера в какое-либо время называется ограничением этого буфера.
Сужение может помочь сконцентрироваться на единственной подпрограмме или абзаце, убирая лишнее. Оно также может быть использовано для ограничения диапазона действия команды замены или повторяющегося макроса клавиатуры.
narrow-to-region
).
widen
).
narrow-to-page
).
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 позволяет вам удобно редактировать текст в две колонки. Он использует два расположенных рядом окна, каждое из которых показывает свой буфер.
Есть два способа войти в двухколоночный режим:
2C-two-columns
). Если правый буфер еще не существует,
изначально он делается пустым; содержимое текущего буфера не изменяется.
Эта команда подходит, если текущий буфер пуст или содержит текст только
одной колонки, и вы хотите добавить вторую.
2C-split
). Текущий буфер
становится левым буфером, но текст из правой колонки перемещается в
правый буфер. Текущий столбец определяет точку раздела. Разделение
начинается от текущей строки и продолжается до конца буфера.
Эта команда полезна, если у вас уже есть буфер с двухколоночным текстом,
и вы хотите временно разделить колонки.
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:
hexl-mode
.
Вы можете использовать библиотеку 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 может быть запрограммирован для эмуляции (в большей или меньшей степени) большинства других редакторов. Стандартные средства могут эмулировать следующее:
vi-mode
.
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.