Archivos abiertos recientemente en modo ido

12

Lo uso ido-mode, pero una cosa que odio es que después C-x C-fno puedo usar las up/downteclas para recorrer los archivos abiertos recientemente, como solía ser, por ejemplo, con iswitchb. ¿Cómo puedo configurar idopara trabajar de esta manera?

WeSenseASoulInSearchOfAnswers
fuente

Respuestas:

16

Mirando las opciones de personalización para ido-mode( M-x customize-group RET ido RET), no veo ninguna opción para habilitar el comportamiento de ciclismo que describe.

Sin embargo, puede agregar lo siguiente a su archivo init:

(require 'recentf)

(defun ido-recentf-open ()
  "Use `ido-completing-read' to find a recent file."
  (interactive)
  (if (find-file (ido-completing-read "Find recent file: " recentf-list))
      (message "Opening file...")
    (message "Aborting")))

(global-set-key (kbd "C-x C-r") 'ido-recentf-open)

Con esto en su lugar, puede presionar C-x C-rpara completar Ido para seleccionar archivos abiertos recientemente.

Por defecto, los 20 archivos más recientes se mantendrán en el historial. Sugiero que aumente eso a algo así como 150 configurando recentf-max-saved-items:

(setq recentf-max-saved-items 150)

Bonificación: acceso a archivos recientes, edición con esteroides

No lo veo mencionado en muchos lugares, pero Ido Virtual Buffers hace que sea muy fácil acceder a archivos recientes. Habilítelos así:

(setq ido-use-virtual-buffers t)

El comportamiento que obtienes es este:

Si no es así nil, consulte los buffers pasados ​​("virtuales") y los existentes.

Esencialmente funciona de la siguiente manera: supongamos que está visitando un archivo y el búfer se limpia midnight.el. Más tarde, desea cambiar a ese búfer, pero descubre que ya no está abierto. Con los búferes virtuales habilitados, el nombre del búfer permanece en la lista de búferes (usando la ido-virtualcara, y siempre al final), y si lo selecciona, vuelve a abrir el archivo nuevamente. Esto le permite pensar menos sobre si los archivos abiertos recientemente aún están abiertos o no. La mayoría de las veces puede salir de Emacs, reiniciar y luego cambiar a un búfer de archivos que estaba abierto previamente como si todavía lo estuviera.

itsjeyd
fuente
Hasta ahora he votado, aceptaré más tarde cuando lo probaré y entenderé cómo funciona. (Mi comprensión de lisp es muy pobre).
WeSenseASoulInSearchOfAnswers
@WeSenseASoulInSearchOfAnswers Claro, tómate tu tiempo. Avíseme si tiene alguna pregunta específica sobre el código que publiqué.
itsjeyd
Acepté pero, francamente, no me gusta porque con C-x C-rél no es posible abrir un archivo nuevo. También me sorprende que no sea posible personalizarlo de manera simple. La historia de C-x C-fes una característica tan obvia que no puedo entender por qué idotodavía no se implementa . Por ejemplo, M-x up/downciclos a través de comandos recientes, M-% up/downciclos a través de reemplazo de consultas recientes, incluso fuera de emacs: todos los shells como bash o zsh usan arriba / abajo para recuperar comandos anteriores. Para mí C-x C-f up/downdebería recorrer los archivos abiertos recientemente. Punto final.
WeSenseASoulInSearchOfAnswers
@WeSenseASoulInSearchOfAnswers Estoy de acuerdo con usted, y no tengo idea de por qué esto no está disponible o no se puede personalizar de fábrica. Para mí personalmente, no es un gran problema porque uso la función de búferes virtuales que describo en mi respuesta, por lo que cambiar a un archivo reciente es lo mismo que cambiar a otro búfer; realmente fácil. Pero entiendo que puede ser frustrante si una función a la que está acostumbrado no está disponible.
itsjeyd
55
+1 para ido-use-virtual-buffers: una gran característica que realmente debería estar activada por defecto IMO.
Jon O.
2

Aunque los enlaces han evolucionado con el tiempo, a partir de hoy, cuando invocas ido-find-fileo ido-find-file-read-onlypuedes usar los siguientes enlaces disponibles en la configuración predeterminada:

  • M-o invoca ido-prev-work-file
  • C-M-o invoca ido-next-work-file

Aparte de éstos no ser tan agradable como el ergonómicamente M-py M-nfijaciones que se había utilizado para antes de intentar ido , también son lentos, y la consiguiente charla minibuffer se distracción y confusión. ido hace algo más que mostrar un nombre de archivo abierto recientemente; informa que está "Buscando ' nombre de archivo ' ...", quizás por renuencia a ofrecer un nombre para un archivo que ya no existe.

El mensaje "Buscando" proviene de la función ido-make-merged-file-list. Al leer la fuente , no veo ninguna forma de desactivar la magia que está haciendo esta función.

Puede considerar volver a vincular ido-prev-work-filey ido-next-work-fileemparejar a algo más natural como C-M-py C-M-n, o intercambiar los enlaces actuales M-p( ido-prev-work-directory) y M-n( ido-next-work-directory) por estos.

Aquí está el código Emacs Lisp para restaurar M-py M-nrecorrer los archivos recientes, moviendo los enlaces predeterminados centrados en el directorio a C-M-py C-M-nrespectivamente:

(add-hook 'ido-setup-hook
          (lambda ()
            (let ((kmap ido-file-dir-completion-map))
              (let ((key '(meta ?n)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-next-work-file))
              (let ((key '(meta ?p)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-prev-work-file)))))
seh
fuente
1
¡Bienvenido a Emacs SE! Intente mantener sus respuestas centradas en la pregunta del póster original. Seguramente su comentario sobre la "charla del minibúfer" es interesante y relacionado, pero distrae de encontrar una respuesta real a la pregunta. Más importante aún: intente expresar su respuesta en forma de ... bueno, una respuesta. Lo que escribiste se lee más como un comentario, que no es adecuado para un sitio de preguntas y respuestas como este.
pimentón
Bueno, el primer párrafo y su siguiente lista responden a la pregunta original, que buscaba claves para recorrer los archivos abiertos recientemente. Esos enlaces existen por defecto, pero ninguna de las otras respuestas aquí mencionó estos enlaces. Estoy trabajando en el código de enlace y lo incluiré en mi respuesta una vez que esté satisfecho con él.
seh
2

Lo que he recurrido en este caso es volver al comportamiento normal del minibúfer escribiendo Cf en idomode. Entonces tendrás claves de navegación de historial normales. Si lo sabe de antemano, puede ser rápido: Cxff :-)

tu amigo
fuente
1

La respuesta dada por @itsjeyd es bastante completa. Permítanme sugerir una función:

(defun ido-choose-from-recentf ()
  "Use ido to select a recently visited file from the `recentf-list'"
  (interactive)
  (find-file (ido-completing-read "Open file: " recentf-list nil t)))

;; bind it to "C-c f"
(global-set-key (kbd "C-c f") 'ido-choose-from-recentf)

Cortesía de WikEmacs.

Nsukami _
fuente
1

Encontré que helm-for-filesfunciona mejor que cualquiera de las respuestas anteriores con el fin de completar automáticamente el nombre del archivo y tener una buena interfaz de búsqueda. Además, puede configurarlo para incluir cualquier elemento de búsqueda que desee.

usuario10375
fuente
1
@Drew helm viene con el modo ido en sí. La mayoría de las veces, cuando las personas buscan en esta publicación, pueden estar interesadas en conocer otras alternativas para resolver el problema.
user10375