Команды для естественных языков

Термин текст имеет два широко распространенных значения в нашей области компьютерной науки. Одно -- это данные, которые являются последовательностью знаков. Любой файл, который вы редактируете при помощи Emacs, -- это текст в этом смысле слова. Другое значение более узкое: последовательность знаков на естественном языке, предназначенная для чтения людьми (возможно после обработки форматированием), в противоположность программам или командам для программы.

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

Emacs имеет несколько основных режимов для редактирования текста на естественном языке. Если файл содержит несложный чистый текст, используйте режим Text, который быстро настраивает Emacs на синтаксические условности текста. Режим Outline предоставляет особые команды для действий с со структурированным текстом. Смотрите раздел Режим Outline.

Для текста, который содержит встроенные команды для программ форматирования, Emacs имеет другие основные режимы, свой для каждого формата. Таким образом, для ввода в TeX вы должны использовать режим TeX (смотрите раздел Режим TeX). Для ввода в nroff -- режим Nroff.

Вместо использования программы форматирования, вы можете редактировать форматированный текст в стиле WYSIWYG ("what you see is what you get")(6) с помощью режима Enriched. Тогда форматирование появляется на экране в Emacs во время редактирования. Смотрите раздел Редактирование форматированного текста.

Слова

В Emacs существуют команды для передвижения по словам или воздействия на них. По соглашению, все ключи для этого являются Meta-знаками.

M-f
Перейти вперёд через слово (forward-word).
M-b
Перейти назад через слово (backward-word).
M-d
Уничтожить вперёд все вплоть до конца слова (kill-word).
M-DEL
Уничтожить назад все вплоть до начала слова (backward-kill-word).
M-@
Пометить конец следующего слова (mark-word).
M-t
Переставить два слова или перенести одно слово через другие слова (transpose-words).

Заметьте, как эти ключи образуют ряд, который соответствует ключам, работающим со знаками: C-f, C-b, C-d, DEL и C-t. M-@ соответствует C-@, которая иначе называется C-SPC.

Команды M-f (forward-word) and M-b (backward-word) передвигают вперёд или назад через слова. Таким образом, эти Meta-знаки аналогичны C-f и C-b, которые передвигают через одиночные знаки в тексте. Аналогия распространяется на числовые аргументы, которые служат счетчиками повторов. M-f с отрицательным аргументом передвигает назад, а M-b с отрицательным аргументом передвигает вперёд. Движение вперёд останавливается сразу после последней буквы слова, тогда как движение назад останавливается сразу перед первой буквой.

M-d (kill-word) уничтожает слово после точки. Точнее, она уничтожает всё от точки до того места, куда переместила бы команда M-f. Таким образом, если точка находится в середине слова, M-d уничтожает только часть слова после точки. Если между точкой и следующим словом находятся какие-то знаки препинания, то они уничтожаются вместе со словом. (Если вы хотите уничтожить только следующее слово, но не уничтожать знаки препинания перед ним, то просто сделайте M-f, чтобы перейти на конец, и уничтожьте слово в обратном направлении при помощи M-DEL.) M-d трактует аргументы точно так же, как M-f.

M-DEL (backward-kill-word) уничтожает слово перед точкой. Она уничтожает всё от точки назад к тому месту, куда передвинула бы M-b. Если точка находится после пробела в `FOO, BAR', то уничтожается `FOO, '. (Если вы хотите уничтожить просто `FOO', сделайте M-b M-d вместо M-DEL.)

M-t (transpose-words) меняет местами слово, стоящее перед точкой или содержащее её, со следующим словом. Разграничительные знаки между словами не сдвигаются. Например, `FOO, BAR' превращается в `BAR, FOO', а не в `BAR FOO,'. Для более подробной информации о перестановках и аргументах команд перестановки смотрите раздел Перестановка текста.

Чтобы подействовать на следующие n слов с помощью операции, которая применяется между точкой и меткой, вы можете либо установить метку в точке и затем передвинуть точку через слова, либо использовать команду M-@ (mark-word), которая не перемещает точку, но устанавливает метку туда, куда её передвинула бы команда M-f. M-@ принимает числовой аргумент, который говорит, через сколько слов нужно поместить метку. В режиме Transient Mark эта команда активизирует метку.

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

Предложения

Команды Emacs для действий над предложениями и абзацами в большинстве своем приданы Meta-ключам, чтобы они были подобны командам работы со словами.

M-a
Перейти назад к началу предложения (backward-sentence).
M-e
Перейти вперёд к концу предложения (forward-sentence).
M-k
Уничтожить вперёд до конца предложения (kill-sentence).
C-x DEL
Уничтожить все в обратном направлении до начала предложения (backward-kill-sentence).

Команды M-a и M-e (backward-sentence и forward-sentence) передвигают точку к началу и к концу текущего предложения, соответственно. Они выбраны так, чтобы напоминать C-a и C-e, которые сдвигают к концу и началу строки. В отличие от них, M-a и M-e при повторении или с заданными числовыми аргументами передвигают через последовательные предложения.

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

Точно так же, как C-a и C-e имеют соответствующую им команду уничтожения C-k , так и M-a и M-e имеют соответствующую команду уничтожения M-k (kill-sentence), которая уничтожает все от точки до конца предложения. С аргументом, равным минус единице, она уничтожает в обратном направлении до начала предложения. Большие аргументы служат для подсчета повторов. Есть также особая команда C-x DEL (backward-kill-sentence) для уничтожения в обратном направлении к началу предложения. Она удобна, когда вы меняете свое решение в процессе сочинения текста.

Команды работы с предложениями предполагают, что вы следуете соглашению американских машинисток -- ставить в конце предложения два пробела; они считают предложение оконченным, если там есть знаки `.', `?' или `!', за которыми следует конец строки или два пробела; в середине допустимо любое число знаков `)', `]' или `"'. Предложение также начинается или кончается, если начинается или кончается абзац.

Переменная sentence-end управляет распознаванием конца предложения. Это регулярное выражение, которое соответствует последним нескольким знакам предложения вместе с пробелами, следующими за предложением. Его нормальное значение таково:

"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"

Этот пример объясняется в разделе о регулярных выражениях. Смотрите раздел Синтаксис регулярных выражений.

Если вы хотите использовать между предложениями только один пробел, вам нужно установить sentence-end в такое значение:

"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"

Вам нужно также установить переменную sentence-end-double-space равной nil, чтобы команды заполнения ожидали и оставляли в конце предложений только один пробел. Заметьте, что при этом невозможно отличить точки, завершающие предложения, и точек в сокращениях.

Абзацы

Команды Emacs для работы с абзацами -- это также Meta-ключи.

M-{
Перейти назад к началу предыдущего абзаца (backward-paragraph).
M-}
Переместиться вперёд к концу следующего абзаца (forward-paragraph).
M-h
Поставить точку и метку вокруг этого или следующего абзаца (mark-paragraph).

M-{ двигает точку в начало текущего или предыдущего абзаца, в то время как M-} двигает её к концу текущего или следующего абзаца. Абзацы разделяются пустыми строками и строками команд форматирования текста, которые в свою очередь не являются частью какого-либо абзаца. В режиме Fundamental, но не в режиме Text, строка с отступом также начинает новый абзац. (Если перед абзацем стоит пустая строка, данные команды считают эту пустую строку началом абзаца.)

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

Когда имеется префикс заполнения, абзацы ограничиваются всеми строками, которые не начинаются с этого префикса. Смотрите раздел Заполнение текста.

Когда вы захотите оперировать с абзацем, вы можете использовать команду M-h (mark-paragraph), чтобы установить вокруг него область. Таким образом, например, M-h C-w уничтожает абзац вокруг или после точки. Команда M-h ставит точку в начале абзаца, содержащего точку, и метку в его конце. В режиме Transient Mark она активизирует метку. Если точка находится между абзацами (в области пустых строк или на границе), то точкой и меткой окружается абзац, следующий за точкой. Если первой строке абзаца предшествуют пустые строки, то одна из этих пустых строк включается в область.

