bashのオートコンプリートの末尾のポイントを防ぐ方法は?

bashのオートコンプリートの末尾のポイントを防ぐ方法は?

ファイル名とは異なる拡張子があるとしましょう。

test.tex
test.pdf

拡張子なしでファイル名のみを入力し、ファイル名全体を入力する方が簡単です。これは、そのプログラムが必要な拡張を知って自動的に追加するためです。次の例は完全に機能します。

tex test
pdf-viewer test

しかし、ここでbashコンプリートを使用すると、後ろにドットが追加され、常に私を迷惑させます。たとえば、

tex te<TAB>

~になる

tex test.

ただし、エラーが発生してアプリが機能しません。クリックするたびにバックスペースを押す必要があります<TAB>。 :-(

オートコンプリート中に末尾のポイントを追加しないようにbashにどのように指示しますか?

ベストアンサー1

もっと簡単な方法があるかもしれませんが、次のように動作するようです。

texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }

complete -F texfiles tex

まず、という名前のシェル関数を設定しますtexfiles。 2番目のコマンドライン引数(ユーザーがその単語に対してCompleteを押す前にコマンドラインに入力した単語)を使用し、一致するすべての名前$2で配列を入力します。TabCOMPREPLY"$2"*.tex

各名前に対して、.texサフィックスは配列に追加される前に削除されます。

次に、このコマンドを使用して、completeコマンドtexfilesのファイル名補完機能を実行するようにシェルに指示します。tex具体的に。同じ方法でファイルを完成させる必要があるcompleteすべてのコマンドに対して.tex同じコマンドを繰り返すことができます。pdf-viewerその関数を作成したいかもしれないからですpdffiles(これらの関数の名前は任意です)。

実際の姿は次のとおりです(キー<tab>を押したという意味Tab)。

bash-4.4$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Sep 28 21:43 README.txt
-rw-r--r--  1 kk  wheel  0 Sep 28 21:12 file.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:24 file2.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:25 hello.tex

bash-4.4$ tex <tab><tab>
file   file2  hello
bash-4.4$ tex

bash-4.4$ tex f<tab>ile<tab><tab>
file   file2
bash-4.4$ tex file

ileinはfileシェルによって挿入されます)

詳細については、マニュアルの「プログラミング可能な完成」セクションをお読みくださいbash

おすすめ記事