Às vezes, eu mato acidentalmente um buffer e quero reabri-lo, assim como o CSt para desfazer a guia fechada no Firefox, mas não há comando interno no Emacs, defun undo-kill-buffer
no http://www.emacswiki.org/RecentFiles :
(defun undo-kill-buffer (arg)
"Re-open the last buffer killed. With ARG, re-open the nth buffer."
(interactive "p")
(let ((recently-killed-list (copy-sequence recentf-list))
(buffer-files-list
(delq nil (mapcar (lambda (buf)
(when (buffer-file-name buf)
(expand-file-name (buffer-file-name buf)))) (buffer-list)))))
(mapc
(lambda (buf-file)
(setq recently-killed-list
(delq buf-file recently-killed-list)))
buffer-files-list)
(find-file
(if arg (nth arg recently-killed-list)
(car recently-killed-list)))))
não funciona de todo. Se você conhece o elisp, como resolver esse problema?
Se ele puder mostrar uma lista dos buffers fechados e eles, posso escolher um deles para reabrir, isso seria melhor.
buffers
undo
kill-buffer
CodyChan
fonte
fonte
Respostas:
Aqui está outra alternativa simples que não requer
recentf
. Conectar a primeira funçãokill-buffer-hook
empurrará o nome do arquivo associado ao buffer para uma lista. (Observe que, se você matar um buffer que não está visitando um arquivo, ele desapareceu definitivamente.) A última função retira esse arquivo da lista e o visita:Observe que
killed-file-list
é uma lista; portanto, você pode, por exemplo, escrever uma função mais complexa para percorrer essa lista, em vez da simples descrita aqui: depende de você o quanto deseja fazer com ela.EDIT: desculpe, eu perdi a última disposição no seu Q sobre querer uma lista de arquivos para escolher. A função a seguir é um pouco mais sofisticada que a versão acima, na medida em que é usada
completing-read
para permitir que você especifique qual dos arquivos mortos você deseja. Se você estiver usando algo parecidoido
, ele permitirá percorrer todos os arquivos que você matou na sessão atual, por padrão, para os mais recentes. Observe que presume que você já tenha solicitadocl-lib
:fonte
Eu gostaria de perguntar: “Você realmente quer matá-lo?”. De fato, matar um buffer é uma coisa tão comum no mundo do Emacs, mas uma vez morto, o buffer desaparece e, como demonstra sua pergunta, nem sempre é desejável.
No entanto, podemos escolher outra maneira, para que você nunca precise restaurar o buffer morto - apenas prefira enterrar do que matar. Dê uma olhada no pacote Kill or Bury Alive , que está disponível via MELPA .
Da descrição do pacote:
fonte
Eu uso esta solução neste post SO e ele funciona bem.
A solução é elegante, mas não perfeita; ele armazena uma lista de buffers ativos e retorna o primeiro arquivo da listaf recente que não pertence à lista de buffers ativos.
fonte
Você precisa ligar
recentf-mode
. Para fazer isso, corraM-x recentf-mode
. Em seguida, a função pode não funcionar até você abrir ou matar alguns novos buffers; Eu não acho que você terárecentf-list
preenchido.Se você deseja que isso seja ativado quando o Emacs iniciar, coloque isso no seu arquivo init:
Você pode colocar o
defun
que encontrou lá e vinculá-lo a uma chave, se quiser.Uma desvantagem desse modo parece ser que o modo recentf foi criado para rastrear
opened
arquivos, e não arquivos mortos. Portanto, se você executar a função duas vezes, ela não reabrirá o segundo arquivo morto mais recentemente.fonte
(recentf-mode 1)
com o argumento explícito, para que alguém reavaliar seu arquivo init no Emacs 23 não acabe desativando o modo novamente.O ErgoEmacs possui uma função
close-current-buffer
que, em particular, mantém uma lista de buffers fechados recentemente:Portanto, usando estes pode-se reabrir este buffer fechado de sessão com
fonte
Bem, eu não sou veterano do Emacs, e talvez isso esteja disponível apenas nas versões recentes. Sei que voltarei alguns anos depois, mas talvez possa ser útil para outras pessoas, pois minha pesquisa me trouxe até aqui.
Estou no Emacs v25.2.1,
recentf
já está disponível aqui e tem uma função pronta que faz o que você precisa. Eu já o ativei no passado em versões mais antigas, então.emacs
tenho:E isso funcionou perfeitamente para mim. Claro, altere o atalho para o que mais lhe agrada.
fonte