可以使用hg update <branch-or-tag>
命令更新到特定的标签或分支。但是,内置补全仅显示标签(不显示分支)。因此,当我键入hg update
并点击选项卡时,我会得到一个标签列表,但没有分支。是否可以在此列表中添加分支?
还是这可能是Mercurial中的错误?
我使用通过Homebrew安装的Mercurial的zsh和oh-my-zsh。
可以使用hg update <branch-or-tag>
命令更新到特定的标签或分支。但是,内置补全仅显示标签(不显示分支)。因此,当我键入hg update
并点击选项卡时,我会得到一个标签列表,但没有分支。是否可以在此列表中添加分支?
还是这可能是Mercurial中的错误?
我使用通过Homebrew安装的Mercurial的zsh和oh-my-zsh。
Answers:
_hg
(Zsh 5.0.2)的当前代码仅包含标记:
简要查看_hg
(mercurial的完成函数)的源显示,hq update
(由该函数实现的)的完成_hg_cmd_update
实际上仅返回修订和标签:
_hg_cmd_update() {
_arguments -s -w : $_hg_global_opts \
'(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
'(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
':revision:_hg_tags'
}
位置:我认为最简单的方法是调用locate _hq
,但通常我希望该函数位于/usr/share/zsh/5.0.2/functions
。由于安装选项的缘故,确切的子文件夹可能会更改。最安全的事情是下载5.0.2 tar球,然后查看zsh-5.0.2/Completion/Unix/Command/_hg
我对Ubuntu 16.04 default有同样的问题zsh 5.1.1
。
为了解决这个问题,我只是手动打了补丁 /usr/share/zsh/functions/Completion/Unix/_hg
用替换_hg_tags()
功能
_hg_tags() {
local expl
typeset -a hglabels
hglabels=( ${(f)"$(_hg_cmd debugnamecomplete -q 2>/dev/null)"} )
_wanted labels expl 'labels' compadd -a - hglabels
}
编辑:值得一提的,我使用Mercurial (version 3.7.3)
的debugnamecomplete
是不是善变的所有版本。您可以通过type轻松测试您使用的版本是否支持它hg debugnamecomplete
。如果不支持,则也要更新。
oh-my-zsh
而不是修改而/usr/share/zsh/functions/Completion/Unix/_hg
只是复制它~/.oh-my-zsh/custom/plugins/hg/_hg
然后进行修改。之后修改~/.zshrc
以加载自定义zsh插件plugins=(... hg)
。实际上,我必须为OSX执行此操作,因为它/usr/share
具有附加的安全性,可防止修改系统文件。
我通过hg up
使用以下代码重写_hg_tags()函数解决了分支自动完成的问题:
_hg_tags() {
typeset -a tags
local tag rev
_hg_cmd tags 2> /dev/null | while read tag
do
tags+=(${tag/ # [0-9]#:*})
done
_hg_cmd branches 2> /dev/null | while read tag
do
tags+=(${tag/ # [0-9]#:*})
done
(( $#tags )) && _describe -t tags 'tags' tags
}
zsh附带的用于mercurial的选项卡完成脚本的版本有点过时(不支持书签或分支)。汞来源中有更新的版本。homebrew似乎没有安装此脚本,因此我发现最好的方法是下载该源代码并将zsh_completion脚本添加到zsh fpath中。