Last weekend while on the road home, I worked on adding fuzzy matching to Complete::Util‘s
complete_array_elem(). This enables fuzzy matching (typo correction) in many tab completion routines and utilities that uses the
Complete::* modules family. For example, in cpanm (install and activate App::ShellCompleter::cpanm first):
% cpanm --miror[Tab] % cpanm --mirror_ % cpanm Compess[Tab] % cpanm Compress_
Or mpv (install and activate App::ShellCompleter::mpv first):
% mpv --video-zom[Tab] % mpv --video-zoom _ % mpv json[Tab] % mpv Jason\ Chen\ _ % mpv Jason\ Chen\ -\ ihate[Tab] % mpv Jason\ Chen\ -\ I\ Hate\ Sorry\ Lyrics\ on\ Screen-D95JzZ7ID4U.mp4 _
% lcpan modole[Tab] % lcpan modules _ % pause listmods[Tab] % pause list-mods _ % pause sl[Tab] ; # hoping to be autocorrected to 'ls' % pause cleanup _
Whoops, okay, so the fuzzy matching still needs some tuning up to do. But generally it works pretty well in my experience so far.
If you don’t have Text::Levenshtein::XS (it’s a recommends/optional prereq), fuzzy matching is rather slow. This starts to becomes noticeable when you have thousands of entries to match. For example when using progless from App-ProgUtils:
% progless pogles[Tab] % progless progless _
That took almost 1s for
complete_array_elem() to fuzzy match out of almost 5000 items (all programs in my PATH). However, note that fuzzy matching is only used when exact matching fails to produce a match. So if you do:
% progless prog[Tab][Tab] progcat progedit progless progman progpath % progless progle[Tab] % progless progless _
Those completion all complete quickly because no fuzzy matching is done. And course, you can just install Text::Levenshtein::XS to speed things up.