Точным определением границ абзаца управляют две переменные: paragraph-separate и paragraph-start. Значение paragraph-start -- это регулярное выражение, которое должно соответствовать любой строке, которая либо начинает, либо разделяет абзацы. Значение paragraph-separate -- это еще одно регулярное выражение, которое должно соответствовать только строкам, которые разделяют абзац, но не являются частью какого-либо абзаца (например, пустые строки). Строки, которые начинают новый абзац и содержатся в нем, должны соответствовать только paragraph-start, но не paragraph-separate. Например, в режиме Fundamental, paragraph-start равна "[ \t\n\f]", а paragraph-separate -- это "[ \t\f]*$".

Обычно желательно, чтобы границы страниц разделяли абзацы. Значения по умолчанию этих переменных распознают обычный разделитель страниц.

Страницы

Очень часто файлы представляются разделенными на страницы с помощью знаков прогона (или перевода) страницы (ASCII Control-L, восьмиричный код 014). Когда вы печатаете файл, этот знак принудительно разбивает страницу; таким образом, каждая страница файла будет начинаться на новом листе бумаги. Большинство команд Emacs рассматривают знак-разделитель страниц точно так же, как любые другие знаки: вы можете вставить их при помощи C-q C-l или удалить с помощью DEL. Таким образом, вы свободны в выборе, делить на страницы ваш файл или нет. Однако, из-за того, что деление на страницы часто является смысловым делением файла, то предусмотрены команды для перемещения по страницам и для действий над ними.

C-x [
Сместить точку к предыдущей странице (backward-page).
C-x ]
Сместить точку к следующей странице (forward-page).
C-x C-p
Поставить точку и метку по краям этой (или другой) страницы (mark-page).
C-x l
Сосчитать строки в этой странице (count-lines-page).

Команда C-x [ (backward-page) двигает точку к позиции непосредственно после предыдущего разделителя страницы. Если точка уже находится сразу после разделителя, то команда пропускает эту страницу и останавливается на предшествующей ей. Числовой аргумент служит в качестве счетчика повторов. Команда C-x ] (forward-page) передвигает точку вперёд, пропуская следующий разделитель страниц.

Команда C-x C-p (mark-page) ставит точку в начале текущей страницы, а метку в её конце. Разделитель страниц в конце включается в область (метка следует за ним). Разделитель страниц в начале не включается (точка следует за ним). C-x C-p C-w даёт удобный способ уничтожить страницу или переместить её в другое место. Если вы сдвинитесь к разделителю ещё одной страницы с помощью C-x [ и C-x ], а затем восстановите уничтоженную страницу, все страницы будут снова правильно разграничины. C-x C-p включает в область только разделитель следующей страницы именно для этого.

Числовой аргумент для C-x C-p используется для указания страницы, к которой необходимо отправиться, относительно текущей. Ноль означает текущую страницу. Единица означает следующую страницу, а -1 -- предыдущую.

Команда C-x l (count-lines-page) хороша для принятия решения, где разорвать страницу на две. Она печатает в эхо-области общее число строк в текущей странице и затем делит её на те, которые предшествуют текущей строке, и на те, что следуют за ней, как в примере:

Page has 96 (72+25) lines(7)

Заметьте, что значение суммы на единицу меньше; это верно, если точка не стоит в начале строки.

Переменная page-delimiter говорит, где начинается страница. Её значение -- это регулярное выражение, соответствующее началу строки, которая разделяет страницы. Обычное значение этой переменной равно "^\f", что соответствует знаку перевода страницы в начале строки.

Заполнение текста

Заполнение текста означает разбиение его на строки определённой длины. Emacs может делать заполнение двумя способами. В режиме Auto Fill, вставка текста с помощью самовставляющихся знаков также автоматически заполняет его. Есть также явные команды для заполнения, которые вы можете использовать, когда редактирование текста оставляет его незаполненным. Когда вы редактируете форматированный текст, вы можете задать стиль заполнения каждого фрагмента (смотрите раздел Редактирование форматированного текста).

Режим Auto Fill

Режим Auto Fill -- это второстепенный режим, в котором строки обрываются автоматически, когда становятся слишком длинными. Разрыв происходит только тогда, когда вы набираете SPC или RET.

M-x auto-fill-mode
Включение и выключение режима Auto Fill.
SPC
RET
В режиме Auto Fill прерывает строку, если это нужно.

M-x auto-fill-mode включает режим Auto Fill, если он был отключен, или выключает, если он был включён. С положительным аргументом она всегда включает режим Auto Fill, а отрицательным --- всегда отключает. Вы можете видеть, когда режим Auto Fill действует, по присутствию слова `Fill' в строке режима внутри круглых скобок. Режим Auto Fill -- второстепенный режим, включаемый или выключаемый для каждого буфера отдельно. Смотрите раздел Второстепенные режимы.

В режиме Auto Fill строки автоматически разрываются на пробелах, когда они становятся длиннее желаемой величины. Прерывание и перерасположение строки происходит, только когда вы набираете SPC или RET. Если вы хотите вставить пробел или знак новой строки с запретом прерывания строки, наберите C-q SPC или C-q C-j (напомним, что знак новой строки -- это на самом деле control-J). C-o также вставляет новую строку без прерывания строки.

Режим Auto Fill хорошо работает с режимами для языков программирования, так как он делает в новых строках отступ с помощью TAB. Если строка, заканчивающаяся комментарием, получилась слишком длинной, то текст комментария разбивается на две строки. Возможно, в конце первой строки и в начале второй вставятся новые ограничители комментариев, таким образом, чтобы каждая строка стала отдельным комментарием; этим выбором управляет переменная comment-multi-line (смотрите раздел Управление комментариями).

Адаптивное заполнение (смотрите следующий раздел) работает с режимом Auto Fill так же, как с явными командами заполнения. Оно автоматически берёт префикс заполнения из второй или первой строки абзаца.

Режим Auto Fill не перезаполняет целые абзацы; он может прерывать строки, но не может их объединять. Таким образом, редактирование в середине абзаца может привести к созданию абзаца, который неправильно заполнен. Простейшим способом сделать абзац снова правильно заполненным обычно служит применение явных команды заполнения.

Многие пользователи любят режим Auto Fill и хотят использовать его во всех текстовых файлах. Раздел о файлах инициализации рассказывает, как устроить, чтобы это было для вас постоянным. Смотрите раздел Файл инициализации, `~/.emacs'.

Явные команды заполнения

M-q
Заполнить текущий абзац (fill-paragraph).
C-x f
Установить столбец заполнения (set-fill-column).
M-x fill-region
Заполнить каждый абзац в области (fill-region).
M-x fill-region-as-paragraph
Заполнить область, рассматривая её как один абзац.
M-s
Отцентрировать строку.

Чтобы перезаполнить один абзац, используйте команду M-q (fill-paragraph). Она действует на абзац, в котором находится точка, или на абзац после точки, если она стоит между абзацами. Перезаполнение работает путем удаления всех разрывов строк и вставки новых в тех местах, где это требуется.

Чтобы перезаполнить много абзацев, используйте M-x fill-region, которая делит область на абзацы и заполняет каждый из них.

Команды M-q и fill-region используют для нахождения границ абзаца тот же самый критерий, что и M-h (смотрите раздел Абзацы). Для большего контроля, вы можете использовать M-x fill-region-as-paragraph, которая перезаполняет все между точкой и меткой. Эта команда удаляет в области все пустые строки, поэтому отдельные блоки текста в результате объединяются в один блок.

