Bagaimana cara mencari / grep secara interaktif dengan VIM?


12

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 .


Saya tidak menggunakannya secara pribadi jadi saya tidak yakin 100% tapi saya pikir ctrl-patau plugin serupa adalah apa yang Anda cari. Catatan yang unite.vimseharusnya juga bisa melakukan itu tetapi saya tidak akan merekomendasikannya karena menurut saya itu adalah plugin yang cukup berat dan membuat bug.
statox

Apakah ctrl-pada cara untuk mencari konten file secara interaktif? Saya hanya pernah menggunakannya untuk mencari file berdasarkan nama mereka secara interaktif.
ideasman42

Saya pikir itu mungkin tapi seperti yang saya katakan saya tidak menggunakannya jadi mungkin saya salah
statox

Jawaban:


14

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:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

... di suatu tempat di antara garis:

call plug#begin('~/.vim/plugged')

dan:

call plug#end()

Kemudian jalankan :PlugInstall.


Di antara berbagai perintah dan pemetaan yang disediakan oleh fzf.vim(yang tujuannya hanya untuk menginstal pemetaan dan perintah yang meminta fzfpencarian 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:

apt-get install silversearcher-ag

Proyek di github menjelaskan cara menginstalnya di MacOS:

brew install the_silver_searcher

:Agadalah 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:

  • siklus maju dan mundur melalui pertandingan dengan C-ndanC-p
  • pilih pertandingan saat ini dan pindah ke yang berikutnya / sebelumnya dengan Tab/S-Tab
  • pilih atau batalkan pilihan semua pertandingan dengan M-aatauM-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 :cnextdan :cprevious.

masukkan deskripsi gambar di sini

Jika Anda ingin menambahkan awalan ke semua perintah yang diinstal oleh fzf.vim, dan menghindari mengesampingkan perintah yang ada, Anda dapat menambahkan ini di vimrc:

let g:fzf_command_prefix = 'your_prefix'

Saya menggunakan Fzfsebagai awalan, itu sebabnya saya tidak mengetik :Agtetapi :FzfAg.


Jika Anda lebih suka menggunakan git grepalih-alih ag, sepertinya Anda dapat menginstal pembungkus khusus Anda sendiri di sekitarnya :GGrep, seperti ini:

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

Itu dijelaskan di :h fzf-vim-customization.

Juga, jika fzfmembuka 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 fzfmengubah konfigurasi shell Anda. Misalnya, jika Anda menggunakan bash, itu akan menambahkan baris berikut di Anda ~/.bashrc:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

Ini akan sumber file ~/.fzf.bash. Yang terakhir berisi beberapa kode:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

Kode ini menambahkan jalan ke variabel lingkungan $PATH: /home/user/.fzf/bin; yang merupakan folder yang berisi fzfprogram.

Itu juga sumber 2 file lain:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

Yang pertama tampaknya mendefinisikan fungsi penyelesaian, sedangkan yang kedua menginstal binding kunci.

Sayangnya, binding kunci dapat mengesampingkan readlinefungsi default .
Misalnya, fzfikat fungsi fzf-file-widgetke C-t. Kunci ini biasanya digunakan oleh readline untuk menjalankan transpose-charsfungsi.

Jika Anda tidak menginginkan ini, salah satu solusi yang mungkin adalah mengembalikan ikatan utama di dalam Anda ~/.bashrc, setelah fzfmengambil konfigurasi. Misalnya, jika Anda ingin C-tmempertahankan perilakunya yang lama, yaitu mentransposisi 2 karakter di sekitar kursor, dan mengikat fzf-file-widgetke tombol lain, katakanlah C-x C-t, Anda bisa menambahkan baris ini di akhir ~/.bashrc:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

Hal yang sama berlaku untuk zshshell, tetapi sintaksis untuk memasang kunci mengikat sedikit berbeda:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

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 sumber fzfkonfigurasi. Kemudian, buka kembali terminal, dan lihat output dari bind -Pperintah, yang bisa Anda baca di buffer Vim:

bind -P | vim -R -

Saya tidak yakin, tapi saya pikir itu harus menampilkan sebagian besar atau semua readlineikatan kunci. Jika Anda mencari nama fungsi readline yang terikat pada C-tkunci, di buffer Vim, Anda akan mencari \\C-t. Dan jika Anda mencari yang terikat M-c(meta / alt key), Anda akan mencari \\ec( \esingkatan dari escape key dan sepertinya M-cmenghasilkan kode kunci yang sama seperti escape + c).

Anda dapat melakukan hal yang sama zshdengan melihat output dari bindkeyperintah. 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 fzfkata kunci dalam namanya. Mereka menggunakan urutan kunci C-i(sama seperti Tab) C-r,, C-tdan M-c. Mereka terikat dengan fungsi-fungsi berikut:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

Pada sistem saya, awalnya, readline(perpustakaan digunakan oleh bashuntuk mengedit baris perintah) mengikat kunci-kunci itu ke fungsi-fungsi ini:

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

Dan zle(editor baris yang digunakan oleh zsh), mengikat mereka ke:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word

1
Apakah agplugin / alat terpisah yang perlu diinstal?
ideasman42

@ ideasman42 Ya, maaf soal itu, saya lupa bahwa perintah shell agjuga diperlukan. Saya memperbarui jawabannya.
user9433424

1
Mungkin perlu dicatat alat ini cukup mengganggu, mengganti konfigurasi bash dan zsh Anda secara default.
ideasman42

@ ideasman42 Anda benar, saya memperbarui jawaban untuk menyebutkan masalah ini.
user9433424
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.