File aperti di recente in modalità ido


12

Io uso ido-mode, ma una cosa che odio al riguardo è che dopo C-x C-fnon posso usare le up/downchiavi per scorrere i file aperti di recente, come un tempo con iswitchb. Come posso iniziare idoa lavorare in questo modo?

Risposte:


16

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)

Bonus: accesso ai file recenti, edizione su steroidi

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 la ido-virtualfaccia 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.


Finora ho votato, accetterò più tardi quando lo proverò e capirò come funziona. (la mia comprensione di LISP è molto scarsa).
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Certo, prenditi il ​​tuo tempo. Fammi sapere se hai domande specifiche sul codice che ho pubblicato.
itsjeyd

Ho accettato, ma francamente non mi piace perché con C-x C-resso 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/downscorre ciclicamente i comandi recenti, M-% up/downcicla 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/downdovrebbe scorrere i file aperti di recente. Punto.
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Sono d'accordo con te e non ho idea del perché questo non sia disponibile o personalizzabile. Personalmente, non è un grosso problema perché utilizzo la funzione di buffer virtuale che descrivo nella mia risposta, quindi passare a un file recente equivale a passare a un altro buffer; davvero facile. Ma capisco che può essere frustrante se una funzione a cui sei abituato a utilizzare non è disponibile.
itsjeyd

5
+1 per ido-use-virtual-buffers- un'ottima funzionalità che dovrebbe essere davvero attiva per impostazione predefinita IMO.
Jon O.

2

Sebbene i binding si siano evoluti nel tempo, a partire da oggi, quando invochi ido-find-fileo ido-find-file-read-only, puoi utilizzare i seguenti binding disponibili nella configurazione predefinita:

  • M-o invoca ido-prev-work-file
  • C-M-o invoca 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-filee ido-next-work-fileaccoppiare 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)))))

1
Benvenuto in Emacs SE! Cerca di concentrare le tue risposte sulla domanda del poster originale. Sicuramente il tuo commento sul "chiacchiericcio del minibuffer" è interessante e correlato, ma distrae dal trovare una risposta effettiva alla domanda. Ancora più importante: prova a pronunciare la tua risposta sotto forma di ... beh, una risposta. Quello che hai scritto è più simile a un commento, che non è adatto per un sito di domande e risposte come questo.
paprika,

Bene, il primo paragrafo e il seguente elenco rispondono alla domanda originale, che era alla ricerca di chiavi per scorrere i file aperti di recente. Tali associazioni esistono per impostazione predefinita, ma nessuna delle altre risposte qui menzionava queste associazioni. Sto lavorando sul codice di rilegatura e lo includerò nella mia risposta una volta che sono soddisfatto.
seh,

2

ciò a cui ho fatto ricorso in questo caso è tornare al normale comportamento del minibuffer digitando Cf in idomode. Quindi avrai normali chiavi di navigazione nella cronologia. Se lo conosci in anticipo, può essere veloce: Cxff :-)


1

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


1

Ho trovato che helm-for-filesfunziona 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.


1
Il timone di @Drew viene fornito con la modalità ido stessa. Il più delle volte quando le persone cercano questo post potrebbero essere interessate a conoscere altre alternative per risolvere il problema.
user10375,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.