Числовой аргумент для M-q приводит к тому, что помимо заполнения, текст ещё и выравнивается. Это значит, что вставляются дополнительные пробелы, чтобы правый край строки попадал точно в столбец заполнения. Чтобы уничтожить дополнительные пробелы, используйте M-q без аргумента. (Аналогично и для fill-region.) Другой способ управлять выравниванием или выбрать другие стили заполнения состоит в применении свойства текста justification; смотрите раздел Выравнивание в форматированном тексте.

Команда M-s (center-line) центрирует текущую строку в пределах текущего столбца заполнения. С аргументом n, она центрирует несколько строк отдельно и переходит через них.

Максимальная ширина строки для заполнения содержится в переменной fill-column. Изменение значения fill-column делает её локальной для текущего буфера; до этого момента действует значение по умолчанию. Изначально оно равно 70. Смотрите раздел Локальные переменные. Наилегчайший способ установить fill-column -- использовать команду C-x f (set-fill-column). Запущенная с числовым аргументом, она использует его в качестве нового столбца заполнения. Просто с C-u в качестве аргумента, она устанавливает fill-column соответственно текущей горизонтальной позиции точки.

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

Если переменная sentence-end-double-space равна nil, то команды заполнения ожидают и оставляют в конце предложений только один пробел. Обычно эта переменная равна t, поэтому команды заполнения настаивают на постановке двух пробелах в конце предложения, как объяснено выше. Смотрите раздел Предложения.

Если переменная colon-double-space не равна nil, команды заполнения ставят после двоеточия два пробела.

Префикс заполнения

Чтобы заполнить абзац, в котором каждая строка начинается с особого маркера (который может несколькими пробелами, что даёт абзац с отступом), используйте так называемый префикс заполнения. Префикс заполнения -- это цепочка знаков, с которой, по предположению Emacs, начинается каждая строка, и которая не включается в заполнение. Вы можете задать префикс заполнения явно; кроме того, Emacs может вычислять его автоматически (смотрите раздел Адаптивное заполнение).

C-x .
Установить префикс заполнения (set-fill-prefix).
M-q
Заполнить абзац, используя текущий префикс заполнения (fill-paragraph).
M-x fill-individual-paragraphs
Заполнить область, рассматривая каждое изменение отступа как начало нового абзаца.
M-x fill-nonuniform-paragraphs
Заполнить область, считая началом нового абзаца только строки-разделители абзацев.

Чтобы задать префикс заполнения, передвиньтесь к строке, которая начинается с желаемого префикса, поставьте точку в конец префикса и дайте команду C-x . (set-fill-prefix). После C-x стоит точка. Чтобы выключить префикс заполнения, определите пустой префикс: наберите C-x ., когда точка находится в начале строки.

Когда префикс заполнения в действии, команды заполнения уничтожают его в каждой строке перед заполнением и вставляют его в каждую строку после заполнения. Режим Auto Fill также автоматически вставляет в каждую вновь созданную строку префикс заполнения. Команда C-o вставляет в созданные ей строки префикс заполнения, когда вы используете её в начале строки (смотрите раздел Пустые строки). С другой стороны, команда M-^ уничтожает префикс (если он есть) после удаляемого перевода строки (смотрите раздел Отступы).

Например, если fill-column равна 40 и вы установили префикс заполнения равным `;; ', то M-q в таком тексте:

;; Это пример
;; абзаца внутри
;; комментария в стиле Лиспа.

дает следующее:

;; Это пример абзаца внутри комментария
;; в стиле Лиспа.

Строки, не начинающиеся с префикса заполнения, рассматриваются как начинающие абзац и в M-q, и в командах работы с абзацами; это даёт хорошие результаты для абзацев с висящим отступом (все строки, кроме первой, имеют отступ). Строки, ставшие пустыми или имеющими отступ после удаления префикса, также разделяют или начинают абзац; это именно то, что вы хотите, если вы пишете комментарии, состоящие из нескольких абзацев, с ограничителем комментария на каждой строке.

Вы можете использовать M-x fill-individual-paragraphs, чтобы установить префикс заполнения для каждого абзаца автоматически. Эта команда делит область на абзацы, считая любое изменение величины отступа началом нового абзаца, и заполняет каждый из этих абзацев. Таким образом, все строки одного "абзаца" имеют одинаковый отступ. Именно этот отступ служит префиксом заполнения для каждого абзаца.

M-x fill-nonuniform-paragraphs -- это похожая команда, которя делит область на абзацы другим способом. Она рассматривает только строки-разделители абзацев (как определено paragraph-separate) в качестве начинающих новый абзац. Поскольку это означает, что строки одного абзаца могут иметь разный отступ, в качестве префикса заполнения используется отступ наименьшего среди всех строк этого абзаца размера. Это даёт хорошие результаты для стилей, в которых первая строка абзаца имеет больший или меньший отступ, чем остальная часть абзаца.

Префикс заполнения хранится в переменной fill-prefix. Её значение -- это либо строка, либо nil, когда префикса заполнения нет. В каждом буфере для этой переменной есть свое значение; её изменение воздействует только на текущий буфер, но имеется и значение по умолчанию, которое вы также можете изменить. Смотрите раздел Локальные переменные.

Свойство текста indentation предоставляет другой способ управления величиной отступа абзаца. Смотрите раздел Отступы в форматированном тексте.

Адаптивное заполнение

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

Если в абзаце есть две или более строки, префикс заполнения берётся из второй, но только если он также появляется и в первой.

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

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

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

Если префикс, обнаруженный на первой строке, соответствует adaptive-fill-first-line-regexp, или он оказался последовательностью, начинающей комментарий (это зависит от основнего режима), то для заполнения абзаца используется этот найденный префикс, при условии, что он не будет действовать как начало абзаца в следующих строках.

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

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

Переменная adaptive-fill-regexp определяет, какие виды начала строки могут служить префиксом заполнения: используются любые знаки в начале строки, соответствующие этому регулярному выражению. Если вы установите переменную adaptive-fill-mode равной nil, префикс заполнения никогда не выбирается автоматически.

Вы можете задать более сложные методы автоматического выбора префикса заполнения, установив переменную adaptive-fill-function в значение функции. Эта функция вызывается, когда точка находится с левого края строки, и она должна вернуть подходящий префикс заполнения. Если она возвращет nil, это означает, что она не увидела в этой строке префикс заполнения.

Команды преобразования регистра

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

M-l
Перевести следующее слово в нижний регистр (downcase-word).
M-u
Перевести следующее слово в верхний регистр (upcase-word).
M-c
Сделать первую букву следующего слова заглавной, а остальные --- строчными (capitalize-word).
C-x C-l
Перевести область в нижний регистр (downcase-region).
C-x C-u
Перевести область в верхний регистр (upcase-region).

Команды преобразования слов наиболее полезны. M-l (downcase-word) переводит слово после точки в нижний регистр, передвигая точку за него. Таким образом, повторение M-l переводит последующие слова. M-u (upcase-word) переводит все слово в прописные буквы, в то время как M-c (capitalize-word) ставит первую букву слова в верхнем регистре, а остальные -- в нижнем регистре. Все эти команды переводят несколько слов за один раз, если им придать аргумент. Они особенно удобны для перевода большого объема текста, набранного полностью в верхнем регистре, в смешанный регистр, потому что вы можете двигаться по тексту, используя M-l, M-u или M-c, когда это необходимо, и используя иногда M-f, чтобы пропустить слово.

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

Если команда перевода регистра в словах даётся в середине слова, то она применяется только к части слова, которая следует за точкой. Это очень похоже на то, что делает M-d (kill-word). С отрицательным аргументом, перевод регистра применяется только к части слова перед точкой.

Другие команды перевода регистра -- это C-x C-u (upcase-region) и C-x C-l (downcase-region), которые переводят все между точкой и меткой в заданный регистр. Точка и метка не сдвигаются.

Команды перевода регистра в области, upcase-region и downcase-region, обычно заблокированы. Это означает, что они запрашивают подтверждение, если вы пытаетесь их использовать. При подтверждении вы можете включить эти команды, тогда они больше не будут запрашивать подтверждения. Смотрите раздел Блокирование команд.

Режим Text

Когда вы редактируете текстовые файлов на естественном языке, вам будет удобнее воспользоваться режимом Text, а не Fundamental. Чтобы войти в режим Text, наберите M-x text-mode.

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

В режиме Text TAB запускает функцию indent-relative (смотрите раздел Отступы), чтобы вам было удобно делать отступ как в предыдущей строке. Когда в предыдущей строке нет отступа, indent-relative запускает tab-to-tab-stop, которая использует устанавливаемые вами позиции табуляции (смотрите раздел Позиции табуляции).

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

Если вы делаете отступ в первой строке абзаца, вам нужно использовать режим Paragraph-Indent Text вместо режима Text. В этом режиме вам не обязательно ставить между абзацами пустые строки, потому что отступа в первой строке достаточно для начала нового абзаца; однако, абзацы, в которых каждая строка имеет отступ, не поддерживаются. Чтобы войти в этот режим, используйте M-x paragraph-indent-text-mode.

Режим Text и все режимы, основанные на нем, определяют M-TAB как команду ispell-complete-word, которая производит завершение части слова перед точкой в данном буфере, используя орфографический словарь как пространство возможных слов. Смотрите раздел Поиск и исправление орфографических ошибок.

Вход в режим Text запускает ловушку text-mode-hook. Другие основные режимы, родственные с режимом Text, также запускают эту ловушку и потом свои ловушки; к ним относятся режим Paragraph-Indent Text, режим Nroff, режим TeX, режим Outline и режим Mail. Функции ловушки text-mode-hook могут проверить значение major-mode, чтобы узнать, в какой из этих режимов вы на самом деле входите. Смотрите раздел Ловушки.

Режим Outline

Режим Outline -- это основной режим, очень похожий на режим Text, но предназначенный для редактирования структурированного текста. Он позволяет вам делать части текста временно невидимыми, так что вы можете видеть просто просмотреть структуру текста. Наберите M-x outline-mode, чтобы включить режим Outline в текущем буфере.

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

Команды редактирования, работающие со строками, такие как C-n и C-p, трактуют текст невидимой строки как часть предыдущей видимой. Уничтожение полной видимой строки, включая ограничивающий её знак новой строки, на самом деле уничтожает вместе с ней все следующие невидимые строки.

Второстепенный режим Outline предоставляет те же команды, что и основной режим Outline, но вы можете использовать его совместно с другими основными режимами. Чтобы включить второстепенный режим Outline в текущем буфере, наберите M-x outline-minor-mode. Вы также можете указать это в тексте файла с помощью локальной переменной в форме `mode: outline-minor' (смотрите раздел Локальные переменные в файлах).

