Сокращения

Сокращение -- это слово, которое при вставке расшифровывается в какой-нибудь другой текст. Расшифровки сокращений определяются пользователем. Например, вы можете определить `foo' как сокращение, расшифровывающееся в `find outer otter'. Определив такое сокращение, вы получите возможность вставлять в буфер `find outer otter', набирая f o o SPC.

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

Понятия о сокращениях

Сокращение -- это слово, которое было определено как расшифровывающееся в заданную расшифровку. Когда вы вставляете после сокращения знак, разделяющий слова, сокращение раскрывается, заменяясь на расшифровку. Например, если `foo' определено как сокращение, расшифровывающееся в `find outer otter', то вы можете вставить в буфер `find outer otter.', напечатав f o o ..

Сокращения расшифровываются, только когда включён режим Abbrev (второстепенный режим). Выключение режима Abbrev не вызывает забвения определений сокращений, но они не расшифровываются, пока режим Abbrev не будет снова включён. Команда M-x abbrev-mode переключает режим Abbrev. С числовым аргументом она включает этот режим, если аргумент положительный, в противном случае -- выключает его. Смотрите раздел Второстепенные режимы. Символ abbrev-mode также является переменной; режим Abbrev включается, когда это переменная отлична от nil. Переменная abbrev-mode автоматически становится локальной для текущего буфера, как только вы её устанавливаете.

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

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

Определение сокращений

C-x a g
Определить сокращение, используя одно или несколько слов перед точкой в качестве его расшифровки (add-global-abbrev).
C-x a l
Аналогично, но определить сокращение, доступное только в текущем основном режиме (add-mode-abbrev).
C-x a i g
Определить слово в буфере как сокращение (inverse-add-global-abbrev).
C-x a i l
Определить слово в буфере как свойственное для режима сокращение (inverse-add-mode-abbrev).
M-x kill-all-abbrevs
Эта команда сбрасывает все действующие в данный момент определения сокращений, начиная вс сначала.

Обычный способ определить сокращение -- войти в текст, который вы хотите зашифровывать, установить после него точку и набрать C-x a g (add-global-abbrev). При этом само сокращение считывается в минибуфере, и затем оно определяется как сокращение для одного или более слов перед точкой. Используйте числовой аргумент для указания числа слов перед точкой, которые должны браться в качестве расшифровки. Например, чтобы определить сокращение `foo' как описано выше, вставьте текст `find outer otter' и затем наберите C-u 3 C-x a g f o o RET.

Нулевой аргумент для C-x a g означает, что в качестве расшифровки определяемого сокращения следует использовать содержимое области.

Команда C-x a l (add-mode-abbrev) похожа, но определяет сокращение, свойственное для режима. Свойственные для режима сокращения активны только в отдельном основном режиме. C-x a l определяет сокращение для основного режима, действующего в момент набора этой команды. Аргументы работают так же, как и для C-x a g.

Если находящийся в буфере текст является сокращением, а не его расшифровкой, используйте команду C-x a i g (inverse-add-global-abbrev) вместо C-x a g или C-x a i l (inverse-add-mode-abbrev) вместо C-x a l. Эти команды называются "инверсными", так как они обращают смысл двух используемых текстовых строк (одной из буфера и второй, считываемой в минибуфере).

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

Чтобы уничтожить определение сокращения, дайте команде определения сокращений отрицательный аргумент: C-u - C-x a g или C-u - C-x a l. Первая удаляет глобальное определение, а вторая --- свойственное для режима.

M-x kill-all-abbrevs уничтожает все имеющиеся определения сокращений, как глобальные, так и локальные.

Управление расшифровкой сокращения

Сокращение расшифровывается всякий раз, когда оно присутствует в буфере непосредственно перед точкой, и вы набираете самовставляющийся пробельный знак или знак пунктуации (SPC, запятую и тому подобное). Более точно, любой знак, не являющийся частью слова, раскрывает сокращение, а любой знак, который может быть частью слова, может быть частью сокращения. Наиболее общий способ использования сокращения -- вставить его и ввести затем знак препинания.

