23t*_*tux 7 linux script bash autocomplete macos
我已经玩了一段时间的 bash 自动完成功能,但找不到解决我的问题的方法。我有一个包含如下子文件夹的项目目录:
现在,我想有一个命令,把它cdproject
在那里我可以cd
在我的项目目录及子目录内的任何子文件夹。这个命令应该提供一个自动完成功能,我可以在其中输入cdproject pr --> TAB TAB
,然后获取一个列表,例如ruby/project1
, ruby/project2
, rails/project3
...
我的问题是如何处理子目录。程序cdproject
看起来像这样
#!/bin/bash
cd $1
Run Code Online (Sandbox Code Playgroud)
在cdproject-autocompletion.bash
这个样子的
_cdproject()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(ls ~/Dropbox/projects)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -o default -o nospace -F _o o
Run Code Online (Sandbox Code Playgroud)
而我的里面.bash_profile
,我的来源cdproject-autocompletion.bash
与
source ~/cdproject-autocompletion.bash
所以任何人的想法,如何实现这一目标?也许opts
应该返回 subdir 结构,ruby/project1
但是自动完成应该只对最后一部分起作用,即实际的项目名称。我不知道这怎么可能。
深入阅读问题,您正在寻找更流畅的方法来从命令行导航文件树。
选项 1:使用 CDPATH
例如, CDPATH=".:~:~/projects/ruby:~/projects/rail:~/projects/html"
†
注意:有些人发现包含..
在CDPATH
.
不幸的是CDPATH
,并不(总是)‡支持自动完成。有一些方法可以扩展 bash 来做到这一点。谷歌使用术语“CDPATH”和“自动完成”。
诚然,这有点笨拙。如果您使用一小组父目录,这还不错。
您可能有更好的成功dirs
,pushd
和popd
。这些需要一些时间来掌握。请注意,pushd
andpopd
可以采用数字参数。
另外:
cd -
返回上一个目录。重复该命令可在两个最近的目录之间切换。
____________
†许多文档(包括手册页)将.
(点;即当前目录)显示为CDPATH
. 然而,至少一些炮弹似乎表现得好像CDPATH
有目的:.
,所以,如果你说cd foo
,你会得到./foo
,除非你列出的其他一些父目录CDPATH
包含foo
。天啊。
‡编者注:Cygwin 似乎支持CDPATH
开箱即用的自动完成功能(运行 bash 版本“4.1.17(9)-release”)。
归档时间: |
|
查看次数: |
3617 次 |
最近记录: |