Bash _cd 自动完成从目录启动

Bash _cd 自动完成从目录启动

我想 cd 到 /long/path/name/ 中的某个目录。我想要一个cd2函数

  • 接受争论
  • cds 到 /long/path/name/$argument
  • 自动完成,cd2 <tab><tab>就像我运行过一样cd /long/path/name/; cd <tab><tab>

这是我遇到麻烦的第三个要求。我可以获得一个仅自动完成 /long/path/name/ 子目录的函数,但我无法继续按 Tab 键获取该子目录的子目录。

我希望自动完成,就像我输入了cd/long/path/name/ 一样。理想的情况是能够轻松适应_cd并完成这项工作,但这可能是不可能的。

我一直在使用下面的代码,但我不得不承认,我对 bash 自动完成功能还不熟悉,并不完全理解语法_cdFromDir

function cd2() {
    cd /long/path/name/$@ ;
}

_cdFromDir() {

  local cur prev opts
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"
  opts=$(ls /long/path/name/)
  COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  return 0

}

complete -F _cdFromDir cd2

答案1

在我的 ubuntu 系统上,complete -p cd显示:

complete -o nospace -F _cd cd

为了做你想做的事情,我可以定义:

cd2top='/long/path/name'
cd2(){ builtin cd "${@:-"$cd2top"}"; }
_cd2(){ [[ $PWD =~ ^"$cd2top" ]] || cd "$cd2top"; _cd; }
complete -o nospace -F _cd2 cd2

答案2

jhnc 的回答非常出色,完成了 95% 的工作。我修复了几个小问题:

  • 运行命令后,cd -没有带我回到运行命令的目录。(这是因为cd自动完成功能。)
  • 该命令未在将您带到的目录中自动完成。因此,如果它将我带到/a/并且我位于/a/b/c/并且想要转到/a/d/e/,则无法自动完成。
cd2() {
  builtin cd "${@:-"/long/path/name/"}"

  # Change directory back to original PWD if autocomplete changed it
  if [[ -e ~/cd2TempFile.txt ]]; then
    read origDir < ~/cd2TempFile.txt
    OLDPWD=$origDir
    rm ~/cd2TempFile.txt
  fi
}

_cd2(){

  if [[ ! $PWD =~ ^"/long/path/name$" ]]; then
    echo $PWD > ~/cd2TempFile.txt
    cd "/long/path/name/";
  fi

  _cd;
}

complete -F _cd2 cd2

相关内容