4

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

4

2 回答 2

5

确定 SVN 状态

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

基于vc-svn-repository-name并且vc-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-format,并替换(vc-mode vc-mode)为我们的新构造。这将简单地用我们的自定义状态文本替换旧的 VC 信息,并让其他所有内容都像以前一样。

于 2014-08-14T21:14:21.850 回答
3

你可以定义一个函数:

(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..
    ))
于 2014-08-14T21:32:06.393 回答