Основной режим, режим Outline, предоставляет особые привязки ключей на префиксе C-c. Второстепенный режим Outline предоставляет похожие привязки с C-c @ в качестве префикса; это нужно, чтобы уменьшить риск конфликта со специальными командами основного режима. (Используемый префикс управляется переменной outline-minor-mode-prefix.)

При входе в режим Outline запускается ловушка text-mode-hook сразу после ловушки outline-mode-hook (смотрите раздел Ловушки).

Формат схем текста

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

* Еда
Это тело, которое
говорит что-то о еде.
** Вкусная еда
Это тело заголовка второго уровня.
** Противная еда
Здесь тоже могло бы
быть тело на
нескольких строках.
*** Общепит
* Приют
Еще одна тема первого уровня со своей строкой заголовка.

Строка заголовка вместе со всеми последующими строками тела в совокупности называются вхождением. Строка заголовка вместе со всеми следующими более глубокими заголовками и их строками тела называется поддеревом.

Вы можете настроить критерий для различения строк заголовка, установив переменную outline-regexp. Любая строка, чье начало содержит совпадение с этим регулярным выражением, рассматривается как строка заголовка. Соответствия, которые начинаются с середины строки (не в начале), не рассматриваются. Длина текста соответствия определяет уровень заголовка: более длинное соответствие создаёт глубже вложенный уровень. Например, если программа форматирования имеет команды `@chapter', `@section' и `@subsection' для деления документа на главы и разделы, вы можете сделать эти строки воспринимаемыми в качестве строк заголовка, установив outline-regexp равной `"@chap\\|@\\(sub\\)*section"'. Обратите внимание на хитрость: слова `chapter' и `section' имеют равную длину, но определив регулярное выражение как совпадающее только с `chap', мы гарантируем, что длина текста, соответствующего заголовку главы, будет короче; таким образом, режим Outline будет знать, что разделы содержатся в главах. Это работает, если никакая другая команда не начинается с `@chap'.

Есть возможность изменить правило подсчета уровня строк заголовка, путем установки переменной outline-level. Значение outline-level должно быть функцией, не принимающей аргументов и возвращающей номер уровня текущего заголовка. Некоторые основные режимы, например режимы C, Nroff и Emacs Lisp, устанавливают эту переменную, чтобы ими можно было пользоваться с второстепенным режимом Outline.

Команды перемещения по структуре

Режим Outline предоставляет особые команды перемещения, которые передвигают назад и вперёд по строкам заголовков.

C-c C-n
Передвинуть точку к следующей видимой строке заголовка (outline-next-visible-heading).
C-c C-p
Передвинуть точку к предыдущей видимой строке заголовка (outline-previous-visible-heading).
C-c C-f
Передвинуть точку к следующей видимой строке заголовка того же уровня, что и строка, на которой находится точка (outline-forward-same-level).
C-c C-b
Передвинуть точку к предыдущей видимой строке заголовка этого же уровня (outline-backward-same-level).
C-c C-u
Передвинуть точку назад к видимой строке заголовка более низкого уровня (outline-up-heading).

C-c C-n (outline-next-visible-heading) переходит вниз на следующую строку заголовка. C-c C-p (outline-previous-visible-heading) передвигает аналогично, но назад. Обе принимают числовой аргумент как счетчик повторов. Имена этих команд подчеркивают, что невидимые заголовки пропускаются, но это на самом деле не специальная особенность. Все команды редактирования, которые просматривают строки, игнорируют невидимые строки автоматически.

Более мощные команды движения понимают уровневую структуру заголовков. C-c C-f (outline-forward-same-level) и C-c C-b (outline-backward-same-level) передвигают от одной строки заголовка к другой видимой строке заголовка той же самой глубины в структуре. C-c C-u (outline-up-heading) передвигает назад к другому заголовку, который имеет меньшую глубину вложенности.

Команды управления видимостью структуры

Чтобы сделать строки видимыми или невидимыми, используются другие специальные команды режима Outline. Все их имена начинаются либо с hide, либо с show. Большинство из них составляют пары противоположностей. Они не могут быть отменены; вместо этого вы можете произвести отмену безотносительно к видимости текста. Изменение видимости строк просто не записывается механизмом отмены.

C-c C-t
Сделать все строки тела в буфере невидимыми (hide-body).
C-c C-a
Сделать все строки в буфере видимыми (show-all).
C-c C-d
Сделать все под этим заголовком невидимым, но не сам этот заголовок (hide-subtree).
C-c C-s
Сделать все под этим заголовком видимым, включая тело, подзаголовки и их тела (show-subtree).
C-c C-l
Сделать тело этой строки заголовка и все его подзаголовки невидимыми (hide-leaves).
C-c C-k
Сделать все подзаголовки этого заголовка видимыми на всех уровнях (show-branches).
C-c C-i
Сделать непосредственные подзаголовки (на один уровень вниз) этого заголовка видимыми (show-children).
C-c C-c
Сделать тело этого заголовка невидимым (hide-entry).
C-c C-e
Сделать тело этого заголовка видимым (show-entry).
C-c C-q
Скрыть все, кроме n верхних уровней строк заголовков (hide-sublevels).
C-c C-o
Скрыть все, кроме заголовка или тела, в котором находится точка, и заголовков, ведущих отсюда к верхнему уровню структуры (hide-other).

