Команды для естественных языков – ЧАСТЬ 1

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

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

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

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

Для ввода в nroff — режим Nroff.

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

21.1  Слова

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

M-f             Перейти вперед через слово (forward-word).

M-b            Перейти назад через слово (backward-word).

M-d            Уничтожить  вперед все вплоть до конца слова (kill-word).

M-hDELi         Уничтожить  назад все вплоть до начала слова (backward-kill-word).

M-@                  Пометить конец следующего слова (mark-word).

M-t             Переставить  два  слова  или  перенести одно  слово  через  другие  слова

(transpose-words).

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

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

1  Что вы видите, то и получаете. (Прим. переводчика)

через одиночные знаки в тексте. Аналогия распространяется на числовые аргументя, которые служат счетчиками повторов. M-f с отрицательным аргументом передвигает назад, а M-b с отрицательным аргументом передвигает вперед. Движение вперед останавливается сразу после последней буквы слова, тогда как движение назад останавливается сразу перед первой буквой.

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

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

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

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

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

21.2  Предложения

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

M-a            Перейти назад к началу предложения (backward-sentence).

M-e            Перейти вперед к концу предложения (forward-sentence).

M-k            Уничтожить  вперед до конца предложения (kill-sentence).

C-x hDELi     Уничтожить  все в обратном направлении до начала предложения  (backwardkill-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 hDELi  (backward-killsentence) для уничтожения в обратном направлении к началу предложения. Она удобна, когда вы меняете свое решение в процессе сочинения текста.

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

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

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

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

ные выражения], с. 91.

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

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

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

21.3  Абзацы

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

M-{             Перейти назад к началу предыдущего  абзаца (backward-paragraph).

M-}             Переместиться вперед к концу следующего абзаца (forward-paragraph).

M-h            Поставить  точку   и  метку  вокруг   этого  или  следующего   абзаца (markparagraph).

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

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

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

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

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

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий