用等号完成命令选项

2024-05-22

我正在尝试为可能需要表单上的长选项的命令编写一个 Bash 完成脚本--option or --param=value。如果用户已经在命令行上输入了一个选项,则该选项应从完成列表中排除(假设仅在命令行上指定一次给定选项才有意义)。

这是第一次尝试:

_myprog()
{
    local cur="${COMP_WORDS[$COMP_CWORD]}"

    local words=(--help --param1= --param-state --param2=)
    _exclude_cmd_line_opts
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}
complete -F _myprog myprog

_exclude_cmd_line_opts() {
    local len=$(($COMP_CWORD - 1))
    local i
    for i in "${COMP_WORDS[@]:1:$len}" ; do
         [[ $i == --* ]] && words=( "${words[@]/$i}" )
    done
}

如果源这个脚本source script.sh然后写:

$ myprog --param1= <tab><tab>

我得到以下完成列表:

=              --help         --param2=      --param-state

所以它几乎可以工作,除了我得到一个虚假的'='登录完成列表..有什么建议吗?


由于默认内容,在命令行上输入等号会强制断词COMP_WORDBREAKS。效果似乎是等号作为单独的单词输入COMP_WORDS。这在以下修改中被利用_exclude_cmd_line_opts:

_exclude_cmd_line_opts() {
    local len=$(($COMP_CWORD - 1))
    local i
    for ((i=1 ; i<=len; i++)) ; do
        local j="${COMP_WORDS[$i]}"
        if [[ $j == --* ]] ; then
            (( i<len )) && [[ ${COMP_WORDS[$(( i + 1))]} == '=' ]] && j="$j="
            words=( "${words[@]/$j}" )
        fi
    done
}

原来版本的问题_exclude_cmd_line_opts那是${words[@]/$j}会给出一个虚假的=例如当words=(param1=) and j="param1"(注意缺少尾随等号$j这是由COMP_WORDBREAKS)..

Update

我发现了这个的另一个特点。上面的例子工作得很好,因为我从来不需要打字<tab>紧接着=符号。但是,如果例如words=(--param= --param-info)我输入--par<tab>仍有两个候选完成,当前单词仅部分完成,成为--param。此时我想选择两个候选者中的第一个,然后我输入一个明确的=在命令行上签名,然后键入<tab>现在发生的情况是 Bash 认为您输入了一个空格(因为 COMP_WORDBREAKS 包含=) 并且当前完成词更改为--param= to =。这又会让 Bash readline 省略插入通常的空格,因此用户被迫输入空格来继续完成下一个选项。

通过返回一个可以避免在上述情况下键入空格COMPREPLY带有空字符串的数组。

