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.