prpsls
私はディレクトリにファイルを作成または編集するスクリプトを作成しました~/proposals
。
これで自動補完スクリプトを作成しており、クリックして次のように設定しようとしています。商標、現在の作業ディレクトリに関係なく、complete
ディレクトリ内のファイルとディレクトリを一覧表示する組み込み機能です。~/proposals
私が達成したい動作は私が行ったのとまったく同じですcomplete -f prpsls
が、現在のディレクトリのファイルとディレクトリを一覧表示するのではなく、常にディレクトリの内容を完了したいと思います~/proposals
。
たとえば、私が書くls
とき商標、次を示します。
$ pwd
/home/user/base_directory
$ ls
file_01 file_02 subdir_01/
私がsubd
書いた商標、次のように自動的に完了しますsubdir_01
。商標繰り返しますが、これが示すものですdir_01
:
$ ls subdir_01/
file_03 subdir_02/
私が探している行動は次のとおりです。
$ pwd
/home/user/any/directory/it/should/not/matter
$ prpsls # Tab here
proposal_01 proposal_02 job_01/
$ prpsls job_01/ # Tab again
proposal_03 proposal_draft
complete
私の質問は:組み込み機能でこの動作は可能ですか?そうでなければ、どのようにこの動作を達成できますか?
complete
デフォルトディレクトリとして使用するディレクトリをフラグで知ることができたらと思いますが、ディレクトリリストを生成する-d
whichと同じディレクトリ関連フラグのみが表示されます-A directory
。
興味深いことに、私がcompgen -f "~/proposals/"
使うならする次の場所のファイルとディレクトリのリスト~/proposals
:
$ pwd
/home/user/any/directory/it/should/not/matter
$ compgen -f "~/proposals/"
~/proposals/job_01
~/proposals/proposal_01
~/proposals/proposal_02
私は見たこれしかし、質問は次のとおりです。
- 許可された回答は、入れ子になったディレクトリでは機能しません。 (つまり商標ディレクトリの内容を表示します。)
- 答えは
CDPATH
他のコマンドにもっと混乱をもたらすでしょう。 - 答えは
compgen
ネストされたディレクトリでも機能しません。
ベストアンサー1
に基づいてこの素晴らしい答えfoo
ファイルとディレクトリを再帰的に完成するコマンドに対して、次の完成を作成しました~/foodir
。
FOO_DIR=$HOME/foodir/
_foo_compgen_filenames() {
local cur="$1"
# Files, excluding directories:
grep -v -F -f <(compgen -d -P ^ -S '$' -- $FOO_DIR"$cur") \
<(compgen -f -P ^ -S '$' -- $FOO_DIR"$cur") |
sed -e 's|^\^'$FOO_DIR'||' -e 's/\$$/ /'
# Directories:
compgen -d -S / -- $FOO_DIR"$cur" | sed -e 's|'$FOO_DIR'||'
}
_foo_complete() {
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(_foo_compgen_filenames "$cur") )
}
complete -o nospace -F _foo_complete foo
秘密は、compgen
完成エンジンが完成からファイルへのフルパスを完了するようにしてFOO_DIR
から、FOO_DIR
完成からそのパスを送信する前に削除することですcomplete
。また、ディレクトリ名の末尾にスラッシュを追加する問題もあります。これは指定されておらず、compgen
ファイルのみを返す基本的な方法はありません(ただし、ディレクトリのみを返す方法は実際にはあります)。