_myprog()
{
    local cur="${COMP_WORDS[$COMP_CWORD]}"
    local prev=""
    (( COMP_CWORD > 0 )) && prev="${COMP_WORDS[$(( COMP_CWORD - 1))]}"
    [[ $cur == '=' && $prev == --* ]] && { COMPREPLY=( "" ); return; }

    local words=(--param= --param-info)
    _exclude_cmd_line_opts
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用等号完成命令选项 的相关文章

随机推荐

  • 如何在 IntelliJ IDEA 中关闭具有 Unit 返回类型的 Scala 自动完成函数?

    IntelliJ IDEA Scala 插件具有自动添加功能 Unit到单位返回函数的末尾 例如 如果我正在编写一个有副作用的函数foo def foo 当我击中Enter当光标位于大括号之间时 我将得到以下内容 def foo Unit
  • Delphi XE4 中是否可以更改应用程序短标题而不使其与项目 dpr 名称相同?

    我正在编写我的第一个由 delphi 驱动的 iPhone 应用程序 我已经创建了它 但我希望将其命名为 dpr 文件名称以外的名称 因为 dpr 文件不能包含空格 例如 EXE 名称并不总是与人们可能分配给应用程序的人类可读名称相同 而在
  • PowerShell JSON 添加值格式

    我正在向 json 文件添加数据 我这样做是通过 blockcvalue connectionString server localdb mssqllocaldb Integrated Security true Database data
  • 解释一下 Scala 中 Y 组合器的实现?

    这是 Y 组合器在 Scala 中的实现 scala gt def Y T func T gt T gt T gt T T gt T func Y func T Y T func T gt T gt T gt T T gt T scala
  • iOS 9 中可滑动的表格视图单元格

    我希望我的表格列表具有像 iOS 8 中那样的可滑动菜单 首次在 iOS 7 中引入 我找到了清晰的 Ray Wenderlich 指南 http www raywenderlich com 62435 make swipeable tab
  • 是否可以使用 csv.DictReader 保持列顺序?

    例如 我的 csv 有如下列 ID ID2 Date Job No Code 我需要以相同的顺序写回各列 这dict立即打乱了顺序 所以我相信这更多是读者的问题 蟒蛇的dicts 在 3 6 之前不维持顺序 但是 无论如何 在该版本中csv
  • 用于建模一般树结构及其迭代器的智能指针

    我通过为每个节点建立一个类来建模一般树结构 该类包含指向父级 第一个子级和第一个兄弟级的指针 以及指向最后一个兄弟级的指针 不需要 但有用 为此 我添加了一些额外的数据 我目前的实现是 class TreeNode typedef boos
  • 使用 Jquery Ajax 将数据从 jsp 发送到 struts2 操作类

    我需要使用 jquery Ajax 将表单数据从 jsp 传递到 struts2 并从 Struts2 操作类接收回 JSON 数据 我已经给出了下面的代码 当我传递 AJAX 数据时 url search action searchTex
  • 解码来自 S60 设备的 WBXML SyncML 消息

    我正在尝试解码来自诺基亚 N95 的 WBXML 编码的 SyncML 消息 我的第一次尝试是使用 python pywbxml 模块 它包装了对 libwbxml 的调用 用此方法解码消息会得到许多 标签以及 标签内的一大块二进制文件 我
  • .NET 中应用程序域的常见用途和最佳实践?

    关于何时在应用程序中创建新的应用程序域 有哪些准则和最佳实践 另外 有哪些常见用途以及如何在应用程序中使用多个应用程序域的示例 我见过的最常见的场景是能够通过与主程序不同的安全模型提供可扩展性 在单独的 AppDomain 中加载插件可以实
  • Python:像石英一样的事件调度程序[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • MySQL,连接两列

    MySQL 表中有两列 SUBJECT and YEAR 我想生成一个字母数字唯一编号 其中包含主题和年份的串联数据 我怎样才能做到这一点 是否可以使用像这样的简单运算符 您可以使用CONCAT http dev mysql com doc
  • HTML 选择框,从 servlet 中选择数据

    再会 我在 html 中的选择框上遇到问题 我位于简单 CRUD 项目的编辑部分 在用户可以编辑之前 将首先显示所选数据 然后我通过 servlet 在数据库中检索它 现在我希望我检索的数据成为我的选择框中选定的数据 默认 product
  • ASP.NET MVC4 与 Twitter Bootstrap 捆绑

    我正在尝试将 MVC 4 中的新捆绑功能与 Twitter bootstrap 结合使用 在我看来 css 中的字形 png 文件的路径在某种程度上被搞乱了 这是我的代码 bundles Add new StyleBundle bundle
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • 任何 JavaScript 代码都是有效的 TypeScript 代码吗?

    目前我已经开始学习TypeScript 从我研究过的文档来看TypeScript 我看到一些纯的样品JavaScript代码可以编译为TypeScript code 我的问题是 TypeScript 语言的设计方式是否使任何 JavaScr
  • case 语句中检测到无法访问的代码

    我有一个代码 protected override bool ProcessCmdKey ref Message msg Keys keyData switch keyData case Keys Alt Keys D1 if this c
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • 用等号完成命令选项

    我正在尝试为可能需要表单上的长选项的命令编写一个 Bash 完成脚本 option or param value 如果用户已经在命令行上输入了一个选项 则该选项应从完成列表中排除 假设仅在命令行上指定一次给定选项才有意义 这是第一次尝试 m