3

Мне нравится запускать Emacs как часть сценария входа в систему и оставлять его включенным на время сеанса входа в систему (который обычно составляет несколько недель).

У меня есть сценарии для вызова emacs-client, которые позволят мне использовать файловый менеджер или Windows Explorer для поиска файлов и щелкнуть правой кнопкой мыши, чтобы редактировать их в Emacs.

Я часто сталкиваюсь с множеством открытых окон (фреймов) в emacs, и мне просто нравится закрывать их, нажимая кнопку MS-Windows или KDE X в правом верхнем углу.

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

В качестве обходного пути я использую C-x 5 0 который не позволяет мне закрыть последний кадр, но это часто не так удобно, как использование мыши

Кто-нибудь знает, как настроить Emacs так, чтобы он мог перехватывать кнопку «Закрыть окно» последнего кадра, чтобы либо запросить подтверждение, либо просто запретить его?

В MS-Windows запрещение закрытия последнего окна может привести к зависанию выхода из системы, если emacs все еще работает, но меня это не слишком беспокоит.

3 ответа3

4

Два способа, о которых я могу думать, но я уверен, что есть и другие. Функция, которая вызывается при нажатии кнопки «Удалить кадр» (верхний правый угол [X] в Windows), называется « handle-delete-frame . Вы можете посоветовать эту команду или заменить ее как функцию, которая обрабатывает щелчок другой командой.

Чтобы посоветовать это:

    (defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
      "Ask for confirmation before deleting the last frame"
      (let ((frame   (posn-window (event-start event)))
            (numfrs  (length (visible-frame-list))))
        (when (or (> numfrs 1) (y-or-n-p "Really exit Emacs? "))
          ad-do-it)))

Чтобы заменить его:

    (defun my-handle-delete-frame (event)
      "Ask for confirmation before deleting the last frame"
      (interactive "e")
      (let ((frame   (posn-window (event-start event)))
            (numfrs  (length (visible-frame-list))))
        (cond ((> numfrs 1) (delete-frame frame t))
              ((y-or-n-p "Really exit Emacs? ") (save-buffers-kill-emacs)))))

    (define-key special-event-map [delete-frame] 'my-handle-delete-frame)

Не делайте оба из них; просто сделай один из них.

3

Вы должны использовать демон emacs: запустите Emacs как

       emacs -d

Затем Emacs будет запущен в фоновом режиме, ожидая, пока emacsclient откроет новые окна. Демон Emacs не закроется, когда будут закрыты его последние окна.

0

И вот обновление, которое использует функцию Drew «my-handle-delete-frame», чтобы удалить всплывающее окно «Really kill emacs», необходимое в исходной версии, и дать возможность одному просто выйти, когда кнопка «X» сейчас нажал.

;; The function that is called when you click the delete-frame button
;; (upper-right corner [X] on Windows) is handle-delete-frame. You can advise
;; that command or you can replace it with a function that handles that click
;; via some other command. Therefore, whenever the 'X button' is now clicked
;; the event now is handled here, and invokes kill-emacs, which replaced
;; previous code. The user no longer has to deal w/'Really exit emacs' pop-up.
  (defun exit-emacs-via-del-frm (event)
      "No longer ask for confirmation before deleting the last frame; simply exit"
      (interactive "e")
      (let ((frame   (posn-window (event-start event)))
            (numfrs  (length (visible-frame-list))))
            (kill-emacs) ) )

    (define-key special-event-map [delete-frame] 'exit-emacs-via-del-frm)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .