单元测试 Zsh 完成脚本

2023-12-14

我正在尝试为 Zsh 编写一个完成脚本。我想对完成脚本进行单元测试。例如,我想测试完成情况my-command --h包括--help.

对于鱼,我可以使用complete -C 'my-command --h',然后会输出--help以及任何其他有效的完成情况。

我似乎找不到 Zsh 的等效命令。有吗?我尝试过类似的事情_main_complete, _complete and _normal,但要么他们不支持这一点,要么我没有以正确的方式调用它们(我得到了很多can only be called from completion function错误)。


我得到很多can only be called from completion function errors

这是因为 Zsh 的完成命令只能从完成小部件内部运行,而该小部件又只能在 Zsh 行编辑器处于活动状态时调用。我们可以通过在所谓的活动命令行上激活完成小部件来解决此问题伪终端:

# Set up your completions as you would normally.
compdef _my-command my-command
_my-command () {
        _arguments '--help[display help text]'  # Just an example.
}

# Define our test function.
comptest () {
        # Gather all matching completions in this array.
        # -U discards duplicates.
        typeset -aU completions=()  

        # Override the builtin compadd command.
        compadd () {
                # Gather all matching completions for this call in $reply.
                # Note that this call overwrites the specified array.
                # Therefore we cannot use $completions directly.
                builtin compadd -O reply "$@"

                completions+=("$reply[@]") # Collect them.
                builtin compadd "$@"       # Run the actual command.
        }

        # Bind a custom widget to TAB.
        bindkey "^I" complete-word
        zle -C {,,}complete-word
        complete-word () {
                # Make the completion system believe we're on a normal 
                # command line, not in vared.
                unset 'compstate[vared]'

                _main_complete "$@"  # Generate completions.

                # Print out our completions.
                # Use of ^B and ^C as delimiters here is arbitrary.
                # Just use something that won't normally be printed.
                print -n $'\C-B'
                print -nlr -- "$completions[@]"  # Print one per line.
                print -n $'\C-C'
                exit
        }

        vared -c tmp
}

zmodload zsh/zpty  # Load the pseudo terminal module.
zpty {,}comptest   # Create a new pty and run our function in it.

# Simulate a command being typed, ending with TAB to get completions.
zpty -w comptest $'my-command --h\t'

# Read up to the first delimiter. Discard all of this.
zpty -r comptest REPLY $'*\C-B'

zpty -r comptest REPLY $'*\C-C'  # Read up to the second delimiter.

# Print out the results.
print -r -- "${REPLY%$'\C-C'}"   # Trim off the ^C, just in case.

zpty -d comptest  # Delete the pty.

运行上面的例子将打印出:

--help

