回答:
私は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] その後 COMPREPLY =( `ls`) そうしないと 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も役に立ちました。
fzfが便利な場合があります。Rubyで記述された汎用のファジーファインダーであり、ファイル、プロセス、コマンド履歴、gitブランチなどのあらゆるリストで使用できます。
そのインストールスクリプトはCTRL-T
、シェルのキーバインドを設定します。次のGIFは、それがどのように機能するかを示しています。
fzf
...(SC TPUT)以降でそれを復元tput rc
...
他の答えに沿って進むには、zshを調べてください。bashとの下位互換性があるため、置き換えのドロップとして使用できますが、大幅に拡張された機能をサポートしており、その1つはコンテキスト対応タブ補完が大幅に強化されています。
zsh Completion FAQはユースケースを拡張しますが、あなたの例では、COMPLETE_IN_WORD
関数に最も関心があると思います。これは望ましい動作ではありませんが、近いです。主なポイントは、bashを使用するよりもおそらくより親しみやすい方法で基本機能を拡張する方法がたくさんあるということです。
以下は、より具体的に必要なものに近似するあいまい一致拡張です。 zshファジーマッチ
いくつかのアイデアについては、zshを管理および拡張するための多数の機能を備えた人気のあるoh-my-zshフレームワークをご覧ください。それはあなたが望む以上のものである可能性が高いですが、プラグインの下では、さまざまな役割のオートコンプリートスクリプトに注目します。機能のアイデアを得るため。
cat Th
+をしないのtab
ですか?