我想指示bash使用特殊方法对某些目录名称执行补全。例如,如果路径以“ $$”开头,bash会调用我的程序来执行完成,否则将正常执行。
这是可能吗?您将如何实施?
赏金:非常感谢您对这个问题的回答。目的是允许用户在使用特定前缀启动命令时自动跳转以完成所有命令的路径。因此,例如,当从远端目录复制文件时,您可以输入:
cp $$patern + <Tab>
和自动跳转将完成
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
而且您只需要添加要放置文件的位置即可。当然,我可以使用ott的注释将其添加到一些特定的命令中,但是如果有人有更好的主意,我将不胜感激。
您可以通过重写TAB(^ i)的默认绑定来实现。首先,您需要覆盖TAB绑定,然后需要构建一个调用命令的函数,最后,需要从该命令中获取输出并更新包含当前命令行的变量。
此函数采用当前命令行,并将最后两个字符更改为“拥抱”。
function my_awesome_tab_completion_function () {
set -- $READLINE_LINE
command="$1"
shift
argument="$*"
argument_length=$(echo -n $argument | wc -c)
if echo $argument | grep '^$$' >/dev/null 2>&1; then
new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
else
new_argument=$(compgen -d $argument)
fi
new_argument_length=$(echo -n $new_argument | wc -c)
READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
READLINE_LINE="$command $new_argument"
}
对于您的示例,您可能希望将new_argument行更改为如下所示:
new_argument=$(autojump $argument)
现在覆盖^ i绑定:
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
现在测试它是否有效:
$ cd /ro<TAB>
changes my command to:
$ cd /root
因此正常完成仍然有效,您可以通过执行cd $$ ...等来测试$$部分
如果遇到问题,请打开详细模式:
$ set -x
它将打印出该功能正在执行的所有操作。
我在Ubuntu 11上使用bash 4.2.8(1)-release(默认)对此进行了测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句