如何在zsh中正确调用compinit(和bashcompinit)
对整个问题进行了讨论和讨论。由于没有人参与这些讨论是100%肯定的问题,我在这里请求帮助。(为了完整起见,我将从头开始。) 假设我们有两个脚本(来源于如何在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
~/.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的每个实例分别运行脚本(这似乎是您的情况),那么
- 指示您的用户在他们的
文件中找到他们自动加载的点-Uz compinit&&compinit(如果他们没有,则添加).zshrc
- 让他们在那一行之前找到你的脚本
- 让脚本将包含补全函数的目录添加到它们的
$fpath
- 但是,如果您还提供了安装程序,则可以改为
- 让安装程序将完成功能复制到
(默认情况下,它位于zsh的/usr/local/share/zsh/site functions
中)$fpath
- 指示用户确保他们的
文件中有.zshrc
自动加载-Uz compinit&&compinit
bashcompinit
必须在compinit
之后调用(不确定是否相关)
是的,这是相关的,但不是你认为的那样。其中,bashcompinit
定义了complete()
,用户可以使用它向Zsh添加Bash完成函数。与compinit
类似,bashcompinit
意味着每个shell只能调用一次
如果软件包不提供本机Zsh完成函数,则应指示用户执行以下操作:
.zshrc
文件中找到他们自动加载的点-Uz compinit&&compinit自动加载-Uz bashcompinit&&bashcompinit