Bashオートコンプリート:他のディレクトリのファイルとディレクトリの一覧表示

Bashオートコンプリート:他のディレクトリのファイルとディレクトリの一覧表示

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デフォルトディレクトリとして使用するディレクトリをフラグで知ることができたらと思いますが、ディレクトリリストを生成する-dwhichと同じディレクトリ関連フラグのみが表示されます-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ファイルのみを返す基本的な方法はありません(ただし、ディレクトリのみを返す方法は実際にはあります)。

おすすめ記事