Сборка  и тестирование программ – ЧАСТЬ 3

— это lib; три этих имени — это ‘lib.elc’, ‘lib.el’ и наконец просто ‘lib’.  Если существует файл ‘lib.elc’, по соглашению это файл, получаемый в результате  компиляции; лучше загрузить скомпилированный  файл, так как он загружается и работает быстрее.

Если load-library обнаружит, что ‘lib.el’ новее, чем ‘lib.elc’, она напечатает сообщение, потому что это похоже на то, что кто-то внес изменения в ‘.el’-файл и забыл его перекомпилировать.

Так как аргумент для load-library обычно не является  сам по себе действительным именем файла, то завершение  имени файла недоступно.   Действительно, используя эту команду, вы не знаете точно, какое имя файла будет использовано.

Последовательность каталогов, просматриваемых M-x load-library,  определяется переменной load-path, списком строк, являющихся именами каталогов. По умолчанию значение этого списка содержит каталог, где  хранится Лисп-код самого Emacs. Если у вас есть свои собственные библиотеки,  поместите их в один каталог и добавьте этот каталог к load-path. nil в этом списке означает текущий каталог по умолчанию, но скорее всего, ставить в список nil — не самая лучшая идея. Если вы сами решили, что хотите иметь nil в этом списке, то наиболее вероятно, что в действительности вы хотите  в этот раз использовать M-x load-file.

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

Код на Emacs Lisp может быть откомпилирован в байт-код, который загружается быстрее, занимает после загрузки меньше памяти и быстрее выполняется.  См. раздел “Byte Compilation” в the Emacs Lisp Reference Manual. По соглашению, скомпилированный код библиотеки помещается в отдельный файл, чье имя состоит из имени исходного файла библиотеки с добавленным ‘c’.  Таким образом, скомпилированный  код для ‘foo.el’ попадает в ‘foo.elc’. Поэтому load-library сначала ищет ‘.elc’-файлы.

23.8  Вычисление выражений Emacs-Lisp

Программы на Лиспе,  предназначенные для запуска в Emacs, нужно редактировать в режиме Emacs-Lisp.  Это происходит автоматически для файлов,  чьи имена кончаются на ‘.el’.   В противоположность этому, сам режим Lisp используется для редактирования Лисп-программ, предназначенных для других Лисп-систем. Чтобы перейти в режим Emacs-Lisp, используете команду M-x emacs-lisp-mode.

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

выражений также удобно при любом редактировании для запуска неинтерактивных функ-

ций (функций, которые не являются  командами).

M-:             Считывает одно лисповское выражение в минибуфере, вычисляет его и печата-

ет его значение в эхо-области (eval-expression).

C-x C-e      Вычисляет лисповское  выражение,  находящееся перед точкой, и  печатает его значение в эхо-области (eval-last-sexp).

C-M-x        Вычисляет определение  функции, содержащее  точку  или  находящееся  после нее, и печатает его значение в эхо-области (eval-defun).

M-x eval-region

Вычисляет все лисповские выражения  в области.

M-x eval-current-buffer

Вычисляет все лисповские выражения  в этом буфере.

M-: (eval-expression) — это самая основная команда для интерактивного вычисления лисповских выражений.  Она считывает выражение, используя минибуфер,  так  что вы можете выполнить любое выражение в любом буфере, независимо от того, что этот буфер содержит. Когда выражение вычислено, то текущим буфером опять является тот, который был текущим, когда вы набирали M-:.

В режиме Emacs-Lisp ключ C-M-x привязан к команде eval-defun, которая анализирует определение функции, следующее за точкой или содержащее   ее, как выражение Лиспа и вычисляет его. Значение печатается в эхо-области. Эта команда удобна для установки в среде Лиспа изменений, которые вы только что сделали в тексте определения функции.

C-M-x обрабатывает выражения defvar  особо. Обычно вычисление выражения defvar не делает ничего, если определяемая им переменная уже имеет значение. Но C-M-x всегда переустанавливает эту переменную в начальное значение, заданное выражением  defvar. Эта особенность удобна для отладки программ на Лиспе.

Команда C-x C-e (eval-last-sexp) вычисляет лисповское выражением,  находящееся в этом буфере перед точкой, и показывает его значение в эхо-области. Она доступна во всех основных режимах, а не только в режиме Emacs-Lisp. Она не обрабатывает  defvar  особо.

Если командам C-M-x, C-x C-e или M-: задан числовой аргумент, то они вставляют значение в текущий буфер в позиции точки, а не в печатают эхо-области. Значение аргумента не играет роли.

Самой общей командой для вычисления Лисп-выражений из буфера  является evalregion.  M-x eval-region анализирует текст из области как одно или несколько лисповских выражений, вычисляя их одно за другим.  M-x eval-current-buffer похожа на предыдущую, но вычисляет весь буфер. Это оправданный  способ установки Лисп-кода из файла, который вы как раз готовы проверить. После нахождения  и исправления ошибки используйте C-M-x в каждой функции, которую вы изменяете. Это сохранит соответствие между миром Лиспа и исходным файлом.

23.9  Буферы диалога с Лиспом

Буфер ‘*scratch*’, выбираемый в момент запуска Emacs, предназначен для интерак-

тивного вычисления Лисп-выражений  внутри Emacs.

