web-dev-qa-db-ja.com

Sublime Textのようにファジー補完をサポートするシェルはありますか?

私はbashを使用していますが、SublimeTextのタブ補完と同じようにcat tfnislong.txt + [tab]cat ThisFileNameIsSoLong.txtに完了するプラグインがbashまたは他のシェルにあるかどうか疑問に思いました。 。

14
woodings

私は知っています https://github.com/mgalgs/fuzzy_bash_completion これはcompleteで使用されるシェル関数の束です。

でも、もっと簡潔に、もう少しうまくやれると思います。 .bashrcまたは.profileをバストオープンする時間...

私たちが使用する基本的なフックはこれです:

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

-Fオプションは、タブ補完にシェル関数を使用することを意味します。オプションはCOMPREPLY変数で設定されます。したがって、たとえば:

 function fuzzypath(){
 if [-z $ 2] 
 then 
 COMPREPLY =( `ls`)
 else 
 DIRPATH =ʻecho "$ 2" | gsed's | [^ /] * $ || '`
 BASENAME =ʻecho" $ 2 "| gsed's |。*/|| '`
 FILTER =ʻecho" $ BASENAME "| gsed's |。|\0. * | g'` 
 COMPREPLY =( `ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
 fi 
} 

ここで、DIRPATHは入力しているパスの最後の/の前のすべてであり、BASENAMEはカーソルが現在ある場所です。

FILTERは、あいまいさの出番です。基本的に、BASENAMEを取り、すべての文字の間に.*を挿入して、ファジー正規表現を生成します。

残りは、正規表現とlsを組み合わせてCOMPREPLYを生成するだけです。おそらくfindを使用して、ここでもっと賢いことを見つけることができます。

また、 http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html が役立つこともわかりました。

11
mwm

fzf が便利な場合があります。これは、Rubyで記述された汎用ファジーファインダーであり、ファイル、プロセス、コマンド履歴、gitブランチなどの任意のリストで使用できます。

そのインストールスクリプトは、シェルのCTRL-Tキーバインドをセットアップします。次のGIFは、その動作を示しています。

6
Junegunn Choi

他の答えと一緒に行くために、zshを調べたいと思うかもしれません。 bashとの下位互換性があるため、代わりにドロップとして使用できますが、大幅に拡張された機能をサポートし、そのうちの1つはコンテキスト認識タブ補完が大幅に強化されています。

zsh Completion FAQ ユースケースを拡張しますが、あなたの例によれば、COMPLETE_IN_Wordfunctionに最も興味があると思います。これは完全に望ましい動作ではありませんが、近いです。重要な点は、bashを使用するよりもおそらくもっと親しみやすい方法で基本機能を拡張する方法がたくさんあるということです。

これは、より具体的に必要なものを近似するあいまい一致拡張です。 zsh-あいまい一致

いくつかのアイデアについては、zshを管理および拡張するための多くの機能を備えた人気のある oh-my-zsh フレームワークをご覧ください。おそらくあなたが望む以上のものですが、プラグインの下に、さまざまな役割のオートコンプリートスクリプトがあります。機能のアイデアを得る。

3
krondor