可以使用命令更新到特定标签或分支hg update <branch-or-tag>
。但是,内置补全功能仅显示标签(而不是分支)。因此,当我键入hg update
并按下 Tab 键时,我得到了标签列表,但没有分支。是否可以将分支添加到此列表?
或者这甚至可能是 Mercurial 的一个错误?
我正在使用 zsh 和 oh-my-zsh,并通过 Homebrew 安装 Mercurial。
答案1
(Zsh 5.0.2)的当前代码_hg
仅使用标签完成:
简单看一下_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
答案2
我在使用 Ubuntu 16.04 默认设置时也遇到了同样的问题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
适用于所有版本的 mercurial。您可以通过 type 轻松测试您使用的版本是否支持它hg debugnamecomplete
。如果不支持,只需更新 mercurial 即可。
答案3
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
}
答案4
zsh 附带的 mercurial 制表符补全脚本版本有点过时(不支持书签或分支)。 mercurial 源中有一个更新的版本。 homebrew 似乎没有安装此脚本,所以我发现最好的办法是下载 mercurial 源并将 zsh_completion 脚本添加到 zsh fpath。