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.txt
esattamente come il completamento della scheda in Sublime Text.
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.txt
esattamente come il completamento della scheda in Sublime Text.
Risposte:
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 COMPREPLY
variabile. 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 DIRPATH
trova 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 BASENAME
e 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 .
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-T
imposterà il keybinding per la tua shell. La seguente GIF mostra come funziona.
fzf
.. (tput sc) e successivamente ripristinarlo con tput rc
..
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_WORD
funzione. 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à.
cat Th
+tab
?