Esiste una shell che supporta il completamento fuzzy come in Sublime Text?


14

Sto usando bash e mi chiedevo se ci fosse qualche plugin in bash o altra shell che mi permettesse di fare questo cat tfnislong.txt+ [tab]completa cat ThisFileNameIsSoLong.txtesattamente come il completamento della scheda in Sublime Text.


Perché non fare solo cat Th+ tab?
daviewales,

1
@daviewales Visualizzare tutti i 269 motivi?
Fax,

Risposte:


11

Conosco https://github.com/mgalgs/fuzzy_bash_completion che è un gruppo di funzioni shell utilizzate con complete.

Penso che probabilmente potremmo fare un po 'meglio, essere più concisi. È ora di aprire il tuo .bashrc o .profile ...

L'hook di base che utilizziamo è questo:

complete -o nospace -o filenames -F fuzzypath cd ls cat

-F opzione significa utilizzare una funzione shell per il completamento della scheda, in cui le opzioni sono impostate nella COMPREPLYvariabile. Quindi per esempio:

funzione fuzzypath () {
    se [-z $ 2] 
    poi
        COMPLETO = (`ls`)
    altro
        DIRPATH = `echo" $ 2 "| gsed 's | [^ /] * $ ||' '
        BASENAME = `echo" $ 2 "| gsed 's |. * / ||' '
        FILTER = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g'`
        COMPLETO = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
    fi
}

dove si DIRPATHtrova tutto prima dell'ultimo / sul percorso che stai digitando ed BASENAMEè dove si trova attualmente il cursore.

FILTERè qui che entra in gioco il fuzzy-ness. Fondamentalmente, prendi BASENAMEe inserisci un .*tra ogni carattere per produrre il nostro fuzz regex.

Il resto sta solo combinando la regex con ls per produrre COMPREPLY. Puoi trovare cose più intelligenti da fare qui, forse con find.

Ho anche trovato utile http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html .


6

Potresti trovare utile FZF . È un cercatore fuzzy per uso generale scritto in Ruby che può essere utilizzato con qualsiasi elenco di cose: file, processi, cronologia dei comandi, rami git, ecc.

Il suo script di installazione CTRL-Timposterà il keybinding per la tua shell. La seguente GIF mostra come funziona.


FZF è fantastico! Grazie mille per aver contribuito. Questo mi ha salvato settimane di lavoro ... Stavo iniziando a scrivere un completamento sfocato per Bash quando per fortuna ho trovato FZF. Funziona perfettamente, dovevo solo ricordare di salvare la posizione del cursore prima di chiamare fzf.. (tput sc) e successivamente ripristinarlo con tput rc..
Håkon Hægland

3

Per andare d'accordo con l'altra tua risposta, potresti voler esaminare zsh. È retrocompatibile con bash in modo da poterlo utilizzare come una sostituzione in sostituzione, ma supporta funzionalità notevolmente espanse e uno di questi è il completamento della scheda sensibile al contesto notevolmente migliorato.

Le FAQ di completamento di zsh si espandono sui casi d'uso, ma credo che per il tuo esempio, ti interesserebbe di più la COMPLETE_IN_WORDfunzione. Non è proprio il comportamento desiderato, ma è vicino. Il punto principale è che ci sono molti modi per estendere la funzionalità di base in un modo forse più accessibile rispetto all'uso di bash.

Ecco un'estensione di corrispondenza fuzzy che approssimerebbe ciò che desideri in modo più specifico; partita zsh-fuzzy

Per alcune idee potresti dare un'occhiata al famoso framework oh-my-zsh che ha una serie di funzioni per gestire zsh ed estenderlo. È più di quanto tu voglia, molto probabilmente, ma sotto i plug-in noterai gli script di completamento automatico per una varietà di ruoli. Per avere un'idea delle capacità.

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.