Apakah ada cara untuk mengkonfigurasi VIM untuk mencari secara interaktif di dalam setiap file untuk seluruh proyek?
Secara interaktif , maksud saya memperbarui setiap penekanan tombol.
Sesuatu seperti penasihat Emacs -git-grep , lihat: contoh demo .
ctrl-p
atau plugin serupa adalah apa yang Anda cari. Catatan yangunite.vim
seharusnya juga bisa melakukan itu tetapi saya tidak akan merekomendasikannya karena menurut saya itu adalah plugin yang cukup berat dan membuat bug.ctrl-p
ada cara untuk mencari konten file secara interaktif? Saya hanya pernah menggunakannya untuk mencari file berdasarkan nama mereka secara interaktif.Jawaban:
Saya tidak yakin ini yang Anda cari, tetapi mungkin Anda bisa mencoba fzf dan fzf.vim .
Jika Anda menggunakan vim-plug sebagai pengelola plugin, yang harus Anda lakukan untuk menginstalnya adalah menambahkan baris-baris ini di
vimrc
:... di suatu tempat di antara garis:
dan:
Kemudian jalankan
:PlugInstall
.Di antara berbagai perintah dan pemetaan yang disediakan oleh
fzf.vim
(yang tujuannya hanya untuk menginstal pemetaan dan perintah yang memintafzf
pencarian fuzzy melalui sumber yang telah ditentukan), ada perintah:Ag
.Untuk dapat menggunakannya, Anda harus menginstal perintah shell ag . Pada distribusi berbasis debian, dapat dilakukan dengan perintah berikut:
Proyek di github menjelaskan cara menginstalnya di MacOS:
:Ag
adalah pembungkus sekitar$ ag
, dan memungkinkan Anda untuk mencari pola di file direktori saat ini (yang ditampilkan saat Anda mengetik:pwd
). Pertandingan diperbarui setelah setiap keystroke.Kamu bisa:
C-n
danC-p
Tab
/S-Tab
M-a
atauM-d
Jika Anda memilih satu atau beberapa pertandingan, setelah menekan Enter, mereka akan mengisi daftar perbaikan cepat. Dari sana Anda akan dapat menavigasi melalui mereka dengan perintah / pemetaan Vim default, seperti
:cnext
dan:cprevious
.Jika Anda ingin menambahkan awalan ke semua perintah yang diinstal oleh
fzf.vim
, dan menghindari mengesampingkan perintah yang ada, Anda dapat menambahkan ini divimrc
:Saya menggunakan
Fzf
sebagai awalan, itu sebabnya saya tidak mengetik:Ag
tetapi:FzfAg
.Jika Anda lebih suka menggunakan
git grep
alih-alihag
, sepertinya Anda dapat menginstal pembungkus khusus Anda sendiri di sekitarnya:GGrep
, seperti ini:Itu dijelaskan di
:h fzf-vim-customization
.Juga, jika
fzf
membuka panel di tmux, dan Anda akan lebih suka mengambil seluruh layar sebagai gantinya, Anda dapat menambahkan bang untuk semua perintah (:Ag!
,:GGrep!
, ...).Seperti yang Anda katakan di komentar terakhir Anda , secara default
fzf
mengubah konfigurasi shell Anda. Misalnya, jika Anda menggunakanbash
, itu akan menambahkan baris berikut di Anda~/.bashrc
:Ini akan sumber file
~/.fzf.bash
. Yang terakhir berisi beberapa kode:Kode ini menambahkan jalan ke variabel lingkungan
$PATH
:/home/user/.fzf/bin
; yang merupakan folder yang berisifzf
program.Itu juga sumber 2 file lain:
Yang pertama tampaknya mendefinisikan fungsi penyelesaian, sedangkan yang kedua menginstal binding kunci.
Sayangnya, binding kunci dapat mengesampingkan
readline
fungsi default .Misalnya,
fzf
ikat fungsifzf-file-widget
keC-t
. Kunci ini biasanya digunakan oleh readline untuk menjalankantranspose-chars
fungsi.Jika Anda tidak menginginkan ini, salah satu solusi yang mungkin adalah mengembalikan ikatan utama di dalam Anda
~/.bashrc
, setelahfzf
mengambil konfigurasi. Misalnya, jika Anda inginC-t
mempertahankan perilakunya yang lama, yaitu mentransposisi 2 karakter di sekitar kursor, dan mengikatfzf-file-widget
ke tombol lain, katakanlahC-x C-t
, Anda bisa menambahkan baris ini di akhir~/.bashrc
:Hal yang sama berlaku untuk
zsh
shell, tetapi sintaksis untuk memasang kunci mengikat sedikit berbeda:Jika salah satu dari kunci shell yang Anda gunakan sudah diganti
fzf
, Anda ingin mengembalikannya, tetapi tidak tahu apa nama sebenarnya dari fungsi yang dieksekusi, Anda bisa mencoba hal berikut.Pertama, di dalam Anda
~/.bashrc
, komentar sementara garis yang sumberfzf
konfigurasi. Kemudian, buka kembali terminal, dan lihat output daribind -P
perintah, yang bisa Anda baca di buffer Vim:Saya tidak yakin, tapi saya pikir itu harus menampilkan sebagian besar atau semua
readline
ikatan kunci. Jika Anda mencari nama fungsi readline yang terikat padaC-t
kunci, di buffer Vim, Anda akan mencari\\C-t
. Dan jika Anda mencari yang terikatM-c
(meta / alt key), Anda akan mencari\\ec
(\e
singkatan dari escape key dan sepertinyaM-c
menghasilkan kode kunci yang sama sepertiescape + c
).Anda dapat melakukan hal yang sama
zsh
dengan melihat output daribindkey
perintah. Tapi kali ini,^[
singkatan dari meta / alt modifier key, sementara karakter caret (^
) adalah singkatan dari kunci kontrol.Saat ini, saya menemukan 4 binding kunci yang menjalankan fungsi yang mengandung
fzf
kata kunci dalam namanya. Mereka menggunakan urutan kunciC-i
(sama sepertiTab
)C-r
,,C-t
danM-c
. Mereka terikat dengan fungsi-fungsi berikut:Pada sistem saya, awalnya,
readline
(perpustakaan digunakan olehbash
untuk mengedit baris perintah) mengikat kunci-kunci itu ke fungsi-fungsi ini:Dan
zle
(editor baris yang digunakan olehzsh
), mengikat mereka ke:sumber
ag
plugin / alat terpisah yang perlu diinstal?ag
juga diperlukan. Saya memperbarui jawabannya.