それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Bashでシンボリックリンクのディレクトリの補完(上位ディレクトリが辿れない

シンボリックリンクされたディレクトリから上位が辿れない・・・

シンボリックリンクされたディレクトリがあって、その内部から、補完を試みても、ディレクトリがうまく補完されない。

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

http://stackoverflow.com/questions/26550327/bash-completion-to-make-cd-command-complete-working-directories-from-other-run

Bash completion to make 'cd' command complete working directories from other running shells? - Stack Overflow