Jak interaktywnie wyszukiwać / grep za pomocą VIM?


12

Czy istnieje sposób skonfigurowania VIM do interaktywnego wyszukiwania w każdym pliku dla całego projektu?

Przez interaktywne rozumiem aktualizację każdego naciśnięcia klawisza.

Coś jak Emacs counsel-git-grep , patrz: przykładowe demo .


Nie używam go osobiście, więc nie jestem w 100% pewien, ale myślę, że ctrl-plub podobna wtyczka jest tym, czego szukasz. Pamiętaj, że unite.vimpowinienem to zrobić, ale nie poleciłbym tego, ponieważ moim zdaniem jest to dość ciężka i powodująca błędy wtyczka.
— statox

Czy ctrl-pistnieje sposób interaktywnego przeszukiwania zawartości pliku? Użyłem go tylko do interaktywnego wyszukiwania plików na podstawie ich nazw.
— ideasman42,

Myślę, że jest to możliwe, ale jak powiedziałem, nie używam go, więc może się mylę
— statox

Odpowiedzi:


14

Nie jestem pewien, czy tego właśnie szukasz, ale może możesz spróbować fzf i fzf.vim .

Jeśli używasz vim-plug jako menedżera wtyczek, wszystko, co musisz zrobić, aby je zainstalować, to dodać następujące wiersze w vimrc:

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

... gdzieś między wierszami:

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

i:

call plug#end()

Następnie wykonaj :PlugInstall.


Wśród różnych poleceń i mapowań dostarczonych przez fzf.vim(których jedynym celem wydaje się być instalowanie mapowań i poleceń proszących fzfo wyszukiwanie rozmyte przez predefiniowane źródła), jest polecenie :Ag.

Aby móc z niego korzystać, musisz zainstalować komendę shell ag . W przypadku dystrybucji opartych na Debianie można to zrobić za pomocą następującego polecenia:

apt-get install silversearcher-ag

Projekt na github wyjaśnia, jak zainstalować go na MacOS:

brew install the_silver_searcher

:Agjest opakowaniem $ agi pozwala na rozmyte wyszukiwanie wzorca w plikach bieżącego katalogu (wyświetlanego podczas pisania :pwd). Dopasowania są aktualizowane po każdym naciśnięciu klawisza.

Możesz:

  • przewijać mecze do przodu i do tyłu za pomocą C-niC-p
  • wybierz bieżący mecz i przejdź do następnego / poprzedniego za pomocą Tab/S-Tab
  • zaznacz lub odznacz wszystkie dopasowania za pomocą M-alubM-d

Jeśli wybierzesz jedno lub kilka dopasowań, po naciśnięciu Enter, zostaną one wypełnione na liście szybkich poprawek. Stamtąd będziesz mógł nawigować po nich za pomocą domyślnych poleceń / mapowań Vima, takich jak :cnexti :cprevious.

wprowadź opis zdjęcia tutaj

Jeśli chcesz dodać prefiks do wszystkich poleceń zainstalowanych przez fzf.vimi uniknąć zastępowania istniejących poleceń, możesz dodać to w vimrc:

let g:fzf_command_prefix = 'your_prefix'

Używam Fzfjako prefiksu, dlatego nie napisałem, :Agale :FzfAg.


Jeśli wolisz używać git grepzamiast ag, wygląda na to, że możesz zainstalować wokół niego własne niestandardowe opakowanie :GGrep, w następujący sposób:

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

Wyjaśniono to w :h fzf-vim-customization.

Ponadto, jeśli fzfotworzy się okienko w tmux i wolisz zajmuje cały ekran zamiast tego można dołączyć huk do wszystkich poleceń ( :Ag!, :GGrep!...).


Jak powiedziałeś w swoim ostatnim komentarzu , domyślnie fzfzmienia konfigurację twojej powłoki. Na przykład, jeśli użyjesz bash, doda następujący wiersz do ~/.bashrc:

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

Spowoduje to źródło pliku ~/.fzf.bash. Ten ostatni zawiera trochę kodu:

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

Ten kod dołącza ścieżkę do zmiennej środowiskowej $PATH: /home/user/.fzf/bin; który jest folderem zawierającym fzfprogram.

Pozyskuje również 2 inne pliki:

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

Pierwszy wydaje się definiować funkcje uzupełniania, a drugi instaluje powiązania klawiszy.

Niestety, powiązania klawiszy mogą zastąpić domyślne readlinefunkcje.
Na przykład fzfwiąże funkcję fzf-file-widgetz C-t. Ten klucz jest zwykle używany przez readline do wykonania transpose-charsfunkcji.

Jeśli nie chcesz tego, jednym z możliwych rozwiązań byłoby przywrócenie kluczowych powiązań wewnątrz twojego ~/.bashrc, po fzftym jak pozyskasz jego konfigurację. Na przykład, jeśli chcesz C-tzachować swoje stare zachowanie, czyli transponowanie 2 znaków wokół kursora i powiązanie fzf-file-widgetz innym klawiszem, powiedzmy C-x C-t, możesz dodać te linie na końcu ~/.bashrc:

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

To samo dotyczy zshpowłoki, ale składnia instalacji powiązania klawiszy jest nieco inna:

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

Jeśli jedno z powiązań klucza powłoki, do którego byłeś przyzwyczajony, zostało zastąpione fzf, chcesz je przywrócić, ale nie wiesz, jaka jest dokładna nazwa funkcji, która została wykonana, możesz wypróbować następującą rzecz.

Po pierwsze, ~/.bashrctymczasowo skomentuj wiersz, z którego pochodzi fzfkonfiguracja. Następnie ponownie otwórz terminal i spójrz na dane wyjściowe bind -Ppolecenia, które możesz odczytać w buforze Vima:

bind -P | vim -R -

Nie jestem pewien, ale myślę, że powinien wyświetlać większość lub wszystkie readlinepowiązania klawiszy. Jeśli szukasz nazwy funkcji readline związanej z C-tkluczem, w buforze Vima możesz wyszukać \\C-t. A jeśli szukałeś tego, do którego jest przypisany M-c(klawisz meta / alt), szukałbyś \\ec( \eoznacza klawisz Escape i wydaje się, że M-ctworzy te same kody, co escape + c).

Możesz zrobić to samo, zshpatrząc na wynik bindkeypolecenia. Ale tym razem ^[oznacza klawisz modyfikujący meta / alt, a pojedynczy znak karetki ( ^) oznacza klawisz kontrolny.


Obecnie znalazłem 4 powiązania klawiszy wykonujące funkcje zawierające fzfsłowo kluczowe w ich nazwie. Używają sekwencji klawiszy C-i(takich samych jak Tab) C-r, C-ti M-c. Są one powiązane z następującymi funkcjami:

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

W moim systemie pierwotnie readline(biblioteka używana bashdo edycji wiersza poleceń) powiązała te klucze z następującymi funkcjami:

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

I zle(używany przez edytor linii zsh), powiązał je z:

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

1
Czy należy agzainstalować osobną wtyczkę / narzędzie?
— ideasman42

@ ideasman42 Tak, przepraszam za to, zapomniałem, że polecenie powłoki agbyło również konieczne. Zaktualizowałem odpowiedź.
— user9433424,

1
Prawdopodobnie warto zauważyć, że te narzędzia są dość nachalne, domyślnie zastępując konfiguracje bash i zsh.
— ideasman42

@ ideasman42 Masz rację, zaktualizowałem odpowiedź, aby wspomnieć o tym problemie.
— user9433424,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.