我想 cd 到 /long/path/name/ 中的某个目录。我想要一个cd2
函数
- 接受争论
cd
s 到 /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