
ファイル名とは異なる拡張子があるとしましょう。
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
(ile
inはfile
シェルによって挿入されます)
詳細については、マニュアルの「プログラミング可能な完成」セクションをお読みくださいbash
。
答え2
tex
コマンドのカスタム補完仕様をに追加します.bashrc
。ファイル名の補完を使用する必要があることを指定したら、tex
フィルタを追加して引数を削除できます。いいえ*.tex
可能な完了と一致します。
complete -f -X '!*.tex'
ディレクトリにtest.tex
、test.aux
およびtest.pdf
プレフィックスがtest
ある場合ただまで完了これはショートカットの生成をtest.tex
スキップするのではなく、必要なファイルのフルネームを完成させます。.