VIM ile etkileşimli olarak nasıl arama yapılır / grep?


12

VIM'i tüm bir proje için her dosyada etkileşimli olarak arama yapacak şekilde yapılandırmanın bir yolu var mı?

By interaktif , ben her tuş vuruşu güncellenmesi demek.

Emacs counsel-git-grep gibi bir şey , bkz: örnek demo .


Ben şahsen kullanmıyorum, bu yüzden% 100 emin değilim ama sanırım ctrl-pya da benzer bir eklenti aradığınız şey. Bunu unite.vimda yapabilmeliyim ama bunu tavsiye etmem çünkü bence oldukça ağır ve hata yaratan bir eklenti.
statox

ctrl-pDosya içeriklerini etkileşimli olarak aramanın bir yolu var mı ? Sadece isimlerini temel alarak dosyaları etkileşimli olarak aramak için kullandım.
ideasman42

Mümkün olduğunu düşünüyorum ama dediğim gibi kullanmıyorum bu yüzden belki yanılıyorum
statox

Yanıtlar:


14

Aradığınız şeyin bu olduğundan emin değilim, ama belki fzf ve fzf.vim'i deneyebilirsiniz .

Eğer kullanırsanız vim-fişi bir eklenti yöneticisi olarak, tüm bunları yüklemek için yapmanız gerekirken, Gözlerinde farklı şu satırları eklemektir vimrc:

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

... hatların arasında bir yerde:

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

ve:

call plug#end()

Sonra yürütün :PlugInstall.


Tarafından sağlanan çeşitli komutlar ve eşlemeler arasında fzf.vim(tek amacı fzfönceden tanımlanmış kaynaklar üzerinden bulanık arama isteyen komutlar ve eşlemeler yüklemek gibi görünen ), komut vardır :Ag.

Kullanabilmek için, shell komutunu ag kurmanız gerekir . Debian tabanlı dağıtımlarda, aşağıdaki komutla yapılabilir:

apt-get install silversearcher-ag

Github'daki proje MacOS'a nasıl yükleneceğini açıklıyor:

brew install the_silver_searcher

:Agetrafında bir sarıcıdır $ agve geçerli dizinin dosyalarında (yazarken görüntülenen desen) bulanık arama yapmanızı sağlar :pwd. Maçlar her tuşa basıldıktan sonra güncellenir.

Yapabilirsin:

  • ile eşleşir yoluyla kez ileri gidiş ve geri C-nveC-p
  • ile önceki / sonraki birine Geçerli eşleşmeyi hareket seçmek Tab/ 'S-Tab
  • seçmek veya tüm maçları seçimini M-aveyaM-d

Bir veya birkaç eşleşme seçerseniz, Enter tuşuna bastıktan sonra, hızlı düzeltme listesini doldururlar. Buradan :cnextve gibi varsayılan Vim komutları / eşlemeleri ile gezinebilirsiniz :cprevious.

resim açıklamasını buraya girin

Tarafından yüklenen tüm komutlara bir önek eklemek fzf.vimve mevcut komutları geçersiz kılmaktan kaçınmak istiyorsanız, bunu aşağıdakilere ekleyebilirsiniz vimrc:

let g:fzf_command_prefix = 'your_prefix'

FzfÖnek olarak kullanıyorum , bu yüzden yazmadım :Agama :FzfAg.


git grepBunun yerine kullanmayı tercih ederseniz ag, etrafına kendi özel paketleyicinizi kurabilirsiniz :GGrep, örneğin:

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

Açıklandı :h fzf-vim-customization.

Ayrıca eğer fzftmux bir bölmesini açılır ve yerine tüm ekranı alır tercih ediyorum, tüm komutlarına bir patlama ekleyebilirsiniz ( :Ag!, :GGrep!, ...).


Son yorumunuzda söylediğiniz gibi , varsayılan olarak fzfkabuğunuzun yapılandırmasını değiştirir. Örneğin, kullanırsanız bash, aşağıdaki satırı ekler ~/.bashrc:

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

