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 fzf
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:
apt-get install silversearcher-ag
Proyek di github menjelaskan cara menginstalnya di MacOS:
brew install the_silver_searcher
: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:
- siklus maju dan mundur melalui pertandingan dengan
C-n
danC-p
- pilih pertandingan saat ini dan pindah ke yang berikutnya / sebelumnya dengan
Tab
/S-Tab
- pilih atau batalkan pilihan semua pertandingan dengan
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 di vimrc
:
let g:fzf_command_prefix = 'your_prefix'
Saya menggunakan Fzf
sebagai awalan, itu sebabnya saya tidak mengetik :Ag
tetapi :FzfAg
.
Jika Anda lebih suka menggunakan git grep
alih-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 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 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 fzf
program.
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 readline
fungsi default .
Misalnya, fzf
ikat fungsi fzf-file-widget
ke C-t
. Kunci ini biasanya digunakan oleh readline untuk menjalankan transpose-chars
fungsi.
Jika Anda tidak menginginkan ini, salah satu solusi yang mungkin adalah mengembalikan ikatan utama di dalam Anda ~/.bashrc
, setelah fzf
mengambil konfigurasi. Misalnya, jika Anda ingin C-t
mempertahankan perilakunya yang lama, yaitu mentransposisi 2 karakter di sekitar kursor, dan mengikat fzf-file-widget
ke 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 zsh
shell, 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 fzf
konfigurasi. Kemudian, buka kembali terminal, dan lihat output dari bind -P
perintah, yang bisa Anda baca di buffer Vim:
bind -P | vim -R -
Saya tidak yakin, tapi saya pikir itu harus menampilkan sebagian besar atau semua readline
ikatan kunci. Jika Anda mencari nama fungsi readline yang terikat pada C-t
kunci, di buffer Vim, Anda akan mencari \\C-t
. Dan jika Anda mencari yang terikat M-c
(meta / alt key), Anda akan mencari \\ec
( \e
singkatan dari escape key dan sepertinya M-c
menghasilkan kode kunci yang sama seperti escape + c
).
Anda dapat melakukan hal yang sama zsh
dengan melihat output dari bindkey
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 kunci C-i
(sama seperti Tab
) C-r
,, C-t
dan 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 bash
untuk 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
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.