シンボリックリンクされたディレクトリから上位が辿れない・・・
シンボリックリンクされたディレクトリがあって、その内部から、補完を試みても、ディレクトリがうまく補完されない。
takuya@vim$ ll -d /usr/local/opt/vim lrwxr-xr-x 1 takuya admin 26 2017-04-24 14:32 /usr/local/opt/vim -> ../Cellar/vim/HEAD-b7637c4 takuya@vim$ cd /usr/local/opt/vim takuya@vim$ cd ../<TAB>#押しても反応なし
解決策(一時的)
complete -r cd
cd の補完で、ディレクトリに限定するのが complete cd
なのです。シンボリックリンクはファイルなので補完されない。。
ディレクトリではなく、全ファイル(+ディレクトリ)を補完対象にすると一時的にはうまくいく。
ただし、これはcd の補完をオフにしているだけなので完璧とはいえない。
complete -r cd # 補完オフ complete -d cd # ディレクトリ名で補完
解決策( bash-completion )
bash-completion で cd の補完を独自に定義するとまぁ、なんとかなる。
流石にコレを全部書くのはちょっと・・・なので、最初から用意されている _cd
を少しカスタマイズする
type _cd # この結果をカスタマイズする complete -F _cd cd
具体的にはこうする
function_cd_with_symlinks(){ local cur opts; cur="${COMP_WORDS[COMP_CWORD]}"; _cd; ## 既存の _cd を呼び出しておいて opts="${COMPREPLY[@]} path/to/c"; ## 追加する COMPREPLY=($(compgen -W "${opts}" -- ${cur})); }
解決策(諦める)
シンボリックリンクの解釈を諦める。
set -P
これで、cd を含めすべてのPATHの取扱が、シンボリックリンクにきたら物理的なアドレスに変えてくれる。
これと言った解決策がない
cd
が解決したとしても ls
find
などのコマンドはやっぱりシンボリックリンクではなくreadlink後の物理パスに対して作用するので、どうしようもない感じで詰んだ。
参考資料
https://askubuntu.com/questions/155696/how-to-tab-complete-directories-when-in-symlinked-directory