Mercurial:如何在自动完成中显示分支

Mercurial:如何在自动完成中显示分支

可以使用命令更新到特定标签或分支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。

相关内容