Простейший способ использования буфера ‘*scratch*’ — вставлять лисповские выражения, оканчивая каждое из них вводом C-j.  Эта команда считывает Лисп-выражение перед точкой, вычисляет его и вставляет его значение в печатном представлении  перед точкой. Результатом будет полный протокол вычисленных вами выражений и их значений.

Основной режим буфера ‘*scratch*’ называется Lisp Interaction; он во всем эквивален-

тен режиму Emacs-Lisp, за исключением привязки для C-j.

Целесообразность  этого свойства состоит в том, что у Emacs должен быть буфер  в момент запуска, но этот буфер неудобен для редактирования  файлов, так как новый буфер создается для каждого файла, к которому вы обращаетесь.  Я думаю, что самое полезное, что может делать начальный буфер, — это вести протокол интерпретатора Лиспа.  M-x lisp-interaction-mode переведет любой буфер в режим Lisp Interaction.

Альтернативный способ интерактивного вычисления выражений Emacs Lisp предоставляет режим Inferior Emacs-Lisp, который имеет интерфейс, похожий скорее на интерфейс режима Shell (см. Раздел 30.2.3 [Режим Shell], с. 325). Наберите M-x ielm,  чтобы создать буфер ‘*ielm*’, использующий этот режим.

23.10  Запуск внешнего Лиспа

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

Чтобы запустить подчиненный Лисп-процесс,  наберите M-x run-lisp.   Это запускает программу с именем lisp, ту же программу, которую бы вы запустили, набрав lisp как команду оболочки, с выводом и вводом, идущими через буфер Emacs с именем ‘*lisp*’. Следует сказать, что любой “терминальный  вывод” от Лиспа пойдет в этот буфер,  передвигая вперед точку,  и любой “терминальный  ввод” для Лиспа приходит из текста в буфере. (Вы  можете  изменить имя исполняемого  файла Лиспа, установив переменную inferior-lisp-program.)

Чтобы дать ввод в Лисп, отправьте сь в конец буфера и наберите нужный текст, завершив его вводом hRETi.  Буфер ‘*lisp*’ находится в режиме Inferior Lisp, режиме, который объединяет специальные характеристики режима Lisp и большую часть свойств режима Shell (см. Раздел 30.2.3 [Режим Shell], с. 325). Определение hRETкак команды, посылающей строку подпроцессу, — это одна из особенностей режима Shell.

Для запуска исходных файлов программ во внешних Лиспах используйте режим Lisp. Этот режим можно выбирать при помощи M-x lisp-mode; он используется автоматически для файлов, имена которых оканчиваются на ‘.l’, ‘.lsp’ или ‘.lisp’, какие и применяются в большинстве Лисп-систем.

Когда  вы редактируете  функцию в программе  на Лиспе,  которая работает в данный момент, простейшим способом пересылки  измененного  определения в подчиненный Лисппроцесс является ключ C-M-x. В режиме Lisp при этом запускается функция lisp-senddefun,  которая находит определение  функции рядом или следом  за точкой  и посылает его как ввод в Лисп-процесс. (Emacs может послать ввод в любой подчиненный процесс независимо от того, какой буфер является текущим.)

Сравним значения C-M-x в режиме Lisp (для редактирования программ, запускаемых в другой Лисп-системе)  и режиме Emacs-Lisp (для редактирования программ на Лиспе, предназначенных для работы в Emacs): в обоих режимах она имеет действие установки определения,  в котором находится точка,  но способ выполнения этого различается, согласно тому, где находится соответствующая  среда Лиспа. См. Раздел 23.6 [Исполнение Лиспа], с. 253.

24 Сокращения

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

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

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

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

‘find outer  otter.’, напечатав f o o ..

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

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

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

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

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 Определить слово в буфере как свойственное для режима сокращение (inverseadd-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 hRETi.

Нулевой аргумент для 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  уничтожает все имеющиеся  определения сокращений, как  гло-

бальные, так и локальные.

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

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

Расшифровка сокращения сохраняет регистр букв; таким образом, ‘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-’  (abbrevprefix-mark) между приставкой ‘re’  и сокращением ‘cnst’. Первым вставьте ‘re’.  Затем

наберите M-’;  эта команда вставит в буфер  дефис,  чтобы показать, что она выполнила свою работу. Затем вставьте сокращение ‘cnst’.  Теперь буфер содержит ‘re-cnst’.  Теперь вставьте знак, не являющийся  частью слова, чтобы расшифровать сокращение ‘cnst’ в ‘construction’.  На этом шаге раскрытия дефис, оставшийся после использования  M-’, удаляется. Результирующим текстом будет желаемое слово ‘reconstruction’.

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

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

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

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

дел 31.2.3 [Ловушки], с. 349).

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

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 просто показывает его в другом окне.

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

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

дактирования.

M-x write-abbrev-file hRETфайл hRETi

Записать файл файл, описывающий  все определенные сокращения.

M-x read-abbrev-file hRETфайл hRETi

Считать файл файл и определить сокращения так, как там описано.

M-x quietly-read-abbrev-file hRETфайл hRETi

То же самое, но не показывать сообщения о происходящем.

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 полностью анализирует текущий буфер и соответственно  определяет сокращения.

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

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

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

C-M-/         Завершить  слово перед точкой   как   динамическое сокращение   (dabbrevcompletion).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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