相关疑难解决方法(0)

如何在不影响其他完成脚本的情况下重置COMP_WORDBREAKS?

当我实现bash自动完成功能时,有些东西让我感到困惑,我将它放在/etc/bash_completion.d/中

为了实现某些功能,我想:从变量中删除单词break字符冒号()$COMP_WORDBREAKS/在开头添加斜杠()$COMP_WORDBREAKS.

COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    compopt -o nospace

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool
Run Code Online (Sandbox Code Playgroud)

但是,我无法COMP_WORDBREAKS直接重置,因为该值与其他完成脚本共享.调用完成函数时,COMP_WORDS已经填充了变量数组,因此本地更改COMP_WORDBREAKS不起作用.

是否有任何解决方案可以更改COMP_WORDBREAKS一个完成脚本而对其他脚本没有影响?

$ echo $BASH_VERSION
4.2.10(1)-release
Run Code Online (Sandbox Code Playgroud)

bash shell autocomplete bash-completion

22
推荐指数
1
解决办法
3997
查看次数

Bash命令行选项卡完成冒号字符

当参数不包含特殊字符时,我已经成功地为我的自定义命令实现了bash完成,使用compgen机制:

    current=${COMP_WORDS[COMP_CWORD]}
    all=$(_get_all_items)
    COMPREPLY=( $(compgen -W "$all" -- $current) )
    ...
    complete -F _prog_compl prog
Run Code Online (Sandbox Code Playgroud)

我用同样的方式来完成它带一个冒号启动项目::first,:second...,但是它不能告诉我/自动完成它们.我尝试用反斜杠逃避冒号,这也没用.我该怎样逃避冒号完成?

该项目开始于结肠,让我们说::first,:second.如果我写了progname并以这样的冒号开头:

$ progname :<Tab here after colon>
Run Code Online (Sandbox Code Playgroud)

我看到没有完成但是两个冒号("::") - 其中一个自动添加到我输入的行.如果我将冒号转换为普通字符(让我们说'b'),我会完全按照我的要求完成:bfirst,bsecond...

需要注意的是,当我按Tab键时,它会在我之前插入的冒号旁边放置另一个":",它变为"::".

$ bash --version
GNU bash, version 4.1.10(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is …
Run Code Online (Sandbox Code Playgroud)

bash shell command-line

8
推荐指数
1
解决办法
1714
查看次数