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 fzf
la 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 $ ag
e 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-n
eC-p
- seleziona la partita corrente e passa a quella successiva / precedente con
Tab
/S-Tab
- seleziona o deseleziona tutte le partite con
M-a
oM-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 :cnext
e :cprevious
.
Se vuoi aggiungere un prefisso a tutti i comandi installati fzf.vim
ed evitare di sovrascrivere i comandi esistenti, puoi aggiungerlo nel tuo vimrc
:
let g:fzf_command_prefix = 'your_prefix'
Uso Fzf
come prefisso, ecco perché non ho digitato :Ag
ma :FzfAg
.
Se preferisci usare git grep
invece di ag
, sembra che potresti installare il tuo wrapper personalizzato attorno ad esso, in :GGrep
questo 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 fzf
si 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 fzf
cambia 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 fzf
programma.
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 readline
funzioni predefinite .
Ad esempio, fzf
associa la funzione fzf-file-widget
a C-t
. Questo tasto viene solitamente utilizzato da readline per eseguire la transpose-chars
funzione.
Se non lo desideri, una possibile soluzione sarebbe quella di ripristinare i collegamenti chiave all'interno del tuo ~/.bashrc
, dopo fzf
averne verificato la configurazione. Ad esempio, se si desidera C-t
mantenere il suo vecchio comportamento, ovvero trasporre i 2 caratteri attorno al cursore e associarlo fzf-file-widget
a 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 zsh
shell, 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 fzf
configurazione. Quindi, riapri un terminale e dai un'occhiata all'output del bind -P
comando, 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 readline
combinazioni di tasti. Se stai cercando il nome della funzione readline associata alla C-t
chiave, nel buffer di Vim, dovresti cercare \\C-t
. E se stavi cercando quello associato a M-c
(tasto meta / alt), avresti cercato \\ec
( \e
sta per il tasto escape e sembra che M-c
produca gli stessi codici chiave escape + c
).
Puoi fare la stessa cosa zsh
guardando l'output del bindkey
comando. 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 fzf
parola chiave nel loro nome. Usano le sequenze di tasti C-i
(uguale a Tab
) C-r
, C-t
e 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 bash
per 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
ctrl-p
o un plug-in simile è quello che stai cercando. Si noti cheunite.vim
dovrebbe anche essere in grado di farlo, ma non lo consiglierei perché a mio avviso è un plugin piuttosto pesante e che crea bug.