0

是否可以更改默认行为hg log以仅显示当前祖先?

即:

hg log --rev "reverse(ancestors(.))"

问题是,我总是hg log这样做。

我知道我可以在我的身上做这样的事情,.bashrc但我想知道是否有一种善变的方法来做到这一点。

hg () {

    if [[ $2 -eq "log" ]]
    then
        # TODO: Append other arguments to this...
        hg log --rev "reverse(ancestors(.))" 
    else
        # Run the command
    fi
}
4

2 回答 2

4

虽然您可以使用别名来完成此操作(见下文),但这里最简洁的方法是扩展:

from mercurial import extensions, commands

testedwith = "3.5"

default_log_rev = "reverse(ancestors(.))"

def override_log(original_cmd, ui, repo, *pats, **opts):
  have_rev = False
  for opt in ["rev", "branch"]:
    if opts.has_key(opt) and opts[opt]:
      have_rev = True
  if not have_rev:
    opts["rev"] = [default_log_rev]
  return original_cmd(ui, repo, *pats, **opts)

def uisetup(ui):
  extensions.wrapcommand(commands.table, "log", override_log)

--rev如果既不设置也不设置--branch选项(或它们的缩写-r-b),这将仅使用您的新默认值log,因此如果提供其中之一,则保留原始行为。

您可以以通常的方式安装这样的扩展,即在您的~/.hgrc(假设上面的代码在/path/to/logdefault.py)中添加类似以下内容:

[extensions]
logdefault = /path/to/logdefault.py

如果扩展对您来说是重量级的,您还可以在您的~/.hgrc:

[alias]
log = log --rev 'reverse(ancestors(.))'
rawlog = !$HG --config alias.log=log log "$@"

第二个别名 ( rawlog) 存在,因此您仍然可以访问原始log功能。

于 2016-03-02T18:56:52.947 回答
1

的别名功能hg是解决此问题的正确工具。虽然您可以创建别名来修改内置命令的默认行为,但hg config(section "alias") 有以下说明:

Note:
   It is possible to create aliases with the same names as existing
   commands, which will then override the original definitions. This is
   almost always a bad idea!

推荐的做法是创建一个别名alog并简单地训练您的手指输入hg alog而不是hg log. 将其放入~/.hgrc(或等效)中即可:

[alias]
alog = log --rev "reverse(ancestors(.))"

为什么这是一个更好的解决方案?不仅别名 for 会log阻止您访问原始行为(需要另一个别名来收回原始含义);更重要的是,一旦您开始期待非标准行为,当您输入hg log不受您的.hgrc. (在相同情况下键入hg alog只会导致“未知命令”错误)。

于 2016-03-03T10:50:21.983 回答