是否可以配置bash完成目录名称的方式?

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 的评论将其添加到一些特定命令中,但如果有人有更好的主意,我将不胜感激。

pol*_*ial 3

您可以通过覆盖 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 上对此进行了测试。