如何在zsh中正确调用compinit(和bashcompinit)

如何在zsh中正确调用compinit(和bashcompinit),bash,zsh,zshrc,tab-completion,bash-completion,Bash,Zsh,Zshrc,Tab Completion,Bash Completion,对整个问题进行了讨论和讨论。由于没有人参与这些讨论是100%肯定的问题,我在这里请求帮助。(为了完整起见,我将从头开始。) 假设我们有两个脚本(来源于~/.zshrc),它们为ZSH设置了一些完成逻辑。现在根据我所学到的,在脚本中的某个时候,您需要像这样调用compinit和bashcompinit(从NVM完成脚本复制) if[-n${ZSH_VERSION-}];然后 自动加载-U+X compinit&&if[${ZSH\U DISABLE\U COMPFIX-}=true];然后 com

对整个问题进行了讨论和讨论。由于没有人参与这些讨论是100%肯定的问题,我在这里请求帮助。(为了完整起见,我将从头开始。)

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

if[-n${ZSH_VERSION-}];然后
自动加载-U+X compinit&&if[${ZSH\U DISABLE\U COMPFIX-}=true];然后
compinit-u
其他的
compinit
fi
自动加载-U+X bashcompinit&&bashcompinit
fi
显然,根据ZSH手册,
bashcompinit
必须在
compinit
之后调用(不确定是否相关)。现在的问题是,当第二个脚本调用compinit时,来自第一个脚本的逻辑就消失了(即第一个脚本没有完成)。复制此内容的简单代码段是(复制自):

complete-W“hello world”1
一个看到自动完成工作
compinit
一个是看到自动完成不起作用
有人提出()类似于下面的方法来解决这个问题(通过在调用它之前检查是否已经调用了
compinit
):

if[-n${ZSH_VERSION-}];然后
如果!命令-v compinit>/dev/null;然后
自动加载-U+X compinit&&if[${ZSH\U DISABLE\U COMPFIX-}=true];然后
compinit-u
其他的
compinit
fi
fi
自动加载-U+X bashcompinit&&bashcompinit
fi
另一个想法是调用
compinit
bashcompinit
而不是在自定义完成脚本中,而是在
~/.zshrc
中(这会影响NVM等工具的自动安装过程)

我想知道通常设置完成的正确方法是什么(或者特别是调用
compinit

谢谢

假设我们有两个脚本(源于~/.zshrc),它们为ZSH设置了一些完成逻辑。现在根据我学到的,在脚本中的某个点上,您需要调用
compinit
bashcompinit

不,这不是你的剧本应该做的。不是您的脚本,但是用户应该在其
.zshrc
文件中调用
compinit
,以启用Zsh的完成系统。此外,对于每个shell实例,应该只调用一次

相反,第三方脚本有两种向Zsh添加完成函数的正确方法:

  • 如果用户应该为其shell的每个实例分别运行脚本(这似乎是您的情况),那么
  • 指示您的用户在他们的
    .zshrc
    文件中找到他们自动加载的点-Uz compinit&&compinit(如果他们没有,则添加)
  • 让他们在那一行之前找到你的脚本
  • 让脚本将包含补全函数的目录添加到它们的
    $fpath
  • 但是,如果您还提供了安装程序,则可以改为
  • 让安装程序将完成功能复制到
    /usr/local/share/zsh/site functions
    (默认情况下,它位于zsh的
    $fpath
    中)
  • 指示用户确保他们的
    .zshrc
    文件中有
    自动加载-Uz compinit&&compinit
(后者也是软件包管理器在安装软件时应该做的事情。)

显然,根据ZSH手册,
bashcompinit
必须在
compinit
之后调用(不确定是否相关)

是的,这是相关的,但不是你认为的那样。其中,
bashcompinit
定义了
complete()
,用户可以使用它向Zsh添加Bash完成函数。与
compinit
类似,
bashcompinit
意味着每个shell只能调用一次

如果软件包不提供本机Zsh完成函数,则应指示用户执行以下操作:

  • 在他们的
    .zshrc
    文件中找到他们自动加载的点-Uz compinit&&compinit
  • 在该行之后,添加
    自动加载-Uz bashcompinit&&bashcompinit
  • 然后,在该行之后,添加安装Bash完成的步骤