使用现有自动补全的 ZSH 自动补全功能

2024-02-28

我有一个函数mycmd启动我编写的程序。该程序需要第一个参数是foo, ssh or ls。第二个参数取决于第一个参数,如下所示,

  1. foo-> 没有第二个参数
  2. ssh-> ssh 到的东西
  3. ls-> 一个文件

我想编写 zsh 自动完成功能mycmd这表明第二个参数取决于第一个参数。以最简单的形式,我知道我可以对第一个参数执行以下操作

_mycmd() {
    compadd foo ssh ls
}
compdef _mycmd mycmd

我很难理解如何处理这里的第二个参数。我该如何使用_ssh自动完成ssh论证和_ls自动完成ls争论? (并且没有什么foo以及)


要检查当前命令行,可以使用$words https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#index-words and $CURRENT https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#index-CURRENT这是完成特殊参数。

CURRENT https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#index-CURRENT
这是当前单词的编号,即光标当前在单词数组中所在的单词。
...
words https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#index-words
该数组包含当前正在编辑的命令行上出现的单词。

--- zshcompwid(1),完成特殊参数,zshcompwid - zsh 完成小部件 https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#Completion-Special-Parameters

完成功能可以修改$words and $CURRENT(和/或其他变量),然后根据其修改后的命令行启动整个完成系统。例如:

$ mycmd ls -al<TAB>               ;# This is the input, and
;# $words == ("mycmd" "ls" "-al") ;# original value for $words.
;# $words=("ls" "-al")            ;# We could update $words for making zsh
;# $ ls -al<TAB>                  ;# to start the completion system with
                                  ;# its modified command line.
                                  ;# Finally, _ls would be called.

效用函数_normal https://zsh.sourceforge.io/Doc/Release/Completion-System.html#index-_005fnormal可用于。

_normal https://zsh.sourceforge.io/Doc/Release/Completion-System.html#index-_005fnormal
...
第二种用途是重新检查由$words数组和$CURRENT修改后的参数。

-- zshcompsys(1),实用函数,_normal https://zsh.sourceforge.io/Doc/Release/Completion-System.html#index-_005fnormal

_mycmd可以列出如下:

_mycmd () {
  if ((CURRENT == 2)); then
    compadd foo ssh ls
  elif ((CURRENT > 2)); then
    case "$words[2]" in
      (ssh|ls)
        shift words
        ((CURRENT--))
        _normal -p mycmd
        ;;
      (foo)
        _nothing
        ;;
      (*)
        _message "mycmd: invalid subcommand or arguments"
        ;;
    esac
  fi
  return $?
}

甚至,更多地使用完成内置/实用函数,如下所示:

