标签: bash-completion

更改 bash 中内置读取的制表符补全

当“read -e”在 bash 中处于活动状态时,当前的制表符完成似乎仅匹配文件名:

read -e
[[TabTab]]
abc.txt  bcd.txt  cde.txt  
Run Code Online (Sandbox Code Playgroud)

我希望完成是由我定义的一组字符串,而文件/目录/主机名完成等应在“read -e”期间停用。

在脚本之外

complete -W 'string1 string2 string3' -E
Run Code Online (Sandbox Code Playgroud)

效果很好,但在使用“read -e”时我无法在脚本内完成这种工作。

bash readline tab-completion bash-completion

6
推荐指数
1
解决办法
1239
查看次数

如何完成 rustup/cargo 命令?

我使用官方安装脚本安装了 rustup+rust+cargo 。

如何启用 shell 补全,以便能够cargo <TAB>在终端中键入并查看可能的命令,例如cargo check

bash rust bash-completion rust-cargo rustup

6
推荐指数
1
解决办法
4031
查看次数

仅向用户显示COMPREPLY bash完成选项的子字符串

在bash完成脚本中,假设COMPREPLY=(aa/ba/ aa/bb/).调用脚本时,完成选项对用户来说是这样的:

$ foo aa/b<TAB>
aa/ba/
aa/bb/
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够更好地控制这些选项的显示方式.特别是,我想只向用户显示每个COMPREPLY选项的子字符串,类似于bash中目录完成的工作方式:

$ foo aa/b<TAB>
ba/
bb/
Run Code Online (Sandbox Code Playgroud)

有没有办法在bash中这样做?

bash bash-completion

5
推荐指数
1
解决办法
1983
查看次数

为自定义命令前置的所有命令保留Bash完成

我有一个允许在后台执行Bash进程的脚本,我将其称为"backy".我想在后台运行的程序我这样调用:

backy long-running-script param1 param2
Run Code Online (Sandbox Code Playgroud)

现在的问题是,long-running-script如果我添加另一个脚本,我将失去Bash完成.

我想编写一个Bash完成文件,它不仅保留Bash完成long-running-script及其所有参数,也保留了我想用backy调用的每个其他脚本.

我有一些Bash完成的经验,但我只是错过了我可以插入到我的Bash完成脚本中的命令,以便在完成要调用的脚本时完成.有任何想法吗?

到目前为止我完成了:

have backy &&
_backy_complete()
{
  local cur prev goals

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}

  # How to get the completion from the script that is the param for backy, 
  # in a generic way?
  COMPREPLY=( ????? )
  return 0
} &&
complete -F _backy_complete backy
Run Code Online (Sandbox Code Playgroud)

编辑 - 解决方案:

感谢Lekensteyn,我用这一行替换了现有bash完成脚本的内容:

complete -F _command backy
Run Code Online (Sandbox Code Playgroud)

bash bash-completion

5
推荐指数
1
解决办法
253
查看次数

完成命令时bash可以省略备份文件吗?

在$ PATH和all中完成命令,可执行文件时,我想省略名为#foo#和bar~的文件.我不介意放置这些备份文件,但在完成命令时不希望看到它们.我是否需要以某种方式为此编写bash-completer函数?

在我正在谈论的提示中,它完成了第一个单词;

bash# auda[TAB]
Run Code Online (Sandbox Code Playgroud)

bash executable path bash-completion

5
推荐指数
1
解决办法
154
查看次数

自定义目录完成附加空格

我有以下目录结构:

/home/tichy/xxx/yyy/aaa
/home/tichy/xxx/yyy/aab
/home/tichy/xxx/yyy/aac
Run Code Online (Sandbox Code Playgroud)

我想输入cdw y <TAB>并得到cdw yyy/<CURSOR>,所以我可以添加cdw yyy/a <TAB>并获得cdw yyy/aa <CURSOR>

我想出的解决方案给了我以下内容:
cdw y <TAB> => cdw yyy <SPACE> <CURSOR>

以下代码我到目前为止:

_cdw () {
    local cur prev dirs
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    # no difference, a bit more logical:
    dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}')
    COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    return 0
}
complete -F _cdw cdw
cdw () {
    cd /home/tichy/xxx/$@
}
Run Code Online (Sandbox Code Playgroud)

有什么想法有什么不对吗?在我看来,完成过程似乎已经完成,并没有期待任何更多的输入.

directory bash bash-completion

5
推荐指数
3
解决办法
1683
查看次数

分支自动完成功能不适用于推送的git别名

我正在使用Git和git-completion,一切正常,只有一个例外:当我这样做时

git p some_remote [TAB]

我得到自动完成建议当前目录中的文件(错误).p是一个Git别名:

$ cat ~/.gitconfig
[alias]
    p = push
Run Code Online (Sandbox Code Playgroud)

当我做的时候:

git push some_remote [TAB]
Run Code Online (Sandbox Code Playgroud)

我得到了当前存储库中的分支的建议(正确).在这两种情况下,完成some_remote工作正常.

这是什么原因?

git bash autocomplete bash-completion

5
推荐指数
1
解决办法
1612
查看次数

使用制表符完成Bash历史记录扩展

我经常使用命令历史扩展使用表单!n:m,其中n是历史命令m的编号,是参数的编号或其缩写形式.

有没有办法在现场扩展这些论点,以便我可以选项卡完成它们?

一个简单的例子:

$ mycmd long/path/with/plenty/of/subdirectories/
$ cp !$/tediously-verbose-filename.txt .
Run Code Online (Sandbox Code Playgroud)

我希望能够使用参数重复,而不必完全输入文件名(或使用ls或使用虚拟运行echo).

bash bash-completion

5
推荐指数
1
解决办法
701
查看次数

使用空格完成bash选项卡

当可能的选项可能包含空格时,我遇到了bash-completion的问题.

假设我想要一个与第一个参数相呼应的函数:

function test1() {
        echo $1
}
Run Code Online (Sandbox Code Playgroud)

我生成一个可能的完成选项列表(一些有空格,一些没有),但我无法正确处理空格.

function pink() {
    # my real-world example generates a similar string using awk and other commands
    echo "nick\ mason syd-barrett david_gilmour roger\ waters richard\ wright"
}

function _test() {
    cur=${COMP_WORDS[COMP_CWORD]}
    use=`pink`
    COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o filenames -F _test test
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到:

$ test <tab><tab>
david_gilmour  nick           roger          waters
mason          richard        syd-barrett    wright
$ test r<tab><tab>
richard  roger    waters   wright
Run Code Online (Sandbox Code Playgroud)

这显然不是我的意思.

如果我没有分配一个数组COMPREPLY,即只有$( …

bash bash-completion

5
推荐指数
2
解决办法
1931
查看次数

设置函数参数的工作目录

我的代码全部位于我的计算机/ a/b/c/d/e/myCode上的以下目录中.当我想编译project1时,我很生气地键入make/a/b/c/d/e/myCode/project1.为了解决这个问题,我在bashrc中创建了一个函数,如下所示:

function make_project { make /a/b/c/d/e/myCode/$1; }
Run Code Online (Sandbox Code Playgroud)

然后我称之为:

make_project project1
Run Code Online (Sandbox Code Playgroud)

这很好用.唯一的问题是我没有project1的自动完成功能.因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称.是否有任何方法让bash知道参数是/ a/b/c/d/e/myCode /中的目录它可以自动完成吗?

bash bash-completion

5
推荐指数
1
解决办法
82
查看次数