如果您想测试整个完成输出,而不仅仅是要在命令行上插入的字符串,请参阅https://unix.stackexchange.com/questions/668618/how-to-write-automated-tests-for-zsh-completion/668827#668827

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试 Zsh 完成脚本 的相关文章

  • 所有 Python 脚本停止工作:macOS Monterey 12.6 更新后所有项目中的路径均已更改

    今天将 macOS Monterey 更新到 12 6 后 我所有的 Python 项目 脚本都停止工作 在我的项目的 venv 之一中检查 Python 二进制文件的符号链接 我看到原始文件是 Library Developer Comm
  • 使用 zsh 对于大型 /.ssh/config 文件自动完成速度较慢

    我目前有一个 ssh config 文件 其中约有 7000 行 我想看看是否有办法加快 zsh 中的自动完成功能 当我开始输入我想要 ssh 进入的服务器然后按TAB它需要大约 10 秒的时间来向我显示我可以选择的可能的主机 问题是完成
  • git show HEAD^ 似乎不起作用。这是正常的吗?

    我正在使用 Zsh 并尝试为项目运行 git show 以查看我的修订历史记录 如果我做 git show HEAD 它可以很好地向我显示我的最后一次提交 但是以下命令不起作用 master 5 project git show HEAD
  • 缩短 Zsh 中的提示

    我在让 zsh 缩短提示符时遇到了很多麻烦 我目前正在使用带有 agnoster 主题和 oh my zsh 包管理器的 zsh 目前 我的提示在工作期间变得非常长 通常约为 110 个字符 占据了我的终端的整个长度 这在美观上不太令人愉悦
  • 过滤文件内容到排序表

    我有一个包含以下代码行的文件 这里的文件显示了一个逐一排序的时间表 at 12 00 the schedule of james version1 is first task eating nothing second task rest
  • 在文件和文件夹的名称中递归地填充 0

    我有一个文件夹 其中包含有关某个特定主题的视频讲座 它的结构如下 1 fol 1 file mp4 2 file mp4 3 file mp4 2 fol 10 file mp4 4 file mp4 5 file mp4 6 file m
  • Rails:带有参数的 rake 任务不起作用

    这是我的耙子任务 namespace users do task change role role gt environment do t args puts args role end end 我这样称呼它 rake users chan
  • ZSH:如何禁用“make”的默认完成?

    我编写了自动完成功能make命令 并将其放入 zsh function comp make function body compctl K comp make make 不幸的是 它不会工作 因为完成make已经定义在 usr share
  • 让 Python 虚拟环境、Fabric 和 Sudo 协同工作

    重现步骤 在 Linux 环境中 在桌面上创建一个名为 fab 的文件夹 仅供参考 我正在使用 zsh cd to Desktop fab 运行这个fabfile py通过发出在您的 fab 目录中制作fab init usr bin en
  • 如何修复 oh-my-zsh 插件无法工作的问题

    我刚刚发现了 oh my zsh 但我无法让它工作 虽然主题可以完美地工作 但插件却不能 我选择了一些插件 例如 macports 但我既没有完成端口命令 也没有适当的别名工作 这是我的 zshrc Path to your oh my z
  • 为 zsh + Prezto 主题安装 powerline 字体

    我目前正在使用 Zsh Prezto 进行脚本 shell 配置 我一直在使用sorin主题 但我有点不满意 我想切换到paradox https github com paradox460 prezto blob paradox modu
  • 使 zsh 从文件中获取完整参数

    zsh很棒 但它的完成系统非常多样化 并且文档缺乏好的示例 是否有用于完成特定应用程序的模板 补全将从文件中获取其匹配数据 并用换行符分隔 我尝试修改我的一个旧示例 该示例将匹配数据 实时 cat zsh completers jazzup
  • 哦,我的 zsh 显示出奇怪的字符“?”在终端上

    我已经安装了 iTerm2 和 Oh my zsh 然而 自从我将 ZSH THEME 更改为 agnoster 后 出现了一个奇怪的问号 附上相同的屏幕截图 我认为电力线会有所帮助 但似乎并没有发生 谁能帮我解决这个问题吗 这已经解决了这
  • 如何在多台机器之间共享 zsh 历史记录?

    我对在机器之间共享配置文件感到非常满意 但我发现我经常想在 zsh Ctrl R 中搜索 但我不记得在哪台机器上输入了命令 理想情况下 我希望它可以从我的任何机器中搜索先前命令的规范重复数据删除列表 鉴于我有时会在没有网络连接的情况下同时在
  • VSCode 终端任务不使用 zsh 配置文件

    我正在尝试在 VSCode 中的窗口加载上运行任务 其中终端打开并且nvm use yarn dev默认运行 但是 运行此 shell 任务似乎不会加载我的 zsh 配置文件 我运行任务得到的输出是 The terminal process
  • Shell 脚本 - 迭代空格分隔的单词/字符(在 zsh 中)

    我在弄清楚如何在 shell 脚本中迭代空格分隔的单词 字符时遇到一些麻烦 例如 我想迭代一个包含字母表中由空格分隔的字符的变量 注意 即使字母表变量包含空格分隔的字符串而不是字符 结果也应该是相同的 即 aa bb cc 而不是 a b
  • 使用通配符在 .zshrc 中获取多个文件

    我通过 oh my zsh 使用 z shell 我想从 zshrc 文件中获取多个别名文件 这样我就可以让事情井井有条 我已经为别名文件添加了前缀 alias 这样我就可以通配符加载它们 但是 打电话给source alias 只加载第一
  • Oh-my-zsh 哈希(井号)符号错误模式或未找到匹配项

    我很确定是与我的 Oh my zsh 配置相关的东西 但我不知道它是什么 当我在 git 命令中使用 符号时 但也适用于其他所有命令 例如 ls 2 我收到 错误模式 错误或 找不到匹配项 我猜是要计算一些东西 但我找不到在哪里配置它 I
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on

