模式行中的Subversion分支

时间:2014-08-14 19:29:56

标签: git svn emacs version-control modeline

如果文件位于由以trunkbranches/X结尾的Subversion回购支持的目录中,如何在模式中显示trunkX -line为SVN-trunkSVN-X,类似于Git支持的文件中显示的内容,通常为Git-master

2 个答案:

答案 0 :(得分:5)

确定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。

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

添加到模式行

然后,您可以在模式行中使用此功能,方法是将相应的模式行构造添加到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信息,并将其他所有内容保留为以前。

答案 1 :(得分: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..
    ))