BashでCDPATHを使用してパスの自動補完を防止しますか?

BashでCDPATHを使用してパスの自動補完を防止しますか?

私のMacでは、bash(バージョン3.2.53(1))はコマンドライン引数にファイルオートコンプリートを使用します。ただ現在のディレクトリにあります。

作業中のLinuxシステムでは、bash(バージョン4.1.2(1))は現在のディレクトリのファイルを使用してコマンドライン引数を自動補完します。そして親ディレクトリ。

たとえば、ディレクトリツリーは次のようになります。

/home/pjl/
    bin/
    foo/
        book/

私のMacでは、次のことを行います。

$ cd foo
$ cd b<TAB>
$ cd book

バッシュオートコンプリートただ到着するbook。ただし、Linuxシステムで同じことを行うと、次のようになります。

$ cd foo
$ cd b<TAB>
bin book
$ cd b

bashには2つのオプションがあります:book現在のディレクトリからそして bin親ディレクトリから。

Bash オートコンプリートの作成方法ただ現在のディレクトリを使用しますか?

存在する両方マシンはCDPATH次のように設定しました。

.:..:../..:../../..:../../../..:../../../../..:/home/pjl/src:/home/pjl

CDPATHLinuxシステムで設定を解除すると、bashは次のように自動的に実行します。ただ現在のディレクトリ(私が望むもの); LinuxではbashがCDPATH

CDPATHしかし、どのように設定を維持できますか(so'ingはcd以前のように動作します)。いいえCDPATHオートコンプリートにbashを使用しますか?


別の許容される動作はオートコンプリートです。好意現在のディレクトリと使用法CDPATH そして、もし現在、ディレクトリに一致するものはありません。

答え1

~/.bashrc正しい方法は、上記で提案した@Gillesのように、以下を使用することです(ここではより短いバージョン)。

_my_cd () { CDPATH= _cd "$@";}

CDPATHより良いアプローチは、ローカルで一致するものがないことを確認することです。

_my_cd () { CDPATH= _cd "$@"; if [ -z "$COMPREPLY" ]; then _cd "$@"; fi;}

これにより、手間をかけずにプログラムで実行できる機能を実現できます。忘れないで

complete -F _my_cd cd

/usr/share/bash-completion/bash_completion何らかの理由で-o nospace(デフォルトのように見えますが)、次のこともできますcdnospace

complete -F _my_cd -o nospace cd

答え2

あなたは犯人ですbash_complete、あなたのbashバージョンはまったくありません。

そしてbash_completion リポジトリのヘッドバージョン, cdinclude 以下のディレクトリを自動的に完成しますCDPATH

ローカルを直接変更できますが、オートコンプリート機能を直接作成する方がbash_completion良いでしょうcd


グローバル効果が必要な場合は、/etc/bash_completion.d/cd次の内容でファイルを作成します。

_cd()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    _init_completion || return

    local IFS=$'\n' i

    compopt -o filenames

    local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)

    _filedir -d

    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]}
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/"
        fi
    fi

    return 0
}
if shopt -q cdable_vars; then
    complete -v -F _cd -o nospace cd
else
    complete -F _cd -o nospace cd
fi

このバージョンは、一部のコンテンツを除いて完全に元のバージョンからのものですCDPATH


設定にのみ使用するには、次のように.bashrc編集できます。

_my_cd () {
  declare CDPATH=
  _cd "$@" 
}

complete -F _my_cd cd

CDPATHbash_completionシステムが古すぎるか、まだロードされていないため、Mac OSXでbashコンプリートが機能しないことがあります。

BASH_COMPLETION_COMPAT_DIR変数を使用して、カスタム補完機能がロードされる場所を設定できます。bash_completionデフォルト値はです/etc/bash_completion.d

関連情報