随机推荐

  • 鼠标滚轮滚动工具条菜单项

    我有一些包含许多菜单项的菜单 鼠标滚轮不会滚动它们 我必须使用键盘箭头或单击顶部和底部的箭头 是否可以使用鼠标滚轮滚动工具条菜单项 谢谢 您可以使用此类在应用程序范围内启用它 public class DropDownMenuScrollW
  • 使用架构方法在 Mongoose For 循环中保存项目

    如果我附加任何额外的验证方法 我在保存通过 for 循环运行的项目时遇到问题 基本上 我正在构建一个 Instagram API 应用程序 允许编辑者删除不雅的照片 照片会以 20 张为一组从 Instagram 中提取并展示给编辑 如果编
  • Discord.js 机器人欢迎会员,分配角色并向他们发送 DM

    所以当新成员加入时Guild 不和谐服务器 机器人应该在某个频道 ID 766716351007686696 发送消息 向他们发送直接消息 然后添加角色 Human Bean 这是我现在拥有的代码 它不起作用 底部有错误 client on
  • JavaScriptSerializer [ScriptIgnore] 对虚拟属性无效?

    我返回了 Json myObj 操作结果 myObj 的类型为 Badge Badge 仅有的两个可能导致序列化程序循环的对象是 public class Badge public Badge public Badge String Nam
  • CUDA Stream 压缩:理解概念

    我正在使用 CUDA Thrust CUDPP 据我了解 在流压缩中 数组中的某些项目被标记为无效 然后 删除 那么 移除 到底是什么意思呢 假设原始数组A长度为 6 如果有 2 个元素无效 无论我们提供什么条件 则 系统是否创建newGP
  • 使用 WAMP 新方法连接 PHP 和 SQL Server

    在独立的 PHP 和 SQL 服务器之间创建连接的最佳方法是什么 两台服务器 服务器 a SQL 和服务器 b PHP 请注意 我使用的是 wamp 我读了一些像下面这样的文章但我想知道有没有新主意 我测试了这段代码 效果完美 try us
  • 如何在新窗口中打开表单结果?

    我的网页上的 iframe 中有一个表单 单击提交按钮后 将在包含我的网页的窗口中查看结果 如何在新窗口中打开结果 你能调整表单html本身吗
  • 比较php中的两个数组

    我使用这个代码 new array 123 gt a 456 gt b old array 123 gt a 456 gt b 那么 new数组变成这样 new array 456 gt b 123 gt c 789 gt e 正如你看到的
  • jQuery $.ajax 使用 JSONP 进行跨域调用,返回状态 200,但正在调用错误函数而不是成功

    我的 Web 应用程序正在尝试访问属于不同域的另一台服务器的信息 由于它是跨域ajax调用 因此我使用 dataType 作为 JSONP 而不是JSON 现在 在 WebInspector gt Network 选项卡中 我看到请求已成功
  • Spring @RestController 获取请求内容类型以响应 json 或 html

    如何获取请求的 Content Type 值 我们需要它来打印 json 响应或 Html 响应 我的代码是这样的 RestController public class GestorController RequestMapping va
  • 使用cmd在windows中设置环境变量

    要在 Windows 中启动我的项目 我必须使用以下命令在 cmd 中设置 java 环境变量 set JAVA HOME D Java jdk1 7 0 但它没有设置环境变量 我不知道问题是什么 等待几个小时后 我发现原因是由于两侧的空白
  • 为多人游戏提供良好的安全性

    我用eclipse做了一个游戏 我有一个服务器程序和一个客户端程序 客户端使用套接字与服务器进行通信 如果客户端启动 它将其用户名和密码发送到服务器 如果该组合存在 则客户端可以与服务器进行通信 而客户端不断读取游戏中其他人的等级并不断发送
  • Rails Admin - 删除相关对象

    我在用着导轨管理员在我的网站之一上 到目前为止 一切都很好 但我不知道如何从编辑页面中删除相关对象 例子 我有两个模型 Property 和 PropertyImage class Property has many property im
  • javafx如何禁用checkboxTreeItem中的一项?

    我是 JavaFX 新手 在复选框树视图中遇到问题 我想禁用根值中的一项 序列号但根据 JavaFX 文档 这似乎是不可能的 我禁用了点击效果cbTreeViewdisable treeItems 3 有没有办法将任何一个值变灰 或设置一个
  • firebase 数据库规则允许对具有特定信息的特定用户进行读/写

    我的 firebase 数据库规则如下 rules users uid read auth null root child users child auth uid child role val teacher write auth nul
  • 使用 Linq 或 Lambda 表达式检查复杂对象中的重复项

    我刚刚开始学习 linq 和 lambda 表达式 它们似乎非常适合在复杂的对象集合中查找重复项 但我有点困惑 希望有人可以帮助我回到快乐编码的道路上 我的对象的结构类似于 list list unique 客户标识符 我需要确保整个复杂对
  • 玩笑完成回调不可分配给 ProvidesCallback 或未定义类型的参数

    我正在尝试用笑话创建一个测试 我想使用done 回调但 Typescript 不接受它 我尝试使用 typeany jest DoneCallback或者不加任何类型但又不起作用 有什么解决方案或想法吗 it implements opti
  • 自动建议短语/句子完成

    我正在构建一个应用程序 我希望我的应用程序能够读取用户在输入文本框中输入的内容 并根据到目前为止的句子向用户提供两个事物 1 他们正在输入的可能短语列表 以便轻松自动完成 我猜我会使用预设的短语列表 我可以通过搜索来获得这些建议 2 根据句
  • PerformSelector 不工作

    MyThreadRun 方法是这样从 MyMethod 调用的 NSArray args NSArray arrayWithObjects arg1 target NSStringFromSelector mySelector nil NS
  • 单元测试 Zsh 完成脚本

    我正在尝试为 Zsh 编写一个完成脚本 我想对完成脚本进行单元测试 例如 我想测试完成情况my command h包括 help 对于鱼 我可以使用complete C my command h 然后会输出 help以及任何其他有效的完成情