Две команды, которые строго противоположны, -- это C-c C-c (hide-entry) и C-c C-e (show-entry). Они применяются, когда точка расположена на заголовке, и относятся только к строкам тела этого заголовка. Подтемы и их тела не затрагиваются.

Две более мощные противоположности -- это C-c C-d (hide-subtree) и C-c C-s (show-subtree). Обе предполагают использование, когда точка находится на заголовке, и обе применяются ко всем строкам поддерева этого заголовка: его телу, всем его подзаголовкам, как прямым, так и косвенным, и всем их телам. Другими словами, поддерево содержит все, что следует за этим заголовком, вплоть до (но не включая) следующего заголовка того же самого или более высокого ранга.

Промежуточное состояние между видимым и невидимым поддеревом -- это когда видимы все подзаголовки, но не видимо ни одно тело. Для осуществления этого есть две команды, в зависимости от того, хотите ли вы скрыть тела или сделать видимыми подзаголовки. Это C-c C-l (hide-leaves) и C-c C-k (show-branches).

Команда C-c C-i (show-children) немного слабее show-branches. Она делает видимыми только непосредственные подзаголовки -- те, что на один уровень ниже. Более глубокие подзаголовки остаются невидимыми, если они были таковыми.

Две команды производят действие, охватывающее весь файл. C-c C-t (hide-body) делает все строки тела невидимыми, так что вы видите просто схему текста. C-c C-a (show-all) делает все строки видимыми. Эти команды могут рассматриваться как пара противоположных, хотя C-c C-a применяется не только к строкам тела.

Команда C-c C-q (hide-sublevels) скрывает все заголовки, кроме заголовков верхнего уровня. С числовым аргументом n, она скрывает все, кроме строк заголовков n верхних уровней.

Команда C-c C-o (hide-other) скрывает все, кроме заголовка или текста тела, в котором находится точка, и их родителей (заголовков, ведущих отсюда к верхнему уровню структуры).

Использование многоточий в конце видимых строк может быть отключено путем установки selective-display-ellipses равной nil. Тогда не будет явного указания на существование невидимых строк.

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

Просмотр одной схемы в нескольких видах

Вы можете просмотреть два вида одной схемы одновременно в разных окнах. Чтобы сделать так, вы должны создать косвенный буфер, используя M-x make-indirect-buffer. Первый аргумент этой команды -- это имя существующего буфера Outline, а второй аргумент -- это имя, которое будет использоваться для нового косвенного буфера. Смотрите раздел Косвенные буферы.

@hyphenation{соз-дай-те} Когда косвенный буфер создан, вы можете показать его в окне, как обычно, с помощью C-x 4 b или других команд Emacs. Команды режима Outline для показа или скрывания частей текста действуют в каждом буфере независимо; в результате каждый буфер может иметь свой вид. Если вы хотите получить более двух видов одной и той же схемы, создайте дополнительные косвенные буферы.

Режим TeX

TeX -- это мощная программа компьютерного набора, написанная Дональдом Кнутом. Он также является свободным программным продуктом, как и GNU Emacs. LaTeX -- это упрощенный формат ввода для TeX, реализованный на макросах TeX. Он распространяется вместе с TeX. SliTeX -- это особая форма LaTeX.

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

Режим TeX имеет три варианта: режим Plain TeX, режим LaTeX и режим SliTeX (три этих основных режима отличающихся друг от друга лишь слегка). Они предназначены для редактирования трех различных входных форматов. Команда M-x tex-mode проверяет содержимое буфера, чтобы определить, не является ли это входом для LaTeX или SliTeX; если это так, она выбирает подходящий режим. Если содержимое файла не оказалось ни LaTeX, ни SliTeX, она выбирает режим TeX. Если содержимого файла оказалось недостаточно для определения формата, то используется режим, задаваемый переменной tex-default-mode.

Когда M-x tex-mode делает неправильное предположение, вы можете использовать команды M-x plain-tex-mode, M-x latex-mode и M-x slitex-mode для явного выбора конкретного варианта режима TeX.

Команды редактирования режима TeX

Здесь перечислены специальные команды, предусмотренные в режиме TeX для редактирования текста файла.

