File yang baru dibuka dalam mode ido

12

Saya menggunakan ido-mode, tetapi satu hal yang saya benci tentang itu adalah bahwa setelah C-x C-fsaya tidak dapat menggunakan up/downkunci untuk menggilir file yang baru dibuka, seperti dulu misalnya dengan iswitchb. Bagaimana saya bisa mulai idobekerja dengan cara ini?

WeSenseASoulInSearchOfAnswers
sumber

Jawaban:

16

Melihat opsi penyesuaian untuk ido-mode( M-x customize-group RET ido RET), saya tidak melihat opsi apa pun untuk mengaktifkan perilaku bersepeda yang Anda uraikan.

Namun, Anda dapat menambahkan yang berikut ke file init Anda:

(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)

Dengan ini di tempat Anda dapat menekan C-x C-runtuk mendapatkan Ido selesai untuk memilih file yang baru dibuka.

Secara default, 20 file terbaru akan disimpan dalam sejarah. Saya sarankan Anda memutar itu hingga sekitar 150 dengan menetapkan recentf-max-saved-items:

(setq recentf-max-saved-items 150)

Bonus: Mengakses file terbaru, edisi on-steroid

Saya tidak melihatnya disebutkan di banyak tempat, tetapi Ido Virtual Buffer membuatnya sangat mudah untuk mengakses file terbaru. Aktifkan mereka seperti itu:

(setq ido-use-virtual-buffers t)

Perilaku yang Anda dapatkan adalah ini:

Jika bukan nil, lihat buffer lalu ("virtual") serta yang sudah ada.

Pada dasarnya ini berfungsi sebagai berikut: Katakanlah Anda mengunjungi file dan buffer dibersihkan oleh midnight.el. Kemudian, Anda ingin beralih ke buffer itu, tetapi ternyata tidak lagi terbuka. Dengan buffer virtual diaktifkan, nama buffer tetap berada di daftar buffer (menggunakan ido-virtualwajah, dan selalu di akhir), dan jika Anda memilihnya, itu akan membuka kembali file tersebut. Ini membuat Anda tidak terlalu memikirkan apakah file yang baru dibuka masih terbuka atau tidak. Sebagian besar waktu Anda dapat keluar dari Emacs, restart, dan kemudian beralih ke buffer file yang sebelumnya terbuka seolah-olah masih ada.

itu hanya
sumber
Sejauh ini saya telah melakukan upgrade, saya akan menerima nanti ketika saya akan mengujinya dan memahami cara kerjanya. (Pemahaman saya tentang cadel sangat miskin).
WeSenseASoulInSearchOfAnswers
@ WeSenseASoulInSearchOfAnswers Tentu, luangkan waktu Anda. Beri tahu saya jika Anda memiliki pertanyaan spesifik tentang kode yang saya posting.
itsjeyd
Saya menerima tetapi terus terang saya tidak suka karena dengan C-x C-ritu tidak mungkin untuk membuka file baru. Saya juga terkejut tidak mungkin untuk menyesuaikannya dengan cara yang sederhana. Sejarah C-x C-fadalah fitur yang jelas sehingga saya tidak bisa mengerti mengapa belum diimplementasikan ido. Misalnya M-x up/downsiklus melalui perintah baru-baru ini, M-% up/downsiklus melalui penggantian permintaan baru-baru ini, bahkan di luar emacs - semua shell sebagai bash atau zsh menggunakan naik / turun untuk memanggil kembali perintah sebelumnya. Bagi saya C-x C-f up/downharus menelusuri file yang baru dibuka. Titik.
WeSenseASoulInSearchOfAnswers
@WeSenseASoulInSearchOfAnswers Saya setuju dengan Anda, dan saya tidak tahu mengapa ini tidak tersedia atau dapat disesuaikan di luar kotak. Bagi saya pribadi, ini bukan masalah besar karena saya menggunakan fitur buffer virtual yang saya jelaskan dalam jawaban saya, jadi beralih ke file terbaru sama dengan beralih ke buffer lain; sangat mudah. Tapi saya mengerti bahwa ini bisa membuat frustasi jika fitur yang Anda gunakan tidak tersedia.
itsjeyd
5
+1 untuk ido-use-virtual-buffers- fitur hebat yang harus diaktifkan secara default IMO.
Jon O.
2

Meskipun binding telah berevolusi dari waktu ke waktu, mulai hari ini, ketika Anda memohon ido-find-fileatau ido-find-file-read-only, Anda dapat menggunakan binding berikut yang tersedia dalam konfigurasi default:

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

Terlepas dari ini tidak secara ergonomis menyenangkan M-pdan M-nmengikat saya telah terbiasa sebelum mencoba ido , mereka juga lambat, dan akibatnya obrolan minibuffer mengganggu dan membingungkan. ido melakukan sesuatu yang lebih dari sekadar menunjukkan nama file yang baru dibuka; itu melaporkan bahwa itu "Mencari ' nama file ' ...", mungkin karena enggan menawarkan nama untuk file yang tidak ada lagi.

Pesan "Mencari" berasal dari fungsi ido-make-merged-file-list. Membaca sumbernya , saya tidak melihat cara untuk menonaktifkan sihir apa pun yang dilakukan fungsi ini.

Anda dapat mempertimbangkan untuk memutarkan kembali ido-prev-work-filedan ido-next-work-filememasangkan sesuatu yang lebih alami seperti C-M-pdan C-M-n, atau menukar ikatan saat ini M-p( ido-prev-work-directory) dan M-n( ido-next-work-directory) untuk semua ini.

Berikut ini adalah kode Emacs Lisp untuk mengembalikan M-pdan M-nmenggilir file-file terbaru, memindahkan masing C-M-p- C-M-nmasing binding yang terfokus pada direktori :

(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
sumber
1
Selamat Datang di Emacs SE! Coba jaga agar jawaban Anda fokus pada pertanyaan pengirim asli. Tentunya komentar Anda tentang "obrolan minibuffer" menarik dan terkait, tetapi mengalihkan perhatian dari menemukan jawaban aktual untuk pertanyaan itu. Yang lebih penting: silakan coba frase jawaban Anda dalam bentuk ... well, sebuah jawaban. Apa yang Anda tulis berbunyi lebih seperti komentar, yang tidak cocok untuk situs tanya jawab seperti ini.
paprika
Paragraf pertama dan daftar berikut menjawab pertanyaan awal, yang mencari kunci untuk menelusuri file yang baru dibuka. Binding tersebut ada secara default, tetapi tidak ada jawaban lain yang menyebutkan binding ini. Saya sedang mengerjakan kode rebinding, dan akan memasukkannya dalam jawaban saya begitu saya puas dengannya.
seh
2

apa yang saya terpaksa dalam kasus ini akan kembali ke perilaku minibuffer normal dengan mengetik Cf di idomode. Maka Anda akan memiliki kunci penelusuran riwayat yang normal. Jika Anda tahu sebelumnya, bisa cepat: Cxff :-)

temanmu
sumber
1

Jawaban yang diberikan oleh @itsjeyd cukup lengkap. Izinkan saya menyarankan fungsi saja:

(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)

Atas perkenan WikEmacs

Nsukami _
sumber
1

Saya menemukan helm-for-fileskarya lebih baik daripada jawaban di atas untuk keperluan pelengkapan otomatis nama file dan memiliki antarmuka pencarian yang bagus. Anda juga dapat mengonfigurasinya untuk memasukkan item pencarian yang Anda suka.

pengguna10375
sumber
1
Helm @Drew dilengkapi dengan mode ido itu sendiri. Sebagian besar waktu ketika orang mencari posting ini mereka mungkin tertarik mengetahui alternatif lain untuk menyelesaikan masalah.
user10375