как тихо "Сохранить все буферы" в Emacs?

Как создать команду "Без проблем сохранить все буферы" в Aquamacs Emacs?

Я нашел команду save-some-buffers которая хороша, но проблема в том, что она предлагает мне отдельно подтвердить каждый буфер, который я хочу сохранить.

Через Googling я нашел документацию по переменной с именем save-silently-p но, похоже, она не существует (в версии Aquamacs версии 2.4, то есть Emacs 23.3.50.1).

Итак, как мне заставить его сохранять все буферы без подсказки?

Ответ 1

В этом примере первый аргумент имеет значение non-nil - "[o] ptional аргумент (префикс) non-nil означает сохранение всех без вопросов". Хотя это может быть просто старый t, я решил составить более значимый символ, чтобы напомнить себе о том, что он выступает за - то есть 'no-confirm. Если бы я хотел получить диалоговое окно подтверждения, вместо этого я использовал бы nil для первого аргумента. См. Doc-строку - Mx describe-function RET save-some-buffers RET - для получения дополнительной информации о том, как эта функция ведет себя в зависимости от того, является ли первый аргумент nil или non-nil.

В приведенном ниже примере используются save-some-buffers с настраиваемой функцией аргументов нуля для второго аргумента, то есть PRED - для выбора того, какие буферы должны быть сохранены. В doc-строке для save-some-buffers говорится, что второй аргумент - то есть PRED - может быть одной из трех возможностей - (1) Если PRED равно nil, рассматриваются все буферы для просмотра файлов; (2) Если PRED - t, то также будут рассмотрены некоторые нефайловые буферы; или (3) Если PRED - это функция с нулевым аргументом, она указывает для каждого буфера, следует ли это учитывать или нет при вызове с этим током буфера.

В этом примере используется сочетание клавиш f5, но пользователь может вызвать эту пользовательскую функцию в интерактивном режиме - Mx my-save-some-buffers - или назначить другую комбинацию клавиш. Существует несколько возможных совпадений, которые были жестко закодированы, и пользователь может свободно добавлять/удалять/изменять условия:

• file-visit-buffer + имя файла соответствует значению переменной abbrev-file-name.

• file-visit-buffer + основной режим - latex-mode из встроенного tex-mode.el - не AUCTeX.

• file-visit-buffer + основной режим - режим markdown-mode.

• file-visit-buffer + main-mode - emacs-lisp-mode.

• file-visit-buffer + производный режим - org-mode.

(defun my-save-some-buffers ()
(interactive)
  (save-some-buffers 'no-confirm (lambda ()
    (cond
      ((and buffer-file-name (equal buffer-file-name abbrev-file-name)))
      ((and buffer-file-name (eq major-mode 'latex-mode)))
      ((and buffer-file-name (eq major-mode 'markdown-mode)))
      ((and buffer-file-name (eq major-mode 'emacs-lisp-mode)))
      ((and buffer-file-name (derived-mode-p 'org-mode)))))))

(global-set-key [f5] 'my-save-some-buffers)

Ответ 2

Нет необходимости устанавливать какие-либо пользовательские переменные, вы просто:

C-u C-x s

Или в долгосрочной перспективе:

Ctrl + u Ctrl + x s

Кроме того, вы можете просто сделать, Cx s и нажать ! в ответ на запрос "да" для всех сохраняемых буферов файлов. Который не является строго тихим, но он все еще очень быстрый/ненавязчивый. (кредит: @phils)

Ответ 3

Если вы передаете non-nil для сохранения-some-buffers, он сохранит все файлы без подсказки, поэтому вы можете сделать что-то вроде

(defun save-all () (interactive) (save-some-buffers t))
(global-set-key (kbd "C-S") 'save-all)

Ответ 4

На информационной странице save-some-buffers:

(save-some-buffers & optional ARG PRED)

Сохраните несколько модифицированных буферов для доступа к файлам. Спросит пользователя о каждом из них. Вы можете ответить y' to save, n' не сохранять, Cr' to look at the buffer in question with представлением-буфером' перед тем, как решить, или d' to view the differences using diff-buffer-with-file'.

Эта команда сначала сохраняет любые буферы, где "buffer-save-without-query" не равен нулю, без запроса.

Поэтому вы должны установить переменную buffer-save-without-query для t (например) для всех ваших файлов. (add-hook 'find-file-hook (lambda() (setq buffer-save-without-query t))) должен сделать трюк.