"
Вставить согласно контексту либо `"', либо `"', либо `"' (tex-insert-quote).
C-j
Вставить разрыв абзаца (два перевода строки) и проверить предыдущий абзац на несбалансированные фигурные скобки или знаки доллара (tex-terminate-paragraph).
M-x tex-validate-region
Проверить каждый абзац в буфере на несбалансированные фигурные скобки или знаки доллара.
C-c {
Вставить `{}' и расположить точку между ними (tex-insert-braces).
C-c }
Перейти вперёд за следующую непарную закрывающую фигурную скобку (up-list).

Знак `"' обычно не используется в TeX; мы используем `"', чтобы открыть кавычки, и `"', чтобы закрыть. Чтобы облегчить редактирование с учетом этого соглащения о форматировании, режим TeX заменяет обычное значение клавиши " на команду, вставляющую пару одиночных простых или обратных кавычек (tex-insert-quote). Если говорить точно, эта команда вставляет `"' после пропуска или открывающей фигурной скобки, `"' после обратной косой черты и `"' после всех остальных знаков.

Если вам нужен знак `"' сам по себе в необычном контексте, используйте для его вставки C-q. Также, " c числовым аргументом всегда вставляет указанное число знаков `"'. Вы можете выключить средство раскрытия ", убрав эту привязку из локальной раскладки (смотрите раздел Настройка привязок ключей).

Знак `$' имеет в режиме TeX особый синтаксический код, который перетендует на понимание способа, которым ограничители математической моды TeX соответствуют друг другу. Когда вы вводите `$', который используется для выхода из математической моды, на секунду отображается позиция парного `$', который вводил в математическую моду. Это то же самое средство, которое показывает открывающую фигурную скобку, соответствующую вставленной закрывающей. Однако, нет способа узнать, является ли `$' входом или выходом из математической моды; поэтому когда вы вводите `$', который входит в математическую моду, показывается позиция предыдущего `$', как если бы она была они составляли пару, даже если фактически они не относятся друг к другу.

TeX использует фигурные скобки как ограничители, которые обязаны составлять пары. Некоторые пользователи предпочитают поддерживать фигурные скобки все время сбалансированными, а не вставлять их по отдельности. Используйте C-c { (tex-insert-braces), чтобы вставить пару фигурных скобок. Эта команда оставляет точку между двумя этими скобками, чтобы вы могли вставить текст внутрь. Потом используйте команду C-c } (up-list), чтобы перейти вперёд через закрывающую фигурную скобку.

Существуют две команды для контроля соответствия фигурных скобок. C-j (tex-terminate-paragraph) проверяет абзац перед точкой и вставляет два ограничителя новой строки для начала нового абзаца. Если будет найдено какое-то несоответствие, она напечатает сообщение в эхо-области. M-x tex-validate-region проверяет область, абзац за абзацем. Ошибки перечисляются в буфере `*Occur*', и вы можете использовать в нем C-c C-c или Mouse-2, чтобы перейти к конкретному несоответствию.

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

Команды редактирования режима LaTeX

Режим LaTeX и его вариация, режим SliTeX, предоставляют несколько дополнительных возможностей, не относящихся к plain TeX.

C-c C-o
Вставляет `\begin' и `\end' для блока LaTeX и помещает точку на строке между ними (tex-latex-block).
C-c C-e
Закрывает самый внутренний ещё не закрытый блок LaTeX (tex-close-latex-block).

В LaTeX для группировки блоков текста используются команды `\begin' и `\end'. Чтобы вставить `\begin' и парную `\end' (на новой строке после `\begin'), используйте C-c C-o (tex-latex-block). Между двумя этими строками вставляется пустая строка, и на ней оставляется точка. При вводе типа блока вы можете использовать завершение; чтобы задать имена дополнительных типов блоков, установите переменную latex-block-names. Например, добавить `theorem', `corollary' и `proof' можно таким образом:

(setq latex-block-names '("theorem" "corollary" "proof"))

Во входном тексте LaTeX команды `\begin' и `\end' должны соответствовать друг другу. Вы можете использовать C-c C-e (tex-close-latex-block), чтобы автоматически вставить `\end', соответствующую последней `\begin', оставшей без пары. Эта команда делает для `\end' отступ в соответствии с её `\begin'. Если точка находится в начале строки, она вставляет после `\end' новую строку,

Команды печати для TeX

Вы можете вызвать TeX как подчиненный процесс Emacs либо для всего содержимого буфера, либо только на область, за один раз. Запуск TeX таким способом только в одной главе даёт удобный метод увидеть, как выглядят ваши изменения, не тратя время на форматирование всего файла.

C-c C-r
Вызвать TeX для текущей области вместе с заголовоком буфера (tex-region).
C-c C-b
Вызывать TeX для всего текущего буфера (tex-buffer).
C-c TAB
Вызывать BibTeX для текущего файла (tex-bibtex-file).
C-c C-f
Вызывать TeX для текущего файла (tex-file).
C-c C-l
Переместить центр окна, показывающего вывод подчиненного TeX, чтобы можно было увидеть последнюю строку (tex-recenter-output-buffer).
C-c C-k
Уничтожить подпроцесс TeX (tex-kill-job).
C-c C-p
Печатать вывод из последней команды C-c C-r, C-c C-b или C-c C-f (tex-print).
C-c C-v
Запустить предварительный просмотр вывода последней команды C-c C-r, C-c C-b или C-c C-f (tex-view).
C-c C-q
Показать очередь принтера (tex-show-print-queue).

Вы можете пропустить текущий буфер через подчиненный TeX с помощью C-c C-b (tex-buffer). Отформатированный вывод появляется во временном файле; чтобы напечатать его, наберите C-c C-p (tex-print). Потом вы можете использовать C-c C-q (tex-show-printer-queue), чтобы увидеть, как скоро ваш вывод будет напечатан. Если ваш терминал может показывать выходные файлы TeX, вы можете просмотреть вывод на терминале с помощью команды C-c C-v (tex-view).

Вы можете указать каталог для запуска TeX, установив переменную tex-directory. Значением по умолчанию является ".". Если переменная среды `TEXINPUTS' содержит относительные имена каталогов, или ваши файлы содержат команды `\input' с относительными именами, то tex-directory должна быть равна ".", или вы получите неправильные результаты. В противном случае, можно без опасения задать какой-то другой каталог, например, "/tmp".

Если вы хотите указать, какие команды оболочки нужно использовать в подчиненном процессе TeX, вы можете сделать это установкой значений переменных tex-run-command, latex-run-command, slitex-run-command, tex-dvi-print-command, tex-dvi-view-command и tex-show-queue-command. Вы обязаны установить значение tex-dvi-view-command для вашего конкретного терминала; эта переменная не имеет значения по умолчанию. Другие переменные имеют значения по умолчанию, которые могут подойти (а могут и не подойти) для вашей системы.

Обычно имя файла, передаваемое этим командам, пишется в конце командной строки: например, `latex имя-файла'. Однако в некоторых случаях имя файла должно быть вставлено в команду; это может понадобиться, к примеру, когда вам нужно предоставить имя файла в качестве аргумента команде, чей вывод направляется другой программе. Вы можете указать, в какое место следует подставить имя файла, с помощью знака `*' в командной строке. Например,

(setq tex-dvi-print-command "dvips -f * | lpr")

Терминальный вывод TeX, включающий все сообщения об ошибках, появляется в буфере с именем `*tex-shell*'. Если TeX получил ошибку, вы можете переключиться в этот буфер и подать ему какой-то ввод (это работает как в режиме Shell, смотрите раздел Интерактивная подчиненная оболочка). Без переключения в этот буфер, вы можете прокрутить его с помощью C-c C-l так, что последняя строчка в нем станет видимой.

Наберите C-c C-k (tex-kill-job), чтобы уничтожить процесс TeX, если вы понимаете, что его вывод уже бесполезен. Использование C-c C-b или C-c C-r также уничтожает любой работающий процесс TeX.

Вы также можете пропустить произвольную область через подчиненный TeX, набрав C-c C-r (tex-region). Однако, это ненадежно, потому что большинство входных файлов TeX содержат в начале команды, устанавливающие какие-то параметры и определяющие макросы, без которых дальнейшая часть файла не отформатируется правильно. Для того, чтобы решить эту проблему, C-c C-r позволяет вам обозначить часть файла как содержащую важные команды; она вставляется перед заданной областью как часть ввода TeX. Обозначенная часть файла называется заголовком.

Чтобы обозначить границы заголовка в режиме Plain TeX, вы вставляете в файл две специальные строки. Вставьте `%**start of header' перед заголовком и `%*end of header' после него. Обе должны появиться полностью на одной строке, но перед ними или после них допускается другой текст. Строки, содержащие эти фразы, включаются в заголовок. Если `%**start of header' не появится в пределах первых 100 строк буфера, C-c C-r предполагает, что заголовка нет.

В режиме LaTeX заголовок начинается с `\documentstyle' и заканчивается `\begin{document}'. LaTeX требует, чтобы вы использовали эти команды в любом случае, так что для определения заголовка не требуется делать ничего особенного.

Команды (tex-buffer) и (tex-region) делают свою работу во временном каталоге, и им недоступны вспомогательные файлы, нужные TeX для перекрестных ссылок; эти команды в общем случае не подходят для обработки окончательной копии, в которой все перекрестные ссылки должны быть правильными.

Когда вам нужны вспомогательные файлы для перекрестных ссылок, используйте C-c C-f (tex-file), которая запускает TeX для файла текущего буфера в каталоге этого файла. Перед запуском TeX она предлагает сохранить все измененные буферы. В общем случае, вы должны использовать (tex-file) дважды, чтобы получить правильные перекрестные ссылки.

Значение переменной tex-start-options-string задаёт ключи для запуска TeX. Значение по умолчанию велит TeX работать в безостановочном режиме. Чтобы запустить TeX интерактивно, установите эту переменную равной "".

Большие документы TeX часто разбивают на несколько файлов -- один главный плюс подфайлы. Запуск TeX для подфайла как правило не сработает; вы должны запускать его для главного файла. Чтобы сделать tex-file полезной при редактировании подфайла, вы можете установить переменную tex-main-file равной имени главного файла. Тогда tex-file запустит TeX для этого файла.

Наиболее удобный способ использования tex-main-file -- указать её в перечне локальных переменных в каждом из подфайлов. Смотрите раздел Локальные переменные в файлах.

С LaTeX-файлами вы можете использовать BibTeX, чтобы обработать вспомогательные файлы для файла текущего буфера. BibTeX находит библиографические цитаты в базе данных и подготавливает процитированные ссылки для раздела библиграфии. Команда C-c TAB (tex-bibtex-file) запускает команду оболочки (tex-bibtex-command), чтобы получить `.bbl'-файл для файла текущего буфера. Вообще говоря, вам нужно сначала сделать C-c C-f (tex-file), чтобы получить `.aux'-файл, затем сделать C-c TAB (tex-bibtex-file) и после этого повторить C-c C-f (tex-file) ещё раз, чтобы сгенерировать правильные перекрестные ссылки.

Вход в любой вид режима TeX запускает ловушки text-mode-hook и tex-mode-hook. Затем запускаются plain-tex-mode-hook или latex-mode-hook, что подходит. Для SliTeX-файлов вызывается slitex-mode-hook. При старте оболочки TeX запускается ловушка tex-shell-hook. Смотрите раздел Ловушки.

Режим Nroff

Режим Nroff -- это режим, похожий на режим Text, но модифицированный для управления командами nroff, присутствующими в тексте. Вызовите M-x nroff-mode, чтобы войти в этот режим. Он отличается от режима Text только несколькими возможностями. Все строки команд nroff считаются разделителем абзацев, так что заполнение никогда не исказит команды nroff. Страницы разделяются командами `.bp'. Комментарии начинаются с обратной косой черты и двойных кавычек. Также предусмотрены три специальные команды, которых нет в режиме Text:

M-n
Перейти на начало следующей строки, которая не является командой nroff (forward-text-line). Аргумент служит счетчиком повторов.
M-p
Похожа на M-n, но сдвигает вверх (backward-text-line).
M-?
Напечатать в эхо-области число текстовых строк (строк, которые не являются командами nroff) в текущей области (count-text-lines).

Другое свойство режима Nroff -- это то, что вы можете включать режим Electric Nroff. Это второстепенный режим, который вы можете включать или выключать при помощи M-x electric-nroff-mode (смотрите раздел Второстепенные режимы). Если этот режим включён, то каждый раз, когда вы набираете RET для окончания строки, которая содержит команду nroff, открывающую некоторый вид группы, в следующую строку автоматически вставляется соответствующая закрывающая группу команда nroff. Например, если вы находитесь в начале строки и наберете . ( b RET, то в новую строку, следующую за точкой, будет вставлена соответствующая команда `.)b'.

Если с режимом Nroff вы используете второстепенный режим Outline (смотрите раздел Режим Outline), строками заголовков будут строки вида `.H' с последующим числом (уровнем заголовка).

Вход в режим Nroff запускает ловушку text-mode-hook, а затем ловушку nroff-mode-hook (смотрите раздел Ловушки).

Редактирование форматированного текста

Режим Enriched -- это второстепенный режим для редактирования файлов, которые содержат форматированный текст в стиле WYSIWYG, как в текстовом процессоре. На данный момент форматированный текст в режиме Enriched может задавать шрифты, цвета, подчеркивание, поля и типы заполнения и выравнивания. В будущем мы планируем реализовать также и другие возможности для форматирования.

Режим Enriched -- это второстепенный режим (смотрите раздел Второстепенные режимы). Как правило он используется вместе с режимом Text (смотрите раздел Режим Text). Однако, вы можете также использовать его и с другими основными режимами, такими как режим Outline и режим Paragraph-Indent Text.

Потенциально Emacs может сохранять файлы с форматированным текстом во многих форматах. На текущий момент реализован только один формат: text/enriched, который определяется протоколом MIME. Смотрите раздел `Format Conversion' в the Emacs Lisp Reference Manual, для получения подробностей о том, как Emacs распознает и пребразует форматы файлов.

Дистрибутив Emacs содержит файл с форматированным текстом, который может служить примером. Он называется `etc/enriched.doc'. Этот файл содержит образцы, иллюстрирующие все возможности, описанные в этом разделе. В нем также есть перечень идей для будущих улучшений.

Запрос на редактирование форматированного текста

Когда вы обращаетесь к файлу, который был сохранён в формате text/enriched, Emacs автоматически преобразует информацию о форматировании из этого файла во внутренний формат Emacs (свойства текста) и включает режим Enriched.

Чтобы создать новый файл с форматированным текстом, обратитесь сначала к несуществующему файлу, а перед тем как начать редактирование наберите M-x enriched-mode. Эта команда включает режим Enriched. Делайте это до того, как вы начнёте вставлять текст, чтобы вставляемый текст наверняка обрабатывался правильно.

В более общем виде, команда enriched-mode включает режим Enriched, если он был выключен, и выключает его, если он был включён. Запущенная с числовым аргументом, эта команда включает режим Enriched, если аргумент положителен, и выключает в противном случае.

Когда вы сохраняете буфер при задействованном режиме Enriched, Emacs автоматически преобразует текст к формату text/enriched во время записи в файл. Когда вы снова обратитесь к этому файлу, Emacs автоматически распознает формат, преобразует текст обратно и снова включит режим Enriched.

Обычно после обращения к файлу в формате text/enriched, Emacs перезаполняет каждый абзац так, чтобы он умещался по заданному правому полю. Вы можете выключить это перезаполнение, чтобы сэкономить время, установив переменную enriched-fill-after-visiting в значение nil или ask.

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

Вы можете вносить пометки для сохранения дополнительных свойств текста, которые Emacs обычно не сохраняет, делая добавления к enriched-translations. Заметьте, что стандарт text/enriched требует, чтобы имена всех нестандартных пометок начинались с `x-', например `x-read-only'. Это позволяет быть уверенным в том, что они не будут конфликтовать со стандартными пометками, добавленными позже.

Жёсткие и гибкие переводы строк

Emacs различает в форматированном тексте два разных вида переводов строк: жёсткие и гибкие.

Жёсткие переводы строк используются для разделения абзацев, или пунктов перечня, или везде, где строка должна всегда разрываться вне зависимости от полей. Команды RET (newline) и C-o (open-line) вставляют жёсткие переводы строк.

Гибкие переводы строк применяются для того, чтобы уместить текст в пределы полей. Все команды заполнения, включая Auto Fill, вставляют гибкие переводы строк, и они удаляют всегда только гибкие переводы строк.

Хотя жёсткие и гибкие переводы строк выглядят одинаково, важно помнить об их различии. Не используйте RET, чтобы разорвать строку в середине заполненного абзаца, или иначе вы получите жёсткие переводы строк, которые послужат барьером последующему заполнению. Вместо этого позвольте разбивать строки режиму Auto Fill, чтобы при изменении текста или полей Emacs мог правильно перезаполнить строки. Смотрите раздел Режим Auto Fill.

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

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

Есть два способа изменить информацию о формате для файла с форматированным текстом: командами клавиатуры или с помощью мыши.

Простейший способ добавить свойства к вашему документу --- воспользоваться меню Text Properties. Вы можете попасть в это меню двумя путями: из меню Edit в полоске меню или с помощью C-mouse-2 (прижмите клавишу CTRL и нажмите среднюю кнопку мыши).

Большинство пунктов из меню Text Properties ведут к другим подменю. Подменю описаны в последующих разделах. Некоторые пункты запускают команды непосредственно:

Remove Properties
Удаляет из области все свойства текста, с которыми работает меню Text Properties (facemenu-remove-props).
Remove All
Удаляет все свойства текста из области (facemenu-remove-all).
List Properties
Перечисляет все свойства текста для знака после точки (list-text-properties-at).
Display Faces
Показывает перечень всех определённых начертаний.
Display Colors
Показывает перечень всех определённых цветов.

Начертания в форматированном тексте

В подменю Faces перечислены разные начертания Emacs, включая bold, italic и underline. Выбор одного из них добавляет это начертание к области. Смотрите раздел Использование разных начертаний. Вы также можете задать начертания с помощью таких команд клавиатуры:

M-g d
Говорит, что область или следующий вставленный знак должны появиться в начертании default (facemenu-set-default).
M-g b
Говорит, что область или следующий вставленный знак должны появиться в начертании bold (facemenu-set-bold).
M-g i
Говорит, что область или следующий вставленный знак должны появиться в начертании italic (facemenu-set-italic).
M-g l
Говорит, что область или следующий вставленный знак должны появиться в начертании bold-italic (facemenu-set-bold-italic).
M-g u
Говорит, что область или следующий вставленный знак должны появиться в начертании underline (facemenu-set-underline).
M-g o начертание RET
Говорит, что область или следующий вставленный знак должны появиться в заданном начертании (facemenu-set-face).

Если вы используете эти команды с префиксным аргументом -- или, в режиме Transient Mark, если область не активна -- то они задают начертание для следующего самовставляющегося ввода. Смотрите раздел Режим Transient Mark. Это относится как к командам клавиатуры, так и к командам меню.

Режим Enriched определяет два дополнительных начертания: fixed и excerpt. Они соответствуют кодам, используемым в формате файлов text/enriched.

Начертание excerpt предназначено для цитат. Оно совпадает с начертанием italic, если вы его не перенастроили (смотрите раздел Настройка начертаний).

Начертание fixed означает "Использовать для этой части текста равноширинный шрифт". В настоящее время Emacs поддерживает только равноширинные шрифты; следовательно, пометка fixed пока не так необходима. Однако, в будущих версиях Emacs мы планируем реализовать поддержку шрифтов переменной ширины, и другие системы, способные отображать формат text/enriched, могут не использовать по умолчанию равноширинный шрифт. Поэтому если вы хотите, чтобы какая-то часть текста появлялась именно с равноширинным шрифтом, вам следут задать для этой части начертание fixed.

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

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

Цвета в форматированном тексте

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

Если вы задаёте цвет с префиксным аргументом -- или, в режиме Transient Mark, если область не активна -- то этот цвет применяется для самовставляемого ввода. Смотрите раздел Режим Transient Mark. В противном случае эта команда относится к области.

Оба меню цветов содержат дополнительный пункт: `Other'. Вы можете использовать этот пункт для задания цвета, который не перечислен в меню; имя цвета считывается в минибуфере. Чтобы просмотреть перечень доступных цветов и их имена, используйте пункт `Display Colors' в меню Text Properties (смотрите раздел Редактирование информации о формате).

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

Для задания цветов нет привязок ключей, но вы можете указывать их при помощи расширенных команд M-x facemenu-set-foreground и M-x facemenu-set-background. Обе эти команды считывают имя цвета в минибуфере.

Отступы в форматированном тексте

При редактировании форматированного текста вы можете задать различные величины отступа для правого или левого края целого абзаца или его части. Указанные вам поля автоматически учитываются команды Emacs для заполнения (смотрите раздел Заполнение текста) и разрыва строк.

Подменю Indentation предоставляет удобный интерфейс для указания этих свойств. Оно содержит четыре пункта:

Indent More
Увеличивает отступ области на 4 столбца (increase-left-margin). В режиме Enriched эта команда также доступна на C-x TAB; если вы предоставите числовой аргумент, то он говорит, сколько столбцов нужно добавить к полю (отрицательный аргумент уменьшает число столбцов).
Indent Less
Удаляет 4 столбца отступа из области.
Indent Right More
Сужает область, делая с правого края отступ в 4 столбца.
Indent Right Less
Удаляет 4 столбца отступа с правого края.

Вы можете использовать эти команды несколько раз для увеличения или уменьшения величины отступа.

Наиболее частый способ применения этих команд -- изменять отступ целого абзаца. Однако это не единственное их применение. Вы можете поменять размеры полей в любой точке; новые значения проявляются в конце этой строки (для правого поля) или в начале следующей (для левого поля).

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

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

Иногда в результате редактирования заполнение абзаца сбивается --- части абзаца могут выйти за левые или правые поля. Когда такое происходит, воспользуйтесь M-q (fill-paragraph), чтобы перезаполнить этот абзац.

Число столбцов, которые добавляют или удаляют из отступа эти команды, задаётся переменной standard-indent. Её значение равно по умолчанию четырем. Общее правое поле, принимаемое по умолчанию для режима Enriched, контролируется переменной fill-column, как обычно.

Префикс заполнения, если он задан, действует совместно с указанным отступом абзаца: C-x . не включает пропуск из указанного отступа в новое значение префикса заполнения, а команды заполнения ищут префикс заполнения в каждой строке после отступа. Смотрите раздел Префикс заполнения.

Выравнивание в форматированном тексте

При редактировании форматированного текста вы можете задавать различные стили выравнивания абзацев. Указанный вами стиль автоматически учитывается командами Emacs для заполнения.

Подменю Justification предоставляет удобный интерфейс для указания стиля выравнивания. Оно содержит пять пунктов:

Flush Left
Это наиболее распространенный стиль выравнивания (по крайней мере для английского языка). Строки выравниваются по левому полю, но оставляются неровными с правого края.
Flush Right
Это выравнивает каждую строку по правому полю. Если необходимо, слева добавляются пробелы и знаки табуляции, чтобы правые концы строк выстраивались в линию.
Full
Это выравнивает текст по обоим концам строк. Выровненный таким образом текст смотрится красиво в печатной книге, где все пробелы можно настроить одинаково, но смотрится не так хорошо с равноширинным шрифтом на экране. Возможно, будущие версии Emacs позволят настраивать ширину пробелов в строке, чтобы достичь элегантного выравнивания.
Center
Это центрирует каждую строку между текущими полями.
None
Это выключает заполнение полностью. Каждая строка будет оставаться такой, как вы её написали; функции заполнения и автоматического заполнения не будут иметь эффекта в тексте с такой установкой. Вы все же можете делать отступ слева. В незаполненных областях все переводы строк считаются жёсткими (смотрите раздел Жёсткие и гибкие переводы строк) .

В режиме Enriched вы также можете задавать стиль выравнивания с клавиатуры, используя префиксный знак M-j:

M-j c
M-S
Центрирует область (set-justification-center).
M-j u
Делает область невыровненной (set-justification-none).
M-j l
Выравнивает область слева (set-justification-left).
M-j r
Выравнивает область справа (set-justification-right).
M-j f
Выравнивает область полностью (set-justification-full).

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

Стиль выравнивания по умолчанию задаётся переменной default-justification. Её значением должен быть один из символов left, right, full, center или none.

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

Меню Other Properties позволяет вам добавлять или удалять три других полезных свойства текста: read-only, invisible и intangible. Свойство intangible запрещает движение точки внутри этого текста, свойство текста invisible делает текст невидимым, а свойство read-only запрещает изменение текста.

Для добавления каждого из этих особых свойств к области есть пункт меню. Последний пункт меню, `Remove Special', удаляет все эти особые свойства из текста области.

На данный момент свойства invisible и intangible не сохраняются в формате text/enriched. Свойство read-only сохраняется, но оно не входит в стандарт формата text/enriched, поэтому другие редакторы могут его игнорировать.

Принудительное включение режима Enriched

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

  • Когда вы обращаетесь к файлу, который был создан каким-то другим редактором, Emacs может не распознать этот файл как отфоратированный в text/enriched. В таком случае, когда вы обращаетесь к файлу, вы увидите команды форматирования, а не форматированный текст. Наберите M-x format-decode-buffer, чтобы перевести их.
  • Когда вы вставляете файл в буфер, а не обращаетесь к нему. Emacs делает необходимые преобразования вставляемого текста, но не включает режим Enriched. Если вы хотите сделать это, введите M-x enriched-mode.

Команда format-decode-buffer переводит текст из различных форматов во внутренний формат Emacs. Она просит вас указать формат, из которого делать преобразование; однако, как правило вы можете просто нажать RET, что велит Emacs предположить формат самому.

Если вы хотите просмотреть на текст в text/enriched-файле буквально, как последовательность знаков, а не как форматированный текст, воспользуйтесь командой M-x find-file-literally. Она обращается к файлу, как и find-file, но не производит преобразование формата. Она также подавляет преобразование кодов знаков (смотрите раздел Системы кодирования) и автоматическую распаковку (смотрите раздел Доступ к сжатым файлам). Чтобы выключить преобразование формата, но позволить перевод кодов знаков и/или автоматическую распаковку, если она нужна, используйте format-find-file с подходящими аргументами.

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



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