如果文件位于由 Subversion 存储库支持的目录中,trunk
或者branches/X
我如何使trunk
或X
在模式行中显示为SVN-trunk
或SVN-X
类似于 Git 支持的文件中显示的内容,通常为Git-master
.
2 回答
确定 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 信息,并让其他所有内容都像以前一样。
你可以定义一个函数:
(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..
))