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


3

可以使用hg update <branch-or-tag>命令更新到特定的标签或分支。但是,内置补全仅显示标签(不显示分支)。因此,当我键入hg update并点击选项卡时,我会得到一个标签列表,但没有分支。是否可以在此列表中添加分支?

还是这可能是Mercurial中的错误?

我使用通过Homebrew安装的Mercurial的zsh和oh-my-zsh。

Answers:


3

_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


1
我在哪里可以找到zsh完成功能,以便对其进行修补?我只能找到bash完成...
Patrick Oscity

1

我对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。如果不支持,则也要更新。


这从我那里解决了。zsh更新后,此更改会还原吗?
Nebojsac

1
我怀疑它会被覆盖。避免zsh更新破坏的另一种方法是安装oh-my-zsh而不是修改而/usr/share/zsh/functions/Completion/Unix/_hg只是复制它~/.oh-my-zsh/custom/plugins/hg/_hg然后进行修改。之后修改~/.zshrc以加载自定义zsh插件plugins=(... hg)。实际上,我必须为OSX执行此操作,因为它/usr/share具有附加的安全性,可防止修改系统文件。
mattyboy

1

我通过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
}

0

zsh附带的用于mercurial的选项卡完成脚本的版本有点过时(不支持书签或分支)。汞来源中有更新的版本。homebrew似乎没有安装此脚本,因此我发现最好的方法是下载该源代码并将zsh_completion脚本添加到zsh fpath中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.