如何在 zsh 中正确安装新的补全?

2023-12-22

整个问题已讨论完毕here https://github.com/DannyBen/alf/issues/39 and here https://github.com/nvm-sh/nvm/issues/2489。由于参与这些讨论的人都没有 100% 确定这个问题,因此我在此寻求帮助。 (为了完整起见,我将从头开始。)

假设我们有两个脚本(源自~/.zshrc)为 ZSH 设置一些完成逻辑。现在根据我所了解到的,在脚本中的某个时刻您需要调用compinit and bashcompinit像这样(从NVM完成脚本复制)

if [[ -n ${ZSH_VERSION-} ]]; then
  autoload -U +X compinit && if [[ ${ZSH_DISABLE_COMPFIX-} = true ]]; then
    compinit -u
  else
    compinit
  fi
  autoload -U +X bashcompinit && bashcompinit
fi

显然,根据ZSH手册,bashcompinit必须在之后调用compinit,(不确定是否相关)。现在的问题是,当第二个脚本调用时compinit,来自第一个脚本的逻辑消失了(即第一个脚本的完成不可用)。重现此问题的一个简单片段是(复制自here https://github.com/DannyBen/alf/issues/39):

complete -W "hello world" one
one <tab>   # to see autocomplete working
compinit 
one <tab>   # to see autocomplete NOT working

有人提出(here https://github.com/DannyBen/alf/issues/39)类似于下面的内容来解决问题(通过检查是否compinit在调用之前已经被调用):

if [[ -n ${ZSH_VERSION-} ]]; then
  if ! command -v compinit > /dev/null; then
    autoload -U +X compinit && if [[ ${ZSH_DISABLE_COMPFIX-} = true ]]; then
      compinit -u
    else
      compinit
    fi
  fi
  autoload -U +X bashcompinit && bashcompinit
fi

另一个想法可能是打电话compinit and bashcompinit不在自定义完成脚本中,而是在~/.zshrc(这会损害 NVM 等工具的自动化安装过程)。

我想知道一般情况下设置完成的正确方法是什么(或者特别是关于调用compinit).

Thanks.


安装本机 Zsh 补全

假设我们有两个脚本(源自~/.zshrc)为 ZSH 设置一些完成逻辑。现在根据我所了解到的,在脚本中的某个时刻您需要调用compinit and bashcompinit

不,这不是你的脚本应该做的。不是你的脚本,而是user应该打电话compinit(在他们的.zshrc文件)以启用Zsh更先进的补全系统 https://zsh.sourceforge.io/Doc/Release/Completion-System.html。 另外,它应该被称为只有一次对于每个 shell 实例。

Side note

Zsh 中默认启用了一个更基本的、类似 Bash 的补全系统,但它是几乎已被弃用 https://zsh.sourceforge.io/Doc/Release/Completion-Using-compctl.html#Completion-Using-compctl. Don’t打扰它;您的绝大多数用户都拥有compinit在他们的点文件中,这提供了更好的用户体验,即使默认情况下未启用它。是的,Zsh 以向后兼容性的名义提供了糟糕的、过时的默认值。不幸的是,几乎所有新功能都是选择加入的。

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

如何在 zsh 中正确安装新的补全? 的相关文章

  • Z Shell“自动加载”内置 - 它有什么好处?

    我已经使用 Z shell 一段时间了 我开始感到好奇 我在编写自己的函数时偶然发现的一件事是 自动加载 根据 zshbuiltins 1 手册页autoload是 相当于functions u 有一个例外 它 相当于typeset f 有
  • head 的否定参数

    我正在尝试使用head命令 在 macOS 中使用 zsh 代码如下 a txt 1 2 3 4 5 6 7 8 9 10 tail n 5 a txt line 5 to line end tail n 5 a txt last line
  • ZSH RPROMPT 奇怪的间距?

    这是我的 ZSH 提示主题 function git prompt info ref git symbolic ref HEAD 2 gt dev null return echo parse git dirty ZSH THEME GIT
  • zsh:权限被拒绝:gam

    我在安装了 Oh My ZSH 的 macOS 10 12 上使用 ZSH 我最近安装了GAM https github com jay0lee GAM在我的计算机上使用提供的安装脚本bash lt curl s S L https git
  • 安装 zsh 并更改字体样式后,我的 VS Code 终端字体很小

    如果你看一下 VS Code 终端 它太小了 以下是我为创建此结果而修改的用户设置 我已经搜索了如何在 VS Code 中更改终端字体 但我已遵循与terminal integrated fontSize这根本没有帮助 它只会拉长队伍 请告
  • 为什么 cURL 请求在 ZSH 中的每个请求中都返回百分号 (%)?

    我注意到 ZSH 中任何 cURL 请求的返回都以 例如 curl http textbelt com text d number 555555555 d message hey gt success true 为什么要添加这个字符 是否有
  • zsh 和并行:如何使用函数。它说找不到命令

    我有一个脚本文件 文件名 test sem zsh sh main echo Happy day export f main sem id testing fg main 我正在尝试使用运行它zsh zsh test sem zsh sh
  • “ipython”选项卡自动完成功能不适用于导入的模块

    IPython 上的制表符补全似乎不起作用 例如 import numpy numpy
  • 让 Python 虚拟环境、Fabric 和 Sudo 协同工作

    重现步骤 在 Linux 环境中 在桌面上创建一个名为 fab 的文件夹 仅供参考 我正在使用 zsh cd to Desktop fab 运行这个fabfile py通过发出在您的 fab 目录中制作fab init usr bin en
  • 如何在telnet客户端实现tab补全

    我有一个为 telnet 客户端打开连接的服务器 例如 例如 我运行服务器 server在另一个窗口中 我将 telnet 客户端作为 telnet localhost 9999 运行 当我运行 telnet 客户端时 我将收到新的 CLI
  • Mac 终端重新启动后无法运行大多数命令

    我正在使用Mac 我有一个定制终端zsh 有一段时间就好了 但在我重新启动计算机后 它的行为开始有所不同 终端停止运行命令 例如rake or rails 我已经使用rails创建了应用程序 但是使用了类似的rails命令rails v现在
  • VSCode 添加随机百分比

    每次我使用终端打印出字符串或任何类型的字符时 它都会自动在每行末尾打印一个 每当我尝试从 C 或 php 打印某些内容时 都会发生这种情况 但还没有尝试过其他语言 我认为这可能是 vscode 的问题 并且不知道它是如何出现的或如何修复它
  • 终端 vim 未加载 .zshrc

    我的终端 vim 配置未加载 zshrc Zsh是环境登录shell 对于这种情况 正确的配置是什么 以下是我已经采取并已删除的一些措施 set shell zsh 使用 zsh 作为 shell 但不获取 rc 源 set shellcm
  • Bower、Grunt 和 zsh:未找到命令:

    我已经安装了 Grunt Bower 我正在使用 ZSH 当我打字时bower help or grunt anything I get zsh command not found bower or zsh command not foun
  • 正则表达式 [A-Za-z] 似乎不包含字母 W 和 w

    由于某种原因 我不知道为什么 也许我的系统或我的大脑有些不对劲 正则表达式 A Z 似乎无法识别字母 W 和 a z 似乎不认识字母 w 例子 for x in A a B b C c D d E e F f G g H h I i J j
  • zsh 更改提示输入颜色

    我想更改 zsh 中输入文本的颜色 我为每个命令键入的文本 示例 在user host gt ls 我想要ls 为黄色以从标准输出中脱颖而出 我知道我可以完成这个bash using export PS1 BIGreen u h w IYe
  • oh-my-zsh 不应用主题

    我刚刚设置zsh和 一起oh my zsh 但有一些我无法理解的奇怪行为 如果我重新启动终端 或 iTerm 2 两者的行为相同 则指定的主题 zshrc未加载 我需要去做source zshrc让它发生 如果我echo ZSH THEME
  • 使用命令行上的自定义选项卡补全仅循环浏览 PS 中的特定文件类型

    我使用 PowerShell 的PS阅读线 https github com lzybkr PSReadLine基于选项卡完成 我希望实现以下自定义完成行为 在我有的文件夹中 File1 java File1 class File2 jav
  • grep --include 命令在 OSX Zsh 中不起作用

    我正在关注最佳答案如何在 Linux 上查找包含特定文本的所有文件 https stackoverflow com questions 16956810 finding all files containing a text string
  • 让 Emacs ansiterm 和 Zsh 更好地发挥作用

    我一直在尝试在 emacs 会话中使用 Zsh 而无需 emacs 重新映射所有 Zsh 键 我发现 ansi term 对此非常有效 但是我仍然遇到一些问题 我输出了很多垃圾字符 我可以用以下方法修复它 Setup proper term

随机推荐

  • 让 Cancan 的 load_and_authorize_resource 在自定义创建操作中工作

    正在尝试设置Cancan在我的应用程序中 并且我的应用程序遇到问题PostsController 简而言之 当Post创建后我希望它与current user所以我的创建操作看起来像这样 class PostsController lt A
  • 工厂方法的命名约定是什么?

    介绍 MacApp Macintosh 应用程序框架 App89 始终声明 将工厂方法定义为 Class 的抽象操作 DoMakeClass 其中 Class 是 Product 类 这句话让我想到了关于工厂方法设计模式的命名约定的问题 期
  • fortran 中的过程 nopass 与普通函数

    因此 在其他语言中 静态方法可以访问静态成员 并且它们的可见性受到类范围的限制 在 Fortran 中 没有静态成员 如果我错了 请纠正我 并且方法名称是全局可访问的 因此我什至不能在不同的类中拥有两个同名的静态方法 我认为 nopass
  • CSS 过渡不适用于 max-height: fit-content

    我正在尝试使用 CSS 为一些可扩展面板设置动画 如下所示 panel transition max height 0 1s ease in out flex 90 max height 26px expanded max height f
  • 网格::右对齐网格项目

    通过使用右侧按钮的网格定位 有人能指出我正确的方向吗 container width 500px border 1px solid red grid display grid grid gap 5px grid auto flow colu
  • 在Python中从键盘读取原始输入

    我正在尝试在 python 中获取键盘的原始输入 我有一个带可编程按键的罗技游戏键盘 但罗技不提供适用于 Linux 的驱动程序 所以我想我可以 尝试 为此编写自己的驱动程序 认为解决方案可能是这样的 with open dev keybo
  • 从源代码访问 Visual Studio 宏?

    Visual Studio 有类似的宏 TargetDirectory OutputPath etc 在我的源代码中 我想指定一个相对路径 用于从比该文件低几级的文件夹中加载文件 TargetDirectory 目前我正在这样做 mLaye
  • 如何在命令行中使用 Emacs 启动不同模式?

    有没有办法使用命令行启动不同的 emacs 模式 例如 是否可以按如下方式运行 emacs emacs org mode to start orgmode emacs python mode to start python mode 此后我
  • Hibernate - 为什么使用多对一来表示一对一?

    我见过人们使用多对一映射来表示一对一关系 我还在 Gavin King 的书和文章中读到过这一点 例如 如果一位客户只能有一个送货地址 并且一个送货地址只能属于一位客户 则映射如下
  • App Store - 帮助回答“缺少合规性”(使用 Expo + Firebase)

    我正在将我的应用程序发布到 App Store 但我对 缺少合规性 步骤有疑问 以下是有关该应用程序的一些信息 I used 世博会 托管工作流程 https docs expo io introduction managed vs bar
  • 在php mysql中插入多个值

    我这里有一个用于更新 php mysql 中的多个值的示例代码 我想知道如何插入多个值
  • 企业代理背后的 Apache

    我正在开发一个 php 应用程序 我正在使用 wamp 并且我在公司代理后面 我在用着cntlm http cntlm sourceforge net 进行身份验证NTLM https en wikipedia org wiki NT LA
  • 如何使用 Diesel 和 SQLite 获取新创建值的 id?

    柴油机的SqliteBackend不执行SupportsReturningClause的特质 所以get result方法不能用于检索新创建的值 还有其他方法可以找出插入行的 id 吗 Python 有一个解决方案 https stacko
  • 如何将 lambda 函数读取为字符串?

    我想在创建它之后读取我作为字符串创建的 lambda 函数 例如 func lambda num1 num2 num1 num2 我想将 func 读为 lambda num1 num2 num1 num2 有没有办法实现这一点 甚至读取
  • C++ iomanip 对齐

    我正在尝试调整我的输出 但由于某种原因我无法让它对齐 我多么想要它 这真的很令人沮丧 标题不会正确对齐 我不知道我是否正确使用 setw include
  • HttpContext.Current 调用背后有多少计算量?

    是不是很贵 我正在开发一个直接渲染到 Response Output 的 HtmlHelper 以节省不必要的字符串创建 我需要在以下选项之间进行选择 and 并从 HttpContext Current Response 获取 textW
  • python GIL 的多线程示例

    我读过很多关于在编写多线程代码时 python GIL 业务有多么 糟糕 的文章 但我从未见过一个例子 有人可以给我一个基本的例子来说明 GIL 在使用线程时何时会导致问题吗 Thanks 多线程的主要原因之一是程序可以利用多个 CPU 和
  • Selenium webdriver python 无法上传文件 - send_keys 抛出 ElementNotInteractable

    所以我尝试使用 selenium webbrowser send keys 上传文件 但它不起作用 请帮忙 from selenium import webdriver import time driver webdriver Chrome
  • 使用 Python Selenium 保存网页

    我正在使用 Selenium Webdriver for Python 2 7 启动浏览器 browser webdriver Firefox 转到某个网址 browser get http www google com 此时 如何向浏览器
  • 如何在 zsh 中正确安装新的补全?

    整个问题已讨论完毕here https github com DannyBen alf issues 39 and here https github com nvm sh nvm issues 2489 由于参与这些讨论的人都没有 100