Io uso ido-mode
, ma una cosa che odio al riguardo è che dopo C-x C-f
non posso usare le up/down
chiavi per scorrere i file aperti di recente, come un tempo con iswitchb
. Come posso iniziare ido
a lavorare in questo modo?
Io uso ido-mode
, ma una cosa che odio al riguardo è che dopo C-x C-f
non posso usare le up/down
chiavi per scorrere i file aperti di recente, come un tempo con iswitchb
. Come posso iniziare ido
a lavorare in questo modo?
Risposte:
Osservando le opzioni di personalizzazione di ido-mode
( M-x customize-group
RET ido
RET), non vedo alcuna opzione per abilitare il comportamento ciclistico che descrivi.
È possibile, tuttavia, aggiungere quanto segue al file 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 questo in atto puoi premere C-x C-rper ottenere il completamento Ido per la selezione dei file aperti di recente.
Per impostazione predefinita, i 20 file più recenti verranno mantenuti nella cronologia. Ti suggerisco di farlo girare fino a qualcosa come 150 impostando recentf-max-saved-items
:
(setq recentf-max-saved-items 150)
Non lo vedo menzionato in molti punti, ma Ido Virtual Buffers rende super facile l'accesso ai file recenti. Abilitali così:
(setq ido-use-virtual-buffers t)
Il comportamento che si ottiene è questo:
Se non-
nil
, fare riferimento a buffer passati ("virtuali") nonché a quelli esistenti.Sostanzialmente funziona come segue: supponi che stai visitando un file e che il buffer venga ripulito da
midnight.el
. Successivamente, si desidera passare a quel buffer, ma scoprire che non è più aperto. Con i buffer virtuali abilitati, il nome del buffer rimane nell'elenco dei buffer (usando laido-virtual
faccia e sempre alla fine) e, se lo si seleziona, riapre il backup del file. Ciò ti consente di pensare meno al fatto che i file aperti di recente siano ancora aperti o meno. Il più delle volte è possibile uscire da Emacs, riavviare e quindi passare a un buffer di file che era precedentemente aperto come se lo fosse ancora.
C-x C-r
esso non è possibile aprire un nuovo file. Sono anche sorpreso che non sia possibile personalizzarlo in modo semplice. La storia di C-x C-f
è una caratteristica così ovvia che non riesco a capire perché non sia ancora implementato ido
. Ad esempio M-x up/down
scorre ciclicamente i comandi recenti, M-% up/down
cicla con sostituisce query recenti, anche al di fuori di emacs: tutte le shell come bash o zsh usano su / giù per richiamare i comandi precedenti. Per me C-x C-f up/down
dovrebbe scorrere i file aperti di recente. Punto.
ido-use-virtual-buffers
- un'ottima funzionalità che dovrebbe essere davvero attiva per impostazione predefinita IMO.
Sebbene i binding si siano evoluti nel tempo, a partire da oggi, quando invochi ido-find-file
o ido-find-file-read-only
, puoi utilizzare i seguenti binding disponibili nella configurazione predefinita:
ido-prev-work-file
ido-next-work-file
Oltre a questi, non essendo come ergonomicamente più piacevole l' M-pe M-nattacchi che era stato usato per prima di ido , sono anche lento, e la conseguente minibuffer chiacchiere è fonte di distrazione e confusione. ido fa qualcosa di più che mostrare semplicemente un nome file aperto di recente; segnala che si tratta di "Cercare" nome file "...", forse per riluttanza a offrire un nome per un file che non esiste più.
Il messaggio "Ricerca" proviene dalla funzione ido-make-merged-file-list
. Leggendo la fonte , non vedo alcun modo per disabilitare qualsiasi magia stia facendo questa funzione.
Puoi considerare di associare ido-prev-work-file
e ido-next-work-file
accoppiare qualcosa di più naturale C-M-pe C-M-n, o scambiare i binding correnti M-p( ido-prev-work-directory
) e M-n( ido-next-work-directory
) con questi.
Ecco il codice Emacs Lisp per ripristinare M-pe M-nscorrere i file recenti, spostando i binding focalizzati sulla directory predefinita su C-M-pe C-M-nrispettivamente:
(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)))))
La risposta data da @itsjeyd è piuttosto completa. Vorrei solo suggerire una funzione:
(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)
Per gentile concessione di WikEmacs
Ho trovato che helm-for-files
funziona meglio di una qualsiasi delle risposte di cui sopra ai fini del completamento automatico del nome file e con un'interfaccia di ricerca piacevole. Inoltre, puoi configurarlo per includere qualsiasi elemento di ricerca che ti piace.