【问题标题】:Conditional trailing space with bash programmable completion带有 bash 可编程完成的条件尾随空格
【发布时间】:2012-04-25 03:55:18
【问题描述】:

我正在创建一个函数来为我使用的命令提供可编程完成(在http://www.debian-administration.org/articles/317 的帮助下)。 shell脚本用法如下:

script.sh command [command options]

其中命令可以是“foo”或“bar”,“foo”的命令选项是“a_foo=value”和“b_foo=value”,“bar”的命令选项是“a_bar=value”和“b_bar” =价值'。

这是我正在使用的配置:

_script() {
  local cur command all_commands                                                                    
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  command="${COMP_WORDS[1]}"
  all_commands="foo bar"
  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
    *) ;;
  esac
  COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
  return 0
}

complete -F _script script.sh

这主要是我想要的:

% script.sh f[TAB]

完成到:

% script.sh foo 

(根据需要使用尾随空格)

但是,这个:

% script.sh foo a[TAB]

完成到:

% script.sh foo a_foo 

(也有尾随空格)

我想用“=”替换尾随空格。或者,我愿意将传递给 compgen 的值更改为“--a_foo= --b_foo=",在这种情况下,我可以删除尾随空格。

很遗憾,该命令不在我的控制之下,因此我无法将命令行选项的格式更改为“--a_foo value”而不是“--a_foo=value”。

【问题讨论】:

    标签: bash bash-completion


    【解决方案1】:

    首先您需要在 COMPREPLY 中添加 =:

    COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) )
    

    接下来你需要告诉completion不要在=之后添加空格

    compopt -o nospace
    

    所以,你的脚本行应该是:

    foo)
      COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) ); compopt -o nospace; return 0;;
    bar)
      COMPREPLY=( $(compgen -W "--a_bar= --b_bar=" -- ${cur}) ); compopt -o nospace; return 0;;
    

    【讨论】:

    • 完美...谢谢。我现在确实在 bash 手册页中看到了 compopt。可能应该在可编程完成部分提到它!
    • 如果我坚持完成,我总是看bash-completion.alioth.debian.org。我猜这个项目中不存在未使用的功能;-)
    • 在 bash 3.X 中有没有办法做到这一点? compopt 似乎只存在于 bash4 中,mac 还没有默认自带。
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2018-10-17
    • 2021-12-27
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多