当我实现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完成,使用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)