Ответ 1
Это сработало для меня:
(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
Более подробная информация о Использование записи в блоге Emacsclient.
После того как я открываю что-то с emacsclient, когда я убиваю этот буфер (C-x k), я получаю диалог подтверждения:
Buffer `blah' still has clients; kill it? (yes or no)
Но когда я убиваю буферы, открытые непосредственно из Emacs, я этого не делаю. Есть ли способ не получить их, когда emacsclient открыл их?
Это сработало для меня:
(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
Более подробная информация о Использование записи в блоге Emacsclient.
Другой вариант - использовать параметр -n
с emacsclient
, чтобы он не дождался, когда файл будет отредактирован до выхода.
Например:
emacsclient -n myfile.txt
Вы можете установить команду клавиатуры C-x k, чтобы она пометила клиентские буферы как выполненные и убила обычные буферы.
Я бесстыдно украл этот фрагмент кода из Emacs Client в Emacs Wiki:
(add-hook 'server-switch-hook
(lambda ()
(when (current-local-map)
(use-local-map (copy-keymap (current-local-map))))
(when server-buffer-clients
(local-set-key (kbd "C-x k") 'server-edit))))
В то время как это не помогает другим способам убийства буферов (например, M-x list-buffers
), он должен быть в безопасности, учитывая поведение клиента Emacs, которое ожидают некоторые сценарии оболочки.
Вот выдержка из файла server.el в вашем дистрибутиве Emacs, которая может немного рассказать о том, что я имею в виду:
;; When you finish editing a Server buffer, again call server-edit
;; to mark that buffer as done for the client and switch to the next
;; Server buffer. When all the buffers for a client have been edited
;; and exited with server-edit, the client "editor" will return
;; to the program that invoked it.
В дальнейшем появляется явное предупреждение о том, что буфер не должен быть убит, но выпущен (по крайней мере, так я его интерпретирую):
;; Ask before killing a server buffer.
;; It was suggested to release its client instead,
;; but I think that is dangerous--the client would proceed
;; using whatever is on disk in that file. -- rms.
По какой-то причине я должен вручную запустить решение remove-hook на emacs23, возможно, потому что некоторые части сервера загружаются после загрузки .emacs. Добавление фиктивной строки (сервер-старт) в мои .emacs до (remove-hook...) не помогло. Поэтому я выбрал следующее, менее принципиальное решение:
(defalias 'server-kill-buffer-query-function '(lambda () t))