Come cercare interattivamente / grep con VIM?


12

Esiste un modo per configurare VIM per la ricerca interattiva in ogni file per un intero progetto?

Per interattivo , intendo aggiornare ogni sequenza di tasti.

Qualcosa come Emacs counsel-git-grep , vedi: esempio demo .


Non lo uso personalmente, quindi non sono sicuro al 100% ma penso ctrl-po un plug-in simile è quello che stai cercando. Si noti che unite.vimdovrebbe anche essere in grado di farlo, ma non lo consiglierei perché a mio avviso è un plugin piuttosto pesante e che crea bug.
statox

C'è ctrl-pun modo per cercare in modo interattivo il contenuto del file? L'ho mai usato solo per cercare interattivamente i file in base ai loro nomi.
ideasman42

Penso che sia possibile ma come ho detto non lo uso, quindi forse mi sbaglio
statox

Risposte:


14

Non sono sicuro che questo è quello che stai cercando, ma forse potresti provare fzf e fzf.vim .

Se usi vim-plug come gestore dei plugin, tutto ciò che dovresti fare per installarli è aggiungere queste righe nel tuo vimrc:

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

... da qualche parte tra le linee:

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

e:

call plug#end()

Quindi eseguire :PlugInstall.


Tra i vari comandi e mappature forniti da fzf.vim(il cui unico scopo sembra essere quello di installare mappature e comandi che chiedono fzfla ricerca fuzzy attraverso fonti predefinite), c'è il comando :Ag.

Per poterlo usare, è necessario installare il comando shell ag . Sulle distribuzioni basate su debian, può essere fatto con il seguente comando:

apt-get install silversearcher-ag

Il progetto su github spiega come installarlo su MacOS:

brew install the_silver_searcher

:Agè un wrapper $ age ti permette di cercare in modo sfocato uno schema nei file della directory corrente (quello visualizzato durante la digitazione :pwd). Le partite vengono aggiornate dopo ogni pressione di un tasto.

Puoi:

  • scorrere avanti e indietro tra le partite con C-neC-p
  • seleziona la partita corrente e passa a quella successiva / precedente con Tab/S-Tab
  • seleziona o deseleziona tutte le partite con M-aoM-d

Se selezioni una o più partite, dopo aver premuto Invio, popoleranno l'elenco delle correzioni rapide. Da lì sarai in grado di navigare attraverso di essi con comandi / mappature Vim predefiniti, come :cnexte :cprevious.

inserisci qui la descrizione dell'immagine

Se vuoi aggiungere un prefisso a tutti i comandi installati fzf.vimed evitare di sovrascrivere i comandi esistenti, puoi aggiungerlo nel tuo vimrc:

let g:fzf_command_prefix = 'your_prefix'

Uso Fzfcome prefisso, ecco perché non ho digitato :Agma :FzfAg.


Se preferisci usare git grepinvece di ag, sembra che potresti installare il tuo wrapper personalizzato attorno ad esso, in :GGrepquesto modo:

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

È spiegato in :h fzf-vim-customization.

Inoltre, se fzfsi apre un riquadro in tmux, e si preferisce che serve l'intero schermo, invece, è possibile aggiungere un botto a tutti i comandi ( :Ag!, :GGrep!, ...).


Come hai detto nel tuo ultimo commento , per impostazione predefinita fzfcambia la configurazione della tua shell. Ad esempio, se lo usi bash, aggiungerà la seguente riga nel tuo ~/.bashrc:

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

Questo genererà il file ~/.fzf.bash. Quest'ultimo contiene del codice:

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

Questo codice aggiunge un percorso alla variabile ambiente $PATH: /home/user/.fzf/bin; che è la cartella che contiene il fzfprogramma.

Inoltre, genera altri 2 file:

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

Il primo sembra definire le funzioni di completamento, mentre il secondo installa le combinazioni di tasti.

Sfortunatamente, i collegamenti dei tasti possono avere la precedenza sulle readlinefunzioni predefinite .
Ad esempio, fzfassocia la funzione fzf-file-widgeta C-t. Questo tasto viene solitamente utilizzato da readline per eseguire la transpose-charsfunzione.

Se non lo desideri, una possibile soluzione sarebbe quella di ripristinare i collegamenti chiave all'interno del tuo ~/.bashrc, dopo fzfaverne verificato la configurazione. Ad esempio, se si desidera C-tmantenere il suo vecchio comportamento, ovvero trasporre i 2 caratteri attorno al cursore e associarlo fzf-file-widgeta un altro tasto, diciamo C-x C-t, è possibile aggiungere queste righe alla fine di ~/.bashrc:

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

Lo stesso vale per la zshshell, ma la sintassi per installare un'associazione chiave è leggermente diversa:

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

Se uno dei binding della chiave shell a cui eri abituato è stato ignorato fzf, vuoi ripristinarlo, ma non sai qual è il nome esatto della funzione che è stata eseguita, puoi provare la seguente cosa.

Innanzitutto, all'interno di ~/.bashrc, commenta temporaneamente la riga che genera la fzfconfigurazione. Quindi, riapri un terminale e dai un'occhiata all'output del bind -Pcomando, che puoi leggere in un buffer Vim:

bind -P | vim -R -

Non sono sicuro, ma penso che dovrebbe mostrare la maggior parte o tutte le readlinecombinazioni di tasti. Se stai cercando il nome della funzione readline associata alla C-tchiave, nel buffer di Vim, dovresti cercare \\C-t. E se stavi cercando quello associato a M-c(tasto meta / alt), avresti cercato \\ec( \esta per il tasto escape e sembra che M-cproduca gli stessi codici chiave escape + c).

Puoi fare la stessa cosa zshguardando l'output del bindkeycomando. Ma questa volta, ^[sta per il tasto modificatore meta / alt, mentre un singolo ^carattere ( ) indica il tasto di controllo.


Attualmente, ho trovato 4 associazioni di tasti che eseguono funzioni contenenti la fzfparola chiave nel loro nome. Usano le sequenze di tasti C-i(uguale a Tab) C-r, C-te M-c. Sono legati alle seguenti funzioni:

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

Sul mio sistema, in origine, readline(la libreria utilizzata bashper modificare la riga di comando) associava quei tasti a queste funzioni:

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

E zle(l'editor di linee usato da zsh), li ha legati a:

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

1
È agnecessario installare un plug-in / strumento separato?
ideasman42

@ ideasman42 Sì, mi dispiace, ho dimenticato che agera necessario anche il comando shell . Ho aggiornato la risposta.
user9433424

1
Probabilmente vale la pena notare che questi strumenti sono piuttosto invadenti, sostituendo le configurazioni bash e zsh per impostazione predefinita.
ideasman42

@ ideasman42 Hai ragione, ho aggiornato la risposta per menzionare questo problema.
user9433424,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.