Bu dosyayı kaynaklayacaktır ~/.fzf.bash. İkincisi bazı kodlar içerir:

# 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"

Bu kod ortam değişkeni yolunu ekler $PATH: /home/user/.fzf/bin; fzfprogramın bulunduğu klasördür .

Ayrıca 2 başka dosyaya kaynak sağlar:

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

Birincisi tamamlama işlevlerini tanımlarken, ikincisi anahtar bağlantıları kurar.

Maalesef, tuş bağlantıları varsayılan readlineişlevleri geçersiz kılabilir .
Örneğin fzf, işlevi fzf-file-widgetile bağlar C-t. Bu tuş genellikle readline tarafından transpose-charsişlevi yürütmek için kullanılır .

Bunu istemiyorsanız, olası bir çözüm , yapılandırmasını ~/.bashrcsağladıktan sonra fzf, içindeki anahtar bağlantıları geri yüklemek olacaktır . Örneğin, C-teski davranışını korumak istiyorsanız , yani imlecin etrafındaki 2 karakteri transpoze etmek ve fzf-file-widgetbaşka bir anahtara bağlamak , diyelim ki C-x C-t, şu satırları sonuna ekleyebilirsiniz ~/.bashrc:

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

Aynı şey zshkabuk için de geçerlidir , ancak bir anahtar bağlama yüklemek için sözdizimi biraz farklıdır:

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

Alıştığınız kabuk anahtarı bağlarından biri geçersiz kılınmışsa fzf, geri yüklemek istersiniz, ancak yürütülen işlevin tam adı nedir bilmiyorsanız, aşağıdaki şeyi deneyebilirsiniz.

İlk olarak, yapılandırmanızın ~/.bashrckaynağı olan satırı geçici olarak yorumlayın fzf. Ardından, bir terminali yeniden açın ve bind -Pbir Vim arabelleğinde okuyabileceğiniz komutun çıktısına bir göz atın :

bind -P | vim -R -

Emin değilim, ancak readlineanahtar bağlantıların çoğunu veya tamamını görüntülemesi gerektiğini düşünüyorum . C-tAnahtara bağlı readline işlevinin adını arıyorsanız , Vim arabelleğinde arama yaparsınız \\C-t. Ve bağlı olanı M-c(meta / alt tuşu) arıyorsanız, arama yaparsınız \\ec( \eescape anahtarını temsil eder ve M-caynı anahtar kodları üretir gibi görünüyor escape + c).

Aynı şeyi komutun zshçıktısına bakarak da yapabilirsiniz bindkey. Ancak bu sefer ^[meta / alt değiştirici tuşunu, tek bir caret ( ^) karakteri ise kontrol tuşunu temsil eder.


Şu anda, fzfadlarında anahtar kelimeyi içeren işlevleri yürüten 4 anahtar bağlantı buldum . Anahtar dizilerini kullanırlar C-i(ile aynı Tab) C-r, C-tve M-c. Aşağıdaki işlevlere bağlıdırlar:

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

Sistemimde, başlangıçta, readline( bashkomut satırını düzenlemek için kullanılan kütüphane ) bu tuşları şu işlevlere bağladı:

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

Ve zle(tarafından kullanılan çizgi editörü zsh), bunları aşağıdakilere bağlar:

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

1
Yüklenmesi aggereken ayrı bir eklenti / araç mı?
ideasman42

@ ideasman42 Evet, bunun için üzgünüm, kabuk komutunun agda gerekli olduğunu unuttum . Cevabı güncelledim.
user9433424

1
Muhtemelen bu araçların oldukça müdahaleci olduğunu, varsayılan olarak bash ve zsh yapılandırmalarınızı değiştirdiğini belirtmek gerekir.
ideasman42

@ ideasman42 Haklısın, bu sorunu belirtmek için cevabı güncelledim.
user9433424
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.