【问题标题】:Subversion Branch in Mode-LineMode-Line 中的 Subversion 分支
【发布时间】:2014-08-14 19:29:56
【问题描述】:

如果文件位于由 Subversion 存储库支持的目录中,以 trunkbranches/X 结尾,我如何使 trunkX 在模式行中显示为 SVN-trunk 或 @ 987654326@ 类似于 Git 支持的文件中显示的内容,通常为 Git-master

【问题讨论】:

  • 我也没有得到反对票。 +1'ing 来解决这个问题。
  • 另一个赞成把事情做好。这是个好问题。

标签: git svn emacs version-control modeline


【解决方案1】:

确定 SVN 状态

我不知道有任何内置方法可以做到这一点,但您可以为此编写自己的代码。

基于vc-svn-repository-namevc-backend,您可以编写一个函数,为SVN 返回一个自定义模式文本,并回退到所有其他VC 系统的默认值:

(defun lunaryorn-vc-mode-line ()
  (let ((backend (vc-backend (buffer-file-name))))
    (if (eq backend 'SVN)
        (let ((url (vc-svn-repository-hostname (buffer-file-name))))
          (cond
           ((string-match-p "/trunk/" url) "SVN-trunk")
           ((string-match "/branches/\\([^/]+\\)/" url)
            (concat "SVN-" (match-string 1 url)))
           (t vc-mode)))
      ;; Use default mode text for other backends
      vc-mode)))

如果当前文件在 SVN 下,我们会根据您的约定检查其 repo URL 并编译相应的模式文本。不要被vc-svn-repository-hostname 的名字弄糊涂了,这个函数实际上是返回给定文件的完整repo URL。

对于所有其他后端,或者如果 URL 不匹配任何模式,我们将回退到默认的 VC 状态文本,如 vc-mode

添加到模式行

然后您可以在模式行中使用此函数,方法是将相应的模式行构造添加到mode-line-format

(setq-default mode-line-format
              '(…
                (vc-mode (" " (:eval (lunaryorn-vc-mode-line))))
                …))

由于mode-line-format 是本地缓冲区,我们使用setq-default 来更改其全局值。我们的新模式行构造检查vc-mode 是否处于活动状态,即文件是否处于版本控制之下,并在这种情况下评估我们的函数,以获得我们的自定义状态文本。有关模式线构造的更多信息,请参阅Mode Line Data

省略号代表模式行的其他内容,您也可以根据自己的喜好对其进行自定义。不过,我建议您只需复制默认值mode-line-format,并用我们的新结构替换(vc-mode vc-mode)。这将简单地用我们的自定义状态文本替换旧的 VC 信息,而其他一切都像以前一样。

【讨论】:

  • 绝妙的答案!只有一件事:我可以在mode-line-format 中以编程方式将(vc-mode vc-mode) 替换为(vc-mode (" " :eval (lunaryorn-vc-mode-line))) 吗?我不想在这个包svn-mode-line 中硬编码我的模式行格式。恕我直言,这太侵入性了。
  • 我觉得这可以做得更优雅。不应该以某种方式覆盖vc-mode-line 的定义或其某些子逻辑吗?嗯,vc-mode-line 的定义似乎缺少一点可以通过钩子或函数变量来实现的灵活性。
  • @Nordlöw 如果你想把它放在一个适当的包中并分发它,你根本不应该接触mode-line-format。包不应该与用户自定义混淆。相反,只需指导用户如何设置您的包。
  • @Nordlöw 好吧,您也可以像 Stefan 建议的那样定义 vc-svn-mode-line-string 函数。 VC Mode 将调用此函数来获取 SVN 的模式行字符串。这可能也比在每次模式行更新时重新评估 VC 状态更有效。
  • @Nordlöw (setcdr (assq 'vc-mode mode-line-format) (whatever-you-want).
【解决方案2】:

你可以定义一个函数:

(defun vc-svn-mode-line-string (file)
  (format "SVN-%s" (vc-svn-current-branch-name file)))

当然,您还必须定义vc-svn-current-branch-name,因为那个还不存在。我想它必须做类似的事情

(defun vc-svn-current-branch-name (file)
  (with-temp-buffer
    (setq default-directory (file-name-directory file))
    (vc-svn-command t t file "info")
    ...extract the branch name from the info in current buffer..
    ))

【讨论】:

  • 定义函数 vc-svn-mode-line-string 在我的 Emacs (git master) 中无效。
  • 正在进行一些缓存,因此请确保在加载 vc-svn.el 之前定义它(例如,将其放入 .emacs 中,然后重新启动)。尝试(defun vc-svn-mode-line-string (file) "TEST") 开始。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2011-04-24
  • 2011-05-28
  • 2010-12-18
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多