Tab penyelesaian Zsh seperti jalur parsial

11

Terkait dengan Bash-like partial partial-complete untuk nama file di Vim

Salah satu fitur yang benar-benar fantastis zshadalah Anda dapat mengetik, misalnya ls /u/s/m/m/who.1, menekan Tabdan membuatnya lengkap ls /usr/share/man/man1/who.1.gz. Setelah Anda terbiasa, sangat menyebalkan untuk kembali /u<tab>/s<tab>/m<tab>/m<tab>..., terutama ketika seluruh jalur parsial hanya dapat menyelesaikan ke satu jalur yang sebenarnya, tetapi setiap komponen individu mungkin memiliki beberapa penyelesaian. Bisakah ini dicapai dalam Vim, misalnya, ketika menggunakan :eatau :cd?

Ada fitur-fitur terkait jalur yang berguna lainnya di zsh, seperti menggunakan cd foo baruntuk pindah ke jalur yang sama dengan foodiganti dengan bar(yaitu, /blah/foo/baz/yadamenjadi /blah/bar/baz/yada). Jika ada solusi yang membawa ini juga (pada dasarnya menyerahkan tugas-tugas terkait shell ke shell yang melakukan itu dengan sangat baik), itu akan bagus.

muru
sumber
1
Saya tidak mengetahui apa pun yang mencapai persis apa yang Anda minta, tetapi ada berbagai pencari file fuzzy yang memungkinkan Anda untuk membuka file dengan cara yang sama. Saya mendukung CtrlP, tetapi ada juga Command-T dan saya yakin ada orang lain yang saya lupa namanya.
Kaya
1
@ Kaya Selama saya tidak perlu menumbuk Tab selusin kali, saya akan senang.
muru
Sudah ada pertanyaan serupa di SO.
romainl

Jawaban:

6

Saya dulu menggunakan CtrlP dan plugin terkait lainnya jauh sebelumnya sampai saya benar-benar menemukan kekuatan asli vim. Izinkan saya menjelaskan beberapa cara untuk melakukan ini tanpa memerlukan plugin eksternal:

  1. :e, hal yang menyenangkan tentang: e adalah Anda dapat melakukan sesuatu seperti :e /u*/s*/m*/m*/<Tab>dan vim akan memperluas itu secara otomatis untuk Anda :e /usr/share/man/man. Itu jauh lebih pendek dan sederhana dari apa yang Anda posting, tetapi cara yang lebih baik adalah dengan melakukannya :e /usr/**/man<Tab>, dengan cara itu akan terlihat secara rekursif di bawah /usrdan daftar semua jalur yang cocok, ini bisa memakan waktu meskipun tergantung pada seberapa besar set, tetapi dalam memproyeksikan ini bekerja dengan sangat baik karena Anda dapat melakukan sesuatu seperti :e ap**/jav**/user<Tab>dan itu akan menyelesaikan semua jalur yang tidak lengkap dan memberi Anda daftar jalur yang cocok dan bekerja dengan sangat baik.
  2. :b, Untuk membuka buffer yang ada. Ini sangat kuat karena ia menerima parsial secara default sehingga Anda bisa melakukan sesuatu seperti :b usr*man<Tab>itu dan itu akan melengkapi nama file jika sudah dimuat dalam daftar buffer. Ini sangat baik karena hampir instan dan sangat cepat. Saya juga sering menggunakan sesi vim, dengan bantuan tpope / vim-obsesi dan dhruvasagar / vim-prosession , yang menjaga semua file yang saya buka dalam daftar buffer dan mereka tersedia bahkan jika saya ada vim dan kembali ke sana dari direktori proyek.
Dhruva Sagar
sumber
1
/u*/s*/m*/m*/<Tab>adalah bagaimana saya dulu bekerja di sekitar bash. Ini bukan pengganti zsh sejauh satu mil. /usr/**/man<Tab>sangat lambat ketika seluruh sistem file terbuka, tetapi mungkin berguna untuk proyek-proyek kecil. Kecuali saya salah paham :b, ini bukan untuk membuka file baru.
muru
@muru Anda benar, ini bukan pengganti zsh tapi masih lebih baik daripada harus mengetik semuanya sendiri, ini tentang membuatnya lebih mudah, **memang sangat lambat, tetapi bekerja baik untuk proyek reguler. :badalah untuk buffer terbuka yang ada, itu sebabnya menggunakan sesi membantu.
Dhruva Sagar
5

vim-zsh-path-completion bertujuan untuk melakukan persis apa yang Anda minta (bagian pertama, setidaknya), tapi saya belum pernah mencobanya. (Saya bahkan belum pernah mendengarnya sampai romainl ditautkan ke jawaban SO oleh penulisnya , meskipun dokumentasinya juga menyebutkan beberapa batasan.

Selain itu, ada berbagai pencari file fuzzy yang mencapai sesuatu yang mirip untuk membuka file.

Plugin favorit saya untuk ini adalah CtrlP . Ketika digunakan untuk membuka file, ia mencari file apa pun yang path lengkapnya mengandung karakter yang Anda ketik dalam urutan yang benar — Anda tidak harus mengetikkan bagian dari setiap komponen path (dan semua pemisah path) saat Anda miliki dalam contoh Anda, tetapi berfungsi dengan baik jika Anda melakukannya. Itu juga menggunakan antarmuka yang sama untuk membuka file yang baru saja digunakan dan buffer saat ini terbuka, dan lebih banyak lagi.

Secara default, ini memetakan <c-p>dalam mode normal untuk membuka prompt CtrlP. Prompt menampilkan daftar file, yang dipersempit saat Anda mengetikkan karakter. Anda dapat menekan Enterkapan saja untuk membuka file yang saat ini dipilih, atau menggunakan <c-k>dan <c-j>untuk memindahkan pilihan ke atas dan ke bawah melalui daftar file yang saat ini cocok.

Alternatif populer lainnya adalah Command-T , tapi saya lebih suka CtrlP karena itu diimplementasikan dalam VimScript; Command-T memiliki komponen Ruby.

Kaya
sumber