Bashの基本機能は、現在の作業ディレクトリに関係なく、さまざまなbinディレクトリに格納されているコマンドを完了することです。これにより、ユーザーは実行するディレクトリのフルパスを指定しなくても、コマンドとバイナリを体系的に維持できます。
Bashは私の前にこのコマンドの完成をどのように提供しましたか?走る私の意見では、デザインの観点から、これらのbinファイルは、私が実行する前に同じコマンドが完了することを期待するのが合理的だと思います。編集するそれらを。
私の特別なケースでは、これは私のエディタの完成機能を変更し、vi
現在の作業ディレクトリのファイル名だけでなく、私のファイル名も含めることを意味します~/bin/
(実際には、他のコンテナのファイルを追加することには気にしません。コマンド)。
簡単な修正これだから答えはこうです。
$ source _vi
$ complete -f -F _vi vi
ここで、_viは次のように定義されます。
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local pat="~/bin/*"
COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
しかし、viはファイルを開くためにフルパスを渡す必要があります!
だから私の質問は:私はどうすればいいですか?タブ完了ファイル名は次から来ましたが、~/bin/
まだ渡すフルパスvi
?これはただの|
夢ですか?まったく異なるアプローチを試すべきですか?
~/bin/*
私が使うときはvi (TAB)(TAB)
!
編集する:
@roaimaの回答と以下の提案に基づいて私が使用する機能は次のとおりです。興味のある2つのディレクトリ(バイナリファイルと設定ファイル)以外のディレクトリにあるファイルに、ディレクトリに依存しない完成したアクセスを簡単に追加できます。
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local bin_dir="~/bin/"
local dot_dir="~/dotfiles/"
COMPREPLY=($(compgen -f -G "$bin_dir*" -- "$bin_dir${word}"));
COMPREPLY+=($(compgen -f -G "$dot_dir*" -- "$dot_dir${word}"));
return 0;
}
答え1
最も簡単な方法は、次に$item
パスを追加するときにパスを削除しないことです$COMPREPLY[$i]
。
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local pat="~/bin/*"
COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));
return 0;
}
可能なリストはパスコンポーネントなしで表示されますが、正常に完了するとパスが挿入されます。
代替案は、現在のディレクトリからファイル名を見つけるシェルスクリプトを使用して独自に拡張することです。ファイル名がvi
ない場合。検索/。~/bin/
$CDPATH
~/bin