Pel*_*ier 8 linux bash shell command-line autocomplete
我想指示 bash 使用特殊方法对某些目录名称执行补全。例如,如果路径以“$$”开头,bash 会调用我的程序执行补全,否则正常执行补全。
这是可能吗?你将如何实施它?
赏金:我真的很感激这个问题的答案。目标是当用户以特定前缀启动所有命令时,允许自动跳转完成所有命令的路径。因此,例如从远目录复制文件时,您可以键入:
cp $$patern + <Tab>
Run Code Online (Sandbox Code Playgroud)
并且自动跳转会完成
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
Run Code Online (Sandbox Code Playgroud)
你只需要添加你想要放置文件的位置。当然,我可以使用 ott 的评论将其添加到一些特定命令中,但如果有人有更好的主意,我将不胜感激。
您可以通过覆盖 TAB(^i) 的默认绑定来完成此操作。首先,您需要覆盖 TAB 绑定,然后需要构建一个调用命令的函数,最后需要获取该命令的输出并更新包含当前命令行的变量。
此函数获取当前命令行并将最后两个字符更改为“huugs”。
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"
}
Run Code Online (Sandbox Code Playgroud)
对于您的示例,您可能希望将 new_argument 行更改为如下所示:
new_argument=$(autojump $argument)
Run Code Online (Sandbox Code Playgroud)
现在覆盖 ^i 绑定:
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
Run Code Online (Sandbox Code Playgroud)
现在测试它是否有效:
$ cd /ro<TAB>
changes my command to:
$ cd /root
Run Code Online (Sandbox Code Playgroud)
所以正常完成仍然有效,您可以通过执行 cd $$... 等来测试 $$ 部分
如果遇到问题,请打开详细模式:
$ set -x
Run Code Online (Sandbox Code Playgroud)
它将打印出该函数正在执行的所有操作。
我使用 bash 4.2.8(1)-release(默认)在 Ubuntu 11 上对此进行了测试。