Сохранение буферов
Когда вы редактируете файл в 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, безусловно, не создавать резервный файл.
- При аргументе 4 или 64, отражающем 1 или 3 C-u’s, функция
- Команда: 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