Разнообразные команды – ЧАСТЬ 10

31.2.4  Локальные переменные

M-x make-local-variable hRETпер hRETi

Сделать переменную пер локальной в текущем буфере.

M-x kill-local-variable hRETпер hRETi

Сделать так, что переменная пер использовала в текущем буфере свое глобаль-

ное значение.

M-x make-variable-buffer-local hRETпер hRETi

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

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

Команда M-x make-local-variable считывает имя переменной и делает  ее локальной для данного буфера.  Будущие изменения в данном буфере не затронут другие буферы, а будущие изменения глобального  значения не затронут значения для данного буфера.

M-x make-variable-buffer-local считывает имя переменной  и изменяет будущее   ее поведение таким образом,  что при установке  она автоматически становится локальной. Точнее, если переменная помечается таким способом, то обычные способы установки переменной сначала будут автоматически выполнять make-local-variable. Такие переменные мы называем переменными буфера.

Основные режимы (см. Глава 19 [Основные режимы], с. 175) всегда делают переменные локальными для буфера до их установки. Поэтому изменение основного режима в одном

буфере  не  влияет на другие буферы. Второстепенные  режимы также  работают путем установки переменных — обычно каждый второстепенный режим имеет одну управляющую переменную, которая отлична от nil, когда данный режим включен (см. Раздел 31.1 [Второстепенные режимы], с. 341). Для большинства второстепенных режимов управляющая переменная является переменной буфера.

Emacs содержит некоторое количество переменных, которые всегда являются переменными буфера. Сюда включаются abbrev-mode, auto-fill-function,  case-fold-search, comment-column, ctl-arrow,  fill-column,  fill-prefix,  indent-tabs-mode, left-margin, mode-line-format,  overwrite-mode,   selective-display-ellipses,   selective-display, tab-width и truncate-lines.  Некоторые другие переменные также всегда являются локальными для текущего буфера, но они используются для внутренних целей.

Некоторые переменные не могут быть локальными для буфера, потому что они вместо этого всегда локальны для каждого дисплея (см. Раздел 17.8 [Множество дисплеев], с. 152). Если вы попытаетесь сделать какую-либо из этих переменных локальной для буфера, то вы получите сообщение об ошибке.

Команда M-x kill-local-variable считывает из минибуфера имя переменной и прекращает ее существование  как локальной для текущего буфера. С этого момента в этом буфере начинает действовать глобальное значение переменной. Установка основного режима уничтожает все локальные  переменные буфера за исключением нескольких, специально отмеченных как постоянно локальные.

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

(setq-default fill-column  75)

setq-default  — это единственный  способ установки глобального значения переменной,

которая была помечена функцией make-variable-buffer-local.

Программы на Лиспе могут посмотреть на значение некоторой переменной по умолчанию с помощью функции default-value.  Эта функция принимает в качестве аргумента символ и возвращает его значение по умолчанию.  Аргумент  вычисляется; обычно вы должны явно поставить перед ним кавычку. Например, вот как можно получить значение по умолчанию для переменной fill-column:

(default-value ’fill-column)

31.2.5  Локальные переменные  в файлах

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

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

-*mode: имярежима;  пер:  значение;  … -*-

Таким способом вы можете написать любое количество пар переменная/значение, каждая пара разделяется двоеточием и точкой с запятой, как показано выше.  mode: имярежима; задает основной режим; эта пара должна быть первой в строке. Значения не вычисляются, а используются буквально. Вот пример, который задает режим Lisp и устанавливает две переменные с числовыми значениями:

;; -*-mode:  Lisp; fill-column:  75;  comment-column: 50;  -*-

Этим  способом  вы можете  также  указать систему кодирования для данного файла: просто задайте  значение для “переменной” с именем coding.    Значением должно быть имя системы кодирования,  которое Emacs может распознать. См.  Раздел 18.7 [Системы кодирования], с. 165.

Список локальных переменных находится в конце файла, на последней странице. (Часто бывает лучше всего поместить его на отдельную страницу.) Список локальных переменных начинается со строки, содержащей ‘Local  Variables:’, и оканчивается строкой, содержащей ‘End:’.  Между ними идут имена переменных и их значения, по одному на строке, в виде ‘переменная: значение’. Значения не вычисляются, они используются буквально. Если в файле используются и список локальных переменных,  и строка ‘-*-’,  то Emacs обрабатывает сначала все в строке ‘-*-’, а затем все в списке локальных переменных.

Вот пример списка локальных переменных:

;;; Local  Variables: ***

;;; mode:lisp ***

;;; comment-column:0 ***

;;; comment-start:  ";;; "  ***

;;; comment-end:"***"  ***

;;; End: ***

Как вы видите, каждая строка начинается с префикса ‘;;; ’ и заканчивается суффиксом

‘ ***’. Emacs распознает их как префикс и суффикс, основываясь на первой строке списка, так как они окружают магическую строку ‘Local  Variables:’; затем они автоматически исключаются из остальных строк списка.

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

’ и заканчивается на ‘***’; значения локальных переменных comment-start и comment-end настраивают Emacs на понимание этого необычного синтаксиса. Не используйте префикс или суффикс, если они вам не нужны.

Два “имени переменных” имеют особый смысл в списке локальных переменных: значение для переменной  mode в действительности  устанавливает  основной режим, а значение для переменной eval  просто вычисляется как  выражение, а его значение игнорируется. mode  и eval  не  являются настоящими переменными;  установка переменных с именами mode и eval  в любом другом контексте не имеет особого смысла. Если mode используется для установки основного режима, то она должна быть первой “переменной” в списке.

Вы можете  использовать “переменную” mode для установки второстепенных режимов точно так же,  как и основных режимов; в действительности, вы можете использовать  ее несколько раз, сначала для установки основного режима, а затем для установки второстепенных режимов, которые будет действовать для выбранного  буфера. Но большинство второстепенных режимов не стоит никак указывать в файле, поскольку они представляют предпочтения пользователя.

Например, у вас можете  появиться искушение включить режим Auto Fill  с помощью списка локальных переменных. Это будет ошибкой. Использовать режим Auto Fill или нет

— это дело личного вкуса, а не свойство содержимого  файла. Если вы хотите использовать режим Auto Fill, то установите ловушки основных режимов в вашем файле ‘.emacs’, чтобы он включался (когда нужно) только для вас (см. Раздел 31.7 [Файл инициализации], с. 366). Не используйте список локальных переменных для навязывания вашего вкуса всем остальным.

Список локальных переменных должен начинаться не далее, чем за 3000 знаков от конца файла, и он должно находиться на последней странице, если файл поделен на страницы. Иначе Emacs не заметит его там.  Цель этого в том, чтобы случайная ‘Local  Variable:’,

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

Используйте команду normal-mode для переустановки локальных переменных и основного режима данного буфера соответственно   имени файла и его содержимого, включая списки локальных переменных, если они есть. См. Раздел 19.1 [Выбор режима], с. 175.

Переменная enable-local-variables говорит,  нужно ли обрабатывать локальные переменные  в файлах, и таким образом  дает вам шанс перекрыть их.   По умолчанию ее значение равно t, что означает обработку локальных переменных в файлах. Если вы установите значение переменной равным nil, то Emacs просто будет игнорировать локальные переменные в файлах. Любое другое значение велит делать запрос у пользователя о каждом файле, в котором имеются локальные  переменные, показывая  определения локальных переменных, чтобы вы могли принять решение.

“Переменная” eval  и некоторые настоящие  переменные создают некий риск; когда вы обращаетесь к чужим файлам, определения локальных переменных для них могут произвольно воздействовать на ваш Emacs. Поэтому параметр enable-local-eval контролирует, будет ли Emacs обрабатывать  переменные eval,  а так  же  переменные, чьи имена оканчиваются на ‘-hook’,  ‘-hooks’,  ‘-function’ или ‘-functions’, а также некоторые другие переменные.  Существует три возможных значения для данного параметра: t,  nil и что-нибудь другое, точно так же, как и для enable-local-variables. Значением по умолчанию является  maybe, это не t и не nil, так что обычно Emacs спросит подтверждение об установке этих переменных.

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

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

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

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