_mycmd () {
  local curcontext="${curcontext}" state context line
  local -A opt_args
  _arguments '*:: :->subcmd'
  if [[ "$state" == "subcmd" ]]; then
    if ((CURRENT == 1)); then
      _describe -t mycmd-subcmd "mycmd command" '(foo ssh ls)'
    else
      curcontext="${curcontext%:*:*}:mycmd-$words[1]:"
      case "$words[1]" in
        (ssh|ls)
          compset -n 1
          _normal -p $service
        ;;
        (foo)
          _nothing
        ;;
        (*)
          _message "mycmd: invalid subcommand or arguments"
        ;;
      esac
    fi
  fi
  return $?
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用现有自动补全的 ZSH 自动补全功能 的相关文章

  • 将芯片/标签移出 MUI 中的自动完成框

    我正在使用MUIAutocomplete组件并试图弄清楚是否可以移动芯片 标签outside输入框的 这可能吗 我更希望芯片列在盒子下方 这样 文本框就可以仅用于用户输入 而不是both显示芯片 标签和用户输入 我尝试过使用其中一个基本演示
  • Google Play 自动完成搜索建议是如何工作的?

    在 Google Play 上搜索时 会出现自动完成建议 我一直认为这些是最常见的搜索术语 然而 一些自动完成建议确实不太可能常见 例如 有什么想法为什么谷歌会建议这样的搜索词吗 None
  • ${BASH_SOURCE[0]} 在 zsh 中等效吗?

    标题应该说明一切 我正在寻找相当于 BASH SOURCE 0 in zsh Note 我不断地寻找 0相当于 BASH SOURCE 0 在互联网上流传甚广 但这似乎是错误的 0似乎是执行命令的名称 它是argv 0 这是有道理的 在我的
  • grep --include 命令在 OSX Zsh 中不起作用

    我正在关注最佳答案如何在 Linux 上查找包含特定文本的所有文件 https stackoverflow com questions 16956810 finding all files containing a text string
  • git:哈希自动完成

    Is there any chance to configure git to autocomplete the hashes when pressing TAB Edit 请注意 这个问题不是关于自动完成 但关于哈希自动完成 请参阅我对
  • 电话号码的 jQuery 输入掩码

    我希望用户的输入自动填充电话号码的标点符号 以便看起来像这样 xxx xxx xxxx 这是我的 HTML 代码 div class form group div
  • jquery 自动完成不响应动态插入的元素

    我们正在研究使用 jquery 动态插入元素的自动完成 之前对静态元素进行过自动完成 下面是插入一个自动完成添加元素的 html 源代码 同一页面上可能插入多个元素 插入元素的 id 在插入之前是未知的 id 因元素而异
  • 如何禁用 UITextView iPhone 键盘中的自动完成功能

    我正在做一个应用程序 我想在文本字段中禁用键盘的自动完成功能 我怎样才能做到这一点 如果您使用 IB 请使用 epatel 的方法 如果您不使用IB 请尝试以下方法 setAutoCorrectionType 并通过UITextAutoco
  • Shell 脚本 - 迭代空格分隔的单词/字符(在 zsh 中)

    我在弄清楚如何在 shell 脚本中迭代空格分隔的单词 字符时遇到一些麻烦 例如 我想迭代一个包含字母表中由空格分隔的字符的变量 注意 即使字母表变量包含空格分隔的字符串而不是字符 结果也应该是相同的 即 aa bb cc 而不是 a b
  • Eclipse 插件:应有的自动完成功能

    我有一个问题 有多种可能的解决方案 我正在学习计算机科学 目前正在担任实习生 我的任务是为 Android 和 iOS 制作一个商业应用程序 我现在已经使用 Visual studio 2010 工作了 2 年 Xcode 相当相似 所以这
  • (Django) (外键问题) model.person_id 不能为 NULL

    我知道这在 Django 圈子里似乎是一个被过度询问的问题 但我不敢说我 还没有找到解决方案 我的模型 from djago import User class InfoPersonal models Model person models
  • 使用通配符在 .zshrc 中获取多个文件

    我通过 oh my zsh 使用 z shell 我想从 zshrc 文件中获取多个别名文件 这样我就可以让事情井井有条 我已经为别名文件添加了前缀 alias 这样我就可以通配符加载它们 但是 打电话给source alias 只加载第一
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • 谷歌浏览器自动填充所有密码输入

    我的问题 我必须打开谷歌来自动填充我网站上的登录信息 但是现在每当我想编辑我的帐户信息或编辑其他用户帐户信息 作为管理员 时 它都会尝试自动填充该登录数据 它在奇怪的地方填充了我的数据 问题似乎是 Chrome 会自动用某种密码填充任何输入
  • 在 Python IDLE 会话中显示用户定义函数的列表

    是否可以在 IDLE 会话中显示所有用户功能的列表 我可以看到它们在自动完成中弹出 所以也许还有其他方法可以只显示为会话定义的用户功能 当您忘记函数名称时 它很有用 而且当您想确保在会话关闭时不会丢失函数的源代码时 这应该为您提供全局范围内
  • 双屏 Android Studio 中不显示自动补全

    我刚刚从 Eclipse 切换到 Android Studio IntelliJ 我不明白自动补全是如何工作的 我尝试了 Control Space Control Shift Space 但没有相关建议 不在 Java 文件中 也不在布局
  • 使用 vim pythoncomplete 的 Python 文档字符串不显示我自己的类函数的换行符

    我在尝试使用时得到了一些意想不到的结果Python 全方位补全 http www vim org scripts script php script id 1542在我自己的类函数上 函数的文档字符串未正确设置换行符格式 如下图所示 当我从
  • 如何在 PHPStorm 中禁用 html 标签完成

    当我在 HTML 其他上下文中并输入时foobar然后按Tab键它会自动变成
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式

随机推荐

  • Hibernate:为什么 FetchType.LAZY 注释的集合属性急切加载?

    我尝试实现简单的one to many协会 使用调试模式检查项目对象后 我发现List
  • scrapy中如何根据url过滤重复请求

    我正在使用 scrapy 和 CrawlSpider 为网站编写一个爬虫 Scrapy 提供了一个内置的重复请求过滤器 可以根据 url 过滤重复请求 另外 我可以使用过滤请求rules爬行蜘蛛成员 我想做的是过滤请求 例如 http ww
  • matplotlib:子图背景(轴面+标签)颜色[或图/轴坐标系]

    我有一个包含 3x2 子图的图形 我想在中间一对子图上设置背景颜色 以便更清楚哪些轴标签属于哪个子图 Setting facecolor构建子图时 仅更改轴定义的区域的颜色 刻度线和轴标签仍然绘制在figure patch 假设没有简单的方
  • ionic 使用获取上一页名称

    我用的是离子2 我需要获取上一页的名称 这是我的代码 ViewChild Nav nav Nav constructor this nav app viewDidEnter subscribe view gt console log Cur
  • 在 Openlayers 中单击地图外部时如何激活功能 + 弹出窗口?

    我正在重新解析已加载到地图上的 KML 类似于此处的示例 http openlayers org dev examples sundials html http openlayers org dev examples sundials ht
  • 适用于 SQL Server 的 Microsoft OLE DB 提供程序是否支持 TLS 1.2

    我们的客户端最近从 TLS 1 0 升级到 TLS 1 2 此后我们的软件无法与 SQL Server 连接 它使用 OLE DB 提供程序连接到 SQL 服务器 以下是从 SQL 服务器返回的错误 DBNETLIB ConnectionO
  • 有什么方法可以在不更改格式的情况下比较 Git 中的两个文件吗?

    我已经提交了一些具有某种格式的代码 但源有一些其他格式 审阅者要求我恢复所有更改 我正在寻找一些 UI 工具或 Git 中的某种方式来删除格式并给出实际结果 我想你可能会看看 git diff 特别是以下两个选项 b ignore spac
  • Qt Mac(删除编辑菜单中的“特殊字符...”操作

    我正在 Qt 中开发一个应用程序 它经常重建其菜单 然而 当我们调用clear 并在菜单中重新添加我们想要的操作时 特殊字符 似乎保留在菜单中 有什么方法可以删除或将此操作移动到 QMenu 的底部吗 这是重建菜单的代码 void Main
  • 从用户上下文中的守护进程启动代理

    我有一个启动守护程序 它在 Mac OSX 10 6 计算机的登录上下文中运行 我想从该代理为每个用户启动一个代理 并让该代理在用户的登录上下文中运行 但是 我需要非常仔细地控制代理应用程序的精确参数 这就是为什么我不能使用 launchd
  • 如何在cocos 2d中移动背景

    你好 我想开发像 涂鸦跳跃 这样的游戏 但是我对以下功能有一些问题 1 如何移动背景场景 图像 2 如何检测对象之间的碰撞 是否需要像box2d这样的物理引擎 或者我应该使用手动碰撞 3 背景图片的大小应该是多少 4 事实上我不知道背景是如
  • 解决方案资源管理器中的引用未更新

    我通过解决方案资源管理器添加了对我的 C Windows 项目的一些引用 当我尝试在另一台计算机上加载相同的项目时 我在 Visual Studio 无法检测到的所有引用上看到黄色标记 因此 我安装了所有被引用的库 但 Visual Stu
  • 在继续 Google Apps 脚本之前等待异步请求返回

    我当前正在生成的 Google Apps 脚本中的一些代码需要一个对象来完成 其中一个属性由异步请求的结果设置 这个对象 特别是这个属性 稍后会被使用 但是 由于在需要该属性的函数运行时请求尚未返回 因此它们无法正确评估 我的代码如下 fu
  • 字符数组的初始值设定项字符串太长 C

    我正在开发一个程序 它接受输入并输出与输入相对应的数值 我在 char 部分收到错误 我不明白为什么当数组中只有 27 个字符且大小为 27 时会出现这样的错误 int main char greek 27 ABGDE ZYHIKLMNXO
  • 为三个不同标识符之间的任意匹配组合创建单个 ID

    我的客户数据来自多个不同的系统 具有三个潜在的唯一标识符 我们需要创建一个新 ID 可用于链接三个标识符之间的任何匹配项 数据结构如下 Primary Key CustomerID1 CustomerID2 CustomerID3 1 Al
  • 如何判断 HTML5 音频元素是否正在使用 Javascript 播放

    我有一个audio网页中的元素 我想确保用户在离开页面时不会仍在播放它 我怎样才能确定audio页面卸载时元素未播放 到目前为止 我有以下代码 但它似乎不起作用 卸载报告时弹出的对话框playing is false即使音频正在播放
  • 使用 ProgressDialog 直到从 Web 服务加载 GridView

    我正在从 Web 服务获取 GridView 的图像和文本 因此需要一些时间才能显示 GridView 我想显示一个 ProgressDialog 直到网格完全加载 到目前为止我所做的如下 public class PCGridMain e
  • 语音转文本 在 apk 中包含语音引擎

    我的应用程序中需要为真正的非极客提供语音转文本功能 有没有办法在编译时为各种平板电脑包含语音引擎 您可以包含自己的引擎 例如 CMU Sphinx 引擎 这还具有无需数据连接即可工作的优点 看到这个post http cmusphinx s
  • IPython笔记本交互函数:如何保存更新后的函数参数

    我在 Ipython 笔记本中编写了下面的代码 生成一个由参数 a 控制的 sigmoid 函数 a 定义了 sigmoid 中心的位置 b 定义了其宽度 matplotlib inline import numpy as np impor
  • 如何使用 GAS 的内置电子表格函数

    我刚刚开始使用 GAS 进行电子表格编程 但找不到我的小问题的答案 我想获得电子表格中某一列中的最大数字 打开电子表格并获取范围不是问题 但我不知道如何使用内置电子表格函数 如 MAX var ss openSpreadsheetByNam
  • 使用现有自动补全的 ZSH 自动补全功能

    我有一个函数mycmd启动我编写的程序 该程序需要第一个参数是foo ssh or ls 第二个参数取决于第一个参数 如下所示 foo gt 没有第二个参数 ssh gt ssh 到的东西 ls gt 一个文件 我想编写 zsh 自动完成功