Подтвердить что ты не робот

Предотвратить выход Emacs после завершения процедуры выхода?

Есть ли способ предотвратить выход Emacs после запуска процесса выхода?

Я иногда толстый палец C-x C-s как C-x C-c. Это не ужасный процесс для резервного копирования и запуска, но мне любопытно, есть ли способ остановить процесс выхода, чтобы я мог продолжать работать без открытия всех моих файлов.

Использование GNU Emacs 24.3.1. Запуск на Cygwin под окном 7.

4b9b3361

Ответ 1

Существует встроенная переменная, которую вы можете установить так:

(setq confirm-kill-emacs 'y-or-n-p)

Ответ 2

scottfrazer ответьте мне более подходящим, чем то, что следует.

Включить Emacs Lock второстепенный режим (emacs-lock-mode) на любом из буферов, чтобы предотвратить выход Emacs, если вы случайно нажали C-x C-c.

На странице Emacs Wiki:

Emacs не может выйти, пока буфер не будет убит или не разблокирован

Добавьте (emacs-lock-mode) в ваш файл .emacs/init.el, чтобы эта блокировка была включена в каждом сеансе Emacs. Добавление этого блокирует буфер *scratch*, который нужно разблокировать, если вы действительно хотите выйти из Emacs.

Другой способ/взломать это - начать процесс в Emacs, например. M-x shell или иметь несохраненный файл, связанный с буфером, при этом вам будет предложено подтвердить, когда Emacs выходит.

Да еще один, unset C-x C-c с помощью global-unset-key. А затем, если вы хотите выйти из Emacs M-x kill-emacs.

Ответ 3

  • Используя confirm-kill-emacs, как предложил @scottfrazer, это один из подходов.

  • В более общем плане вы можете использовать kill-emacs-query-functions, чтобы делать все, что вы хотите в этом отношении. (Нет необходимости в них добавлять confirm-kill-emacs, но они это сделали.)

  • Вероятно, вы не хотите использовать kill-emacs-hook в этом отношении (для чего kill-emacs-query-functions), но имейте это в виду, если вы столкнетесь с ним, используя apropos и т.д.

Одно из преимуществ kill-emacs-query-functions всего лишь confirm-kill-emacs заключается в том, что вам может потребоваться лучшее подтверждение: yes вместо простого нажатия клавиши y. Например:

(add-hook 'kill-emacs-query-functions
          (lambda () (y-or-n-p "Do you really want to exit Emacs? "))
          'append)

Вот что я делаю. Слишком легко ударить по клавишам и случайно нажать C-x C-c y, тем более, что у меня есть схожие клавиши (например, C-x c, C-x C-x, C-x C-y).

Ответ 4

Если вы ищете более короткий ответ, у меня была эта строка в нижней части всех моих файлов .emacs с прошлого века:

(shell)

Ответ 5

Я добавил следующее в свою конфигурацию emacs, чтобы предотвратить случайное закрытие. Мне не нравилось подтверждать закрытие emacs для чего-то вроде однократного коммита, но я ненавижу потерять сеанс emacs случайно, когда глубоко в проблеме.

Это добавляет глобальный флаг состояния в emacs, описывающий, заблокирован он или нет. Этот флаг устанавливается либо автоматически после открытия emacs в течение 5 минут, либо вручную с помощью команды lock-emacs. Позднее блокировку можно снять вручную с помощью команды unlock-emacs.

Если emacs заблокирован, и вы пытаетесь закрыть его (предположительно случайно), вместо этого emacs выдаст вам сообщение о том, что emacs заблокирован и не может быть закрыт. Если он разблокирован, close ведет себя точно так же, как и по умолчанию.

;; don't close emacs on accident
(setq emacs-locked nil)
(setq confirm-kill-emacs
      (lambda (&rest args)
        (if emacs-locked
            (progn
              (message "%s" "Emacs is locked, and cannot be closed.")
              nil)
            t)
         ))
(defun lock-emacs-silently ()
  (progn
    (setq emacs-locked t))
  )

(defun lock-emacs ()
  "Prevent emacs from being closed."
  (interactive)
  (progn
    (lock-emacs-silently)
    (message "%s" "Emacs is now locked."))
  )
(defun unlock-emacs ()
  "Allow emacs to be closed."
  (interactive)
  (progn
    (setq emacs-locked 'nil)
    (message "%s" "Emacs can now be closed."))
  )
(run-at-time "5 minutes" nil 'lock-emacs-silently)

(Открыт для предложений о том, как сделать порцию verify-kill-emacs приятнее, я начинающий новичок :)).