Bagaimana cara memberitahu Ido untuk keluar dari jalan ketika saya sudah bisa menempelkan nama file?

14

Saya mencoba membuat diri saya menggunakan mode Ido. Terkadang itu menyenangkan, tetapi di lain waktu itu sangat bodoh. Inilah kekecewaan terbesar saya.

Saya membaca beberapa log dengan nama file lengkap, lalu saya salin satu nama, coba buka file itu.

Cara untuk melakukan ini tanpa Ido: C-aC-yC-kRET

Dengan Ido ada dua masalah utama:

  1. Jika saya memiliki seluruh nama file, tidak ada cara untuk memasukkan itu (saya harus menghapus garis miring pertama, bahkan menekan saja //tidak akan membantu.

  2. Saya tidak dapat mengedit bagian menengah dari nama file sehingga sisanya tidak dimodifikasi.

Atau bisakah saya?

wvxvw
sumber
2
Anda dapat turun kembali ke saham find-filedengan C-x C-fdan paste di biasanya. Tapi kemudian, itu lebih banyak penekanan tombol. Atau Anda dapat menggunakan Helm jika Anda menginginkan fitur yang kaya find-filedan tetap memuaskan penggunaan case Anda.
Tu Do
1
Ah, terima kasih, nah, aku tidak sering melakukan ini sehingga aku mengeluh tentang dua penekanan tombol ekstra. Ini sebenarnya akan menjawab kebutuhan saya untuk saat ini. Terima kasih!
wvxvw
@Tu Do Anda harus menuliskannya sebagai jawaban di bawah ini. Saya telah menemukan C-x C-ffallback berguna berkali-kali!
Kaushal Modi

Jawaban:

17

Saat sebuah idoperintah aktif ( ido-find-filedalam hal ini), Anda dapat kembali ke versi non-ido dari perintah yang sama ( find-filedalam hal ini) menggunakan pengikatan ido-default C-x C-funtuk ido-fallback-command.

Untuk menjawab pertanyaan Anda,

  • Yang pertama C-x C-fakan menelepon ido-find-file.
  • Yang kedua C-x C-fakan kembali ke find-file.
  • Kemudian Anda dapat melakukan C-a C-y C-k RETseperti yang biasanya Anda lakukan untuk menarik path file yang disalin ke minibuffer.

Catatan: In ido, C-x C-f C-x C-fakan melakukan hal yang sama dengan C-x C-f C-f, yaitu kembali ke find-file.

Tentang C-fdiido dalam ido-mode, C-fpasti ido-magic-forward-char. Dari ido.el,

(Defun ido-magic-forward-char (arg)
  "Maju dalam input pengguna atau lakukan aksi sihir.
Jika tidak ada input pengguna, atau pada akhir input, lakukan tindakan ajaib:
Cx Cb ... Cf beralih ke `ido-find-file '.
Cx Cf ... Cf fallback ke non-Ido `find-file '.
Cx Cd ... Cf fallback ke non-Ido brief `dired '.
Cx d ... Cf mundur ke non-Ido `dired '."
Tu Do
sumber
2
Bagi saya itu hanya C-funtuk kembali find-file, bukan C-x C-f. Saya tidak melihat bahwa saya telah menyesuaikannya (dan saya, seperti orang lain di sini banyak bergantung pada fallback. idoMasalahnya hampir sama nilainya, setelah menggunakannya untuk sementara waktu sekarang).
harpo
1
@harpo saya hanya memperbarui jawaban di atas menjelaskan mengapa C-x C-f C-fjuga bekerja.
Kaushal Modi
Berkat @kaushalmodi untuk sebagian besar pekerjaan. Jawaban saya awalnya sederhana seperti komentar. Itu harus menjadi jawabannya :) Hanya sebuah catatan untuk kredibilitas.
Tu Do
Ini menyelamatkan kewarasan saya, karena ido tidak bermain bagus dengan gelandangan saat menggunakan jalur absolut. Terima kasih.
Jérémie
6

Mengingat Anda berurusan dengan nama jalur lengkap, metode lain mungkin berfungsi:

  • use M-x ffap( find-file-at-point): secara otomatis akan membaca nama path dan membuka file
  • aktifkan M-x compilation-shell-minor-modeyang akan mengubah font jalur dan membuatnya "dapat diklik" (dengan mulut atau RET). Mengkliknya akan membawa Anda ke file itu dan baris tertentu, dan Anda dapat menggunakan next-errordan previous-errormenavigasi. Saya sering menggunakannya, seperti di shell-mode .
Ehvince
sumber
5

Karena selalu ada lebih dari satu cara untuk melakukannya, inilah variasi pada ide @ abo-abo yang membuat penyelesaian ido aktif daripada jatuh kembali ke perintah normal find.

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

Dengan ikatan ini:

  • Jika kill saat ini adalah jalur direktori yang valid, Anda bisa mulai ido-find-file, tekan C-yuntuk melompat ke direktori yang disentak, dan kemudian terus menggunakan penyelesaian ido untuk memilih file.

  • Jika kill saat ini adalah path file yang valid, Anda bisa mulai ido-find-file, tekan C-yuntuk lompat ke direktori yanked dan menawarkan nama file yanked sebagai penyelesaian, dan tekan RET untuk membuka file itu.

  • Jika pembunuhan saat ini adalah hal lain, ia akan ditarik secara normal.

glukas
sumber
Mungkinkah tidak lebih baik untuk let-bind berbagai ido-...variabel daripada setqmereka? Saat ini, sepertinya Anda menetapkan nilai secara permanen daripada melakukannya selama umur fungsi.
Dan
@Dan saya mengikuti pola perintah ido seperti ido-next-work-directory. Saya pikir variabel diatur sehingga mereka bertahan di panggilan keluar-minibuffer dan penyegaran berikutnya. Tapi aku masih belum sepenuhnya mengelus ido internal!
glukas
Ya, saya bertanya-tanya apakah mereka kemudian disegarkan. Hanya ingin dimasukkan dalam kepala-up.
Dan
4

Mungkin seperti ini:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

Jika kill saat ini adalah file yang ada, melakukan C-y C-y mungkin seharusnya memberi Anda apa yang Anda inginkan.

abo-abo
sumber