2010-02-09 10 views
13

A veces me picaba el dedo y mataba algún tampón que pretendía enterrar. El problema es que utilizo vagabundo para editar archivos de varias máquinas, y esos nombres de archivo son largos y desagradables y, en general, no soy tan bueno para encontrar dónde están mis archivos. Así que me gustaría que emacs haga un seguimiento de los archivos que acabo de cerrar para que pueda volver a abrirlos fácilmente (a través de, idealmente, un prompt ido).¿Cómo obtener una lista de los últimos archivos cerrados en emacs?

Esto es lo que tengo hasta ahora, lo que no está funcionando:

(defvar closed-files '()) 

(defun track-closed-file() 
    (message buffer-file-name) 
    (and buffer-file-name 
     (cons buffer-file-name closed-files))) 

(defun last-closed-files() 
    (interactive) 
    (find-file (ido-completing-read "Last closed: " closed-files))) 

(add-hook 'kill-buffer-hook 'track-closed-file) 

No estoy realmente grande en elisp y probablemente desastre en algún lugar en la definición de la variable y la adición de células a ella ...

[I saben de recentf, sino que realiza un seguimiento de los archivos abiertos, en lugar de archivos cerrados.]

Respuesta

16

yo sólo he probado esto y funciona con el uso de una lista y add-to-list esto también elimina las entradas duplicadas. ¿Esto satisface tus necesidades?

(defvar closed-files (list)) 

(defun track-closed-file() 
    (message buffer-file-name) 
    (and buffer-file-name 
     (add-to-list 'closed-files buffer-file-name))) 

(defun last-closed-files() 
    (interactive) 
    (find-file (ido-completing-read "Last closed: " closed-files))) 

(add-hook 'kill-buffer-hook 'track-closed-file) 

actualización

me gusta bastante esta funcionalidad y se han colocado en la configuración de mi emacs. También puede beneficiarse de los cambios que he hecho.

Esta adición empujará a los archivos cerrados más recientes al encabezado de la lista, incluso si se han cerrado previamente (y ya están en la lista closed-files).

(defun track-closed-file() 
    (and buffer-file-name 
     (message buffer-file-name) 
     (or (delete buffer-file-name closed-files) t) 
     (add-to-list 'closed-files buffer-file-name))) 

Su problema original era que cons que volverá la nueva lista, no manipular la lista de entrada:

(setq mylist '(2 3)) 
=> (2 3) 
(cons 1 mylist) 
=> (1 2 3) 
mylist 
=> (2 3) 

en este caso se tendría que hacer:

(setq mylist (cons 1 mylist)) 
    => (1 2 3) 
mylist 
    => (1 2 3) 
+0

Funciona. ¡Una resolución de año nuevo para aprender ceceo por lo básico es cierto! – polyglot

+0

Esto es realmente útil. Lo he agregado a mis .emacs también. Gracias. – seth

+0

¡Fantástico! ¡Gracias! – ThePower

0

Tener ¿Has pensado en volver a vincular "Cx k" a bury-buffer en lugar de kill-buffer? (Luego puede limpiar periódicamente su lista de búfer con algo como 'midnight.el' si es necesario.)

+0

oh, señor. Tal como están las cosas, suelo tener unos 50 búferes abiertos ... Pero siempre hay otra forma. –

+0

Bueno reenlace bury-buffer para cambiar-F4 y kill-buffer a ctrl-F4, y a veces me confundo :) Pero soy bastante loco con respecto a mis búferes abiertos que me estremezco de horror por no matar todos los archivos de registro de gazillion que abrí temporalmente para su inspección. – polyglot

+0

Personalmente dejo que los búferes se cierren, y uso exactamente la integración ido/recentf que mencionó OtherMichael para reabrirlos si es necesario. Si abre y luego cierra archivos rápidamente, como sugiere el caso con esos archivos de registro, entonces no hay mucha diferencia entre los archivos abiertos recientemente y los cerrados recientemente. – sanityinc

5

¿Ha intentado usar recentf? Se debe proporcionar con Emacs.

originalmente lo vi a través de XSteve's Emacs power-user tips donde se sugiere la unión a F12, y proporciona una interfaz interactiva:

;;recentf 
(require 'recentf) 
(recentf-mode 1) 
(setq recentf-max-saved-items 500) 
(setq recentf-max-menu-items 60) 
(global-set-key [(meta f12)] 'recentf-open-files) 

(defun xsteve-ido-choose-from-recentf() 
    "Use ido to select a recently opened file from the `recentf-list'" 
    (interactive) 
    (let ((home (expand-file-name (getenv "HOME")))) 
    (find-file 
    (ido-completing-read "Recentf open: " 
          (mapcar (lambda (path) 
            (replace-regexp-in-string home "~" path)) 
            recentf-list) 
          nil t)))) 

[Actualización]: whups, acaba de ver su nota sobre la conciencia recentf. Es cierto que es para todos los archivos abiertos, por lo que también incluye los que están actualmente en búferes abiertos. Como solo he accedido a él cuando intento rastrear un archivo recientemente cerrado, nunca pensé en eso. Aún así, ¿quizás filtrar los archivos abiertos de esa salida podría ser más fácil que reinventar toda la rueda?

0

Esta hermosa función también está disponible como parte del paquete "nada". Fuertemente sugiero probar esto.

Pero "cualquier cosa" tiene una versión más nueva llamada "timón" que no parece tener esta característica .

Cuestiones relacionadas