Расшифровка сокращения сохраняет регистр букв; таким образом, `foo' расшифровывается в `find outer otter'; `Foo' в `Find outer otter', а `FOO' в `FIND OUTER OTTER' или в `Find Outer Otter' в зависимости от значения переменной abbrev-all-caps (значение, не равное nil, выбирает первую из двух расшифровок).

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

M-'
Отделить приставку от последующего сокращения, которое будет расшифровываться позднее (abbrev-prefix-mark).
C-x a e
Расшифровать сокращение перед точкой (expand-abbrev). Это действует, даже когда отключен режим Abbrev.
M-x expand-region-abbrevs
Расшифровать некоторые или все сокращения в области.

Вы можете захотеть расшифровать сокращение с присоединенной приставкой; например, если `cnst' раскрывается в `construction', вы могли бы захотеть использовать его для ввода `reconstruction'. Набор `recnst' не работает, так как это не обязательно определённое сокращение. В этом случае сработает применение команды M-' (abbrev-prefix-mark) между приставкой `re' и сокращением `cnst'. Первым вставьте `re'. Затем наберите M-'; эта команда вставит в буфер дефис, чтобы показать, что она выполнила свою работу. Затем вставьте сокращение `cnst'. Теперь буфер содержит `re-cnst'. Теперь вставьте знак, не являющийся частью слова, чтобы расшифровать сокращение `cnst' в `construction'. На этом шаге раскрытия дефис, оставшийся после использования M-', удаляется. Результирующим текстом будет желаемое слово `reconstruction'.

Если вы на самом деле хотите получить в буфере текст сокращения, а не его расшифровку, вы можете достичь желаемого, вставив последующую пунктуацию с помощью C-q. Таким образом, foo C-q , оставляет в буфере `foo,'.

Если вы расшифровали сокращение по ошибке, то вы можете отменить расшифровку и вернуть само сокращение, напечатав для отмены C-_ (смотрите раздел Отмена сделанных изменений). Это также отменяет вставку знака, не являющегося частью слова, который развернул сокращение. Если вы хотите получить завершающий знак, не входящий в слово, плюс нераскрытое сокращение, то вы должны заново вставить завершающий знак, экранировав его командой C-q. Вы также можете использовать команду M-x unexpand-abbrev для отмены последнего раскрытия без удаления завершающего знака.

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

Расшифровка сокращения запускает ловушку pre-abbrev-expand-hook (смотрите раздел Ловушки).

Проверка и редактирование сокращений

M-x list-abbrevs
Показать перечень всех определений сокращений.
M-x edit-abbrevs
Редактировать перечень сокращений; вы можете добавить, изменить или удалить определения.

Вывод M-x list-abbrevs выглядит так:

(lisp-mode-abbrev-table)
"dk"	 0 "define-key"
(global-abbrev-table)
"dfn"	 0 "definition"

(Некоторые пустые строки, не имеющие смысловой значимости, и некоторые другие таблицы сокращений были опущены.)

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

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

M-x edit-abbrevs позволяет вам добавить, изменить или уничтожить определения сокращений при помощи редактирования их списка в буфере Emacs. Этот список имеет тот же самый формат, что и описанный выше. Буфер сокращений называется `*Abbrevs*' и находится в режиме Edit-Abbrevs. Напечатайте в этом буфере C-c C-c, чтобы установить, как указано в нем, определения сокращений и удалить все не перечисленные в нем определения.

Команда edit-abbrevs -- это фактически то же самое, что и list-abbrevs, за исключением того, что она выбирает буфер `*Abbrevs*', тогда как list-abbrevs просто показывает его в другом окне.

Сохранение сокращений

Эти команды позволяют вам сохранять определения сокращений между сеансами редактирования.

M-x write-abbrev-file RET файл RET
Записать файл файл, описывающий все определённые сокращения.
M-x read-abbrev-file RET файл RET
Считать файл файл и определить сокращения так, как там описано.
M-x quietly-read-abbrev-file RET файл RET
То же самое, но не показывать сообщения о происходящем.
M-x define-abbrevs
Определить сокращения из определений в текущем буфере.
M-x insert-abbrevs
Вставить все сокращения и их расшифровки в текущий буфер.

M-x write-abbrev-file считывает имя файла, используя минибуфер, и записывает в этот файл описание всех текущих определений сокращений. Это используется для того, чтобы сохранить определения для использования в дальнейших сеансах. Хранимый в таком файле текст -- это последовательность лисповских выражений, которые при выполнении определяют такие же сокращения, какие у вас есть в данный момент.

M-x read-abbrev-file запрашивает имя файла, используя минибуфер, и затем считывает этот файл, определяя сокращения согласно его содержимому. M-x quietly-read-abbrev-file -- такая же команда, за исключением того, что она не показывает в эхо-области сообщение о своей работе; в действительности это удобно главным образом в файле `.emacs'. Если любой из этих функций передается пустой аргумент, то в качестве имени файла используется значение переменной abbrev-file-name, которая по умолчанию равна "~/.abbrev_defs".

Emacs автоматически предложит записать сокращения, если вы изменили какое-либо из них, всякий раз, когда он предлагает сохранить все файлы (для C-x s или C-x C-c). Это свойство может быть отключено установкой переменной save-abbevs в значение nil.

Команды M-x insert-abbrevs и M-x define-abbrevs похожи на предыдущие команды, но работают над текстом в буфере Emacs. M-x insert-abbrevs вставляет текст в текущий буфер перед точкой, описывая все текущие определения сокращений; M-x define-abbrevs полностью анализирует текущий буфер и соответственно определяет сокращения.

Динамическая расшифровка сокращений

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

M-/
Расшифровать слово в буфере перед точкой как динамическое сокращение при помощи поиска в буфере слов, начинающихся с этого сокращения (dabbrev-expand).
C-M-/
Завершить слово перед точкой как динамическое сокращение (dabbrev-completion).

Например, если буфер содержит `does this follow' и вы наберете f o M-/, то результатом будет вставка `follow', потому что это последнее слово в буфере, которое начинается с `fo'. Числовой аргумент для M-/ говорит, что следует брать вторую, третью и так далее отличающуюся расшифровку, найденную при просмотре в обратном направлении от точки. Повтор M-/ ищет альтернативную расшифровку путем дальнейшего просмотра назад. После того, как будет просмотрен весь текст перед точкой, просматривается текст после точки. Переменная dabbrev-limit, если не равна nil, указывает, как далеко по буферу нужно искать расшифровку.

После просмотра текущего буфера M-/ обычно просматривает другие буферы, если вы не установили dabbrev-check-all-buffers в значение nil.

Отрицательный аргумент для M-/, как C-u - M-/, говорит, что нужно искать расшифровки сначала после точки, а потом перед ней. Если вы повторяете M-/ для поиска другого раскрытия, не задавайте аргумент. При этом сначала будут попробованы все расшифровки после точки, а затем все расшифровки перед точкой.

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

Команда C-M-/ (dabbrev-completion) производит завершение динамического сокращения. Вместо того, чтобы пробовать возможные расшифровки одну за другой, она находит их все, а потом вставляет текст, который является в них общим. Если в них нет ничего общего, C-M-/ показывает перечень завершений, из которого вы можете выбрать нужное обычным способом. Смотрите раздел Завершение.

Динамическая расшифровка сокращений совершенно не зависит от режима Abbrev; расшифровка слова с помощью M-/ полностью независима от того, имеет ли оно определение как обыкновенное сокращение.

Настройки для динамических сокращений

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

Это средство управляется переменной dabbrev-case-fold-search. Если она равна t, регистр при поиске игнорируется; если она равна nil, то слово и расшифровка должны иметь один регистр. Если значение dabbrev-case-fold-search равно case-fold-search, что верно по умолчанию, то игнорирование регистра во время поиска расшифровок определяется переменной case-fold-search.

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

Переменная dabbrev-case-replace указывает, нужно ли сохранять образец регистра сокращения. Если она равна t, образец регистра сокращения сохраняется в большинстве случаев; если она nil, то расшифровка копируется буквально. Если значение dabbrev-case-replace равно case-replace, что истинно по умолчанию, то переменная case-replace указывает, нужно ли копировать расшифровку буквально.

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

Переменная dabbrev-abbrev-char-regexp, если не равна nil, указывает, какие знаки считаются частью слова для целей динамической расшифровки. Это регулярное выражение должно совпадать только с одним знаком, но никогда не с двумя или большим числом. Это же регулярное выражение определяет также, какие знаки являются частью расшифровки. Значение nil имеет особый смысл: сокращения состоят из знаков, являющихся частью слов, но расшифровки состоят из знаков, являющихся частью слов и символов.

В сценариях командного интерпретатора и Make-файлах к именам переменных иногда приставляется `$', а иногда нет. Основные режимы для такого рода текста могут настроить динамическую расшифровку, чтобы она обрабатывала необязательный префикс, установив переменную dabbrev-abbrev-skip-leading-regexp. Её значение должно быть регулярным выражением, совпадающим с необязательным префиксом, который должен игнорироваться динамическими сокращениями.

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



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