Não permitir fechar a última janela do Emacs através do botão fechar do Window-Manager

3

Eu gosto de iniciar o Emacs como parte de um script de login e deixá-lo rodando pela duração da minha sessão de login (que normalmente é de semanas).

Eu tenho scripts para chamar o emacs-client, o que me permitirá usar um gerenciador de arquivos ou o Windows Explorer para localizar arquivos e clicar com o botão direito para editá-los no Emacs.

Muitas vezes acabo com muitas janelas do emacs (frames) abertas e gosto de apenas fechá-las clicando no botão MS-Windows ou KDE X no canto superior direito.

O problema é que, se a janela for a última, isso desligará o emacs, que perderá todos os tipos de informações interessantes da história.

Como solução alternativa, eu uso C-x 5 0 , o que não me deixa fechar o último quadro, mas isso geralmente não é tão conveniente quanto usar o mouse

Alguém sabe como configurar o Emacs para que ele possa interceptar o botão Window-Close do último quadro para solicitar uma confirmação ou simplesmente desautorá-lo?

No MS-Windows, não permitir o fechamento da última janela pode fazer com que o logoff seja interrompido se o emacs ainda estiver em execução, mas não estou muito preocupado com isso.

    
por Adrian Pronk 08.07.2011 / 12:11

2 respostas

4

Duas maneiras de pensar, mas tenho certeza de que há mais. A função que é chamada quando você clica no botão do quadro de exclusão (canto superior direito [X] no Windows) é handle-delete-frame . Você pode avisar esse comando ou pode substituí-lo como a função que manipula esse clique por algum outro comando.

Para aconselhá-lo:

    (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)))

Para substituí-lo:

    (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)

Não faça ambos destes; apenas faça um deles.

    
por 26.08.2011 / 16:48
3

Você deve usar o daemon emacs: inicie o Emacs como

       emacs -d

Então o Emacs será lançado em segundo plano, esperando que o emacsclient abra uma nova janela. O daemon do Emacs não será fechado quando suas últimas janelas forem fechadas.

    
por 08.07.2011 / 13:09