Spec-Zone.ru › Elisp

Сохранение буферов

Когда вы редактируете файл в Emacs, вы фактически работаете с буфером, посещающим этот файл — то есть содержимое файла копируется в буфер, и вы редактируете копию. Изменения в буфере не изменяют файл до тех пор, пока вы не сохраните буфер, что означает копирование содержимого буфера в файл. Буферы, которые не посещают файл, всё равно могут быть «сохранены» в некотором смысле, используя функции в локальной для буфера write-contents-functions крючке.

Команда: save-buffer &optional backup-option

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

save-buffer отвечает за создание резервных файлов. Обычно backup-option имеет значение nil, а save-buffer создаёт резервный файл только в случае, если это первое сохранение после посещения файла. Другие значения backup-option запрашивают создание резервных файлов в других обстоятельствах:

  • При аргументе 4 или 64, отражающем 1 или 3 C-u’s, функция save-buffer отмечает эту версию файла для резервного копирования при следующем сохранении буфера.
  • При аргументе 16 или 64, отражающем 2 или 3 C-u’s, функция save-buffer безусловно создаёт резервную копию предыдущей версии файла перед его сохранением.
  • При аргументе 0, безусловно, не создавать резервный файл.
Команда: save-some-buffers &optional save-silently-p pred

Эта команда сохраняет некоторые изменённые буферы, посещающие файлы. Обычно она спрашивает пользователя о каждом буфере. Но если save-silently-p имеет значение, отличное от nil, она сохраняет все буферы, посещающие файлы, без запроса пользователя.

Дополнительный аргумент pred предоставляет предикат, который контролирует, о каких буферах спрашивать (или сохранять молча, если save-silently-p имеет значение, отличное от nil). Если pred равно nil, это означает, что вместо pred следует использовать значение save-some-buffers-default-predicate. Если результат равен nil, это означает спрашивать только о буферах, посещающих файлы. Если это t, это означает также предложить сохранить определённые другие не-файловые буферы — те, которые имеют значение локальное для буфера, отличное от nil, равное buffer-offer-save (см. Уничтожение буферов). Пользователь, который говорит «да» для сохранения не-файлового буфера, спрашивается о имени файла для использования. Функция save-buffers-kill-emacs передает значение t для pred.

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

Команда: write-file filename &optional confirm

Эта функция записывает текущий буфер в файл filename, заставляет буфер посетить этот файл и отмечает его как не изменённый. Затем она переименовывает буфер на основе filename, добавляя строку, такую как ‘<2>’, если необходимо, чтобы сделать имя буфера уникальным. Она выполняет большую часть этой работы, вызывая set-visited-file-name (см. Имя файла буфера) и save-buffer.

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

Если filename — это имя директории (см. Имена директорий), write-file использует имя посещаемого файла в директории filename. Если буфер не посещает файл, он использует имя буфера вместо этого.

Сохранение буфера запускает несколько крючков. Также выполняется преобразование формата (см. Преобразование формата). Обратите внимание, что эти крючки, описанные ниже, запускаются только save-buffer, они не запускаются другими примитивами и функциями, которые записывают текст буфера в файлы, и, в частности, автоматическое сохранение (см. Автосохранение) не запускает эти крючки.

Переменная: write-file-functions

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

Если функция в write-file-functions возвращает значение, отличное от nil, она отвечает за создание резервного файла (если это уместно). Для этого выполните следующий код:

(or buffer-backed-up (backup-buffer))

Возможно, вам захочется сохранить значение режимов файлов, возвращаемое backup-buffer, и использовать его (если оно не равно nil) для установки битов режима файла, который вы записываете. Это обычно делает save-buffer. См. Создание резервных файлов.

Функции-крючки в write-file-functions также отвечают за кодирование данных (если это необходимо): они должны выбрать подходящую систему кодирования и преобразование конца строки (см. Lisp и системы кодирования), выполнить кодирование (см. Явное кодирование) и установить last-coding-system-used на систему кодирования, которая использовалась (см. Кодирование и ввод/вывод).

Если вы установите этот крючок локально в буфере, предполагается, что он связан с файлом или способом получения содержимого буфера. Таким образом, переменная отмечается как постоянная локальная, поэтому изменение основного режима не изменяет локальное значение буфера. С другой стороны, вызов set-visited-file-name сбросит его. Если это не то, что вы хотите, вы можете использовать write-contents-functions вместо этого.

Несмотря на то, что это не обычный крючок, вы можете использовать add-hook и remove-hook для манипулирования списком. См. Крючки.

Переменная: write-contents-functions

Это работает так же, как write-file-functions, но оно предназначено для крючков, относящихся к содержимому буфера, а не к конкретному посещаемому файлу или его расположению, и может быть использовано для создания произвольных процессов сохранения для буферов, которые вообще не посещают файлы. Такие крючки обычно устанавливаются основными режимами как локальные для буфера привязки для этой переменной. Эта переменная автоматически становится локальной для буфера при её установке; переключение на новый основной режим всегда сбрасывает эту переменную, но вызов set-visited-file-name не делает этого.

Если любая из функций в этом крючке возвращает значение, отличное от nil, файл считается уже записанным, и остальные не вызываются, и не вызываются функции в write-file-functions.

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

Пользовательская опция: before-save-hook

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

Пользовательская опция: after-save-hook

Этот обычный крючок выполняется после того, как буфер был сохранён в его посещаемом файле.

Пользовательская опция: file-precious-flag

Если эта переменная имеет значение, отличное от nil, тогда save-buffer защищает от ошибок ввода/вывода при сохранении, записывая новый файл в временное имя вместо имени, которое он должен иметь, а затем переименовывая его в целевое имя после того, как станет ясно, что нет ошибок. Эта процедура предотвращает такие проблемы, как нехватка дискового пространства, которые могут привести к недействительному файлу.

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

Некоторые режимы присваивают этой переменной локальное значение буфера, отличное от nil, в определённых буферах.

Пользовательская опция: require-final-newline

Эта переменная определяет, могут ли быть записаны файлы, которые не заканчиваются новой строкой. Если значение переменной равно t, тогда save-buffer молча добавляет новую строку в конце буфера всякий раз, когда он не заканчивается на ней. Если значение равно visit, Emacs добавляет недостающую новую строку сразу после посещения файла. Если значение равно visit-save, Emacs добавляет недостающую новую строку как при посещении, так и при сохранении. Для любого другого значения, отличного от nil, save-buffer спрашивает пользователя, следует ли добавлять новую строку каждый раз, когда возникает такой случай.

Если значение переменной равно nil, тогда save-buffer вообще не добавляет новые строки. nil является значением по умолчанию, но несколько основных режимов устанавливают его в t в определённых буферах.

См. также функцию set-visited-file-name (см. Имя файла буфера).

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Saving-Buffers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API