Git 模式行中的Subversion分支

Git 模式行中的Subversion分支,git,svn,emacs,version-control,modeline,Git,Svn,Emacs,Version Control,Modeline,如果文件位于Subversion repo支持的目录中,以trunk或branchs/X结尾,我如何使trunk或X在模式行中显示为SVN trunk或SVN-X,类似于Git支持的文件中通常显示为Git主机确定SVN状态 我不知道有什么内置的方法可以做到这一点,但您可以为此编写自己的代码 基于vc svn存储库名称和vc后端,您可以编写一个函数,返回svn的自定义模式文本,并返回所有其他vc系统的默认模式: (defun lunaryorn-vc-mode-line () (let ((b

如果文件位于Subversion repo支持的目录中,以
trunk
branchs/X
结尾,我如何使
trunk
X
在模式行中显示为
SVN trunk
SVN-X
,类似于Git支持的文件中通常显示为
Git主机

确定SVN状态 我不知道有什么内置的方法可以做到这一点,但您可以为此编写自己的代码

基于
vc svn存储库名称
vc后端
,您可以编写一个函数,返回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存储库hostname
的名称所迷惑,该函数实际上返回给定文件的完整repo URL

对于所有其他后端,或者如果URL与任何模式都不匹配,我们将返回默认的VC状态文本,如
VC模式中的

添加到模式行 然后,您可以在模式行中使用此功能,方法是将相应的模式行结构添加到
模式行格式

(setq-default mode-line-format
              '(…
                (vc-mode (" " (:eval (lunaryorn-vc-mode-line))))
                …))
由于
模式行格式
是缓冲区本地的,因此我们使用
setq default
来更改其全局值。我们的新模式行构造检查
vc模式
是否处于活动状态,即文件是否处于版本控制之下,并在本例中评估我们的函数,以获取自定义状态文本。有关模式线构造的详细信息,请参见


省略号代表模式行的其他内容,您也可以根据自己的喜好进行自定义。不过,我建议您只需复制
模式行格式的默认值
,并用我们的新构造替换
(vc模式vc模式)
。这将简单地用我们的自定义状态文本替换旧的VC信息,并保留所有其他内容。

您可以定义一个函数:

(defun vc-svn-mode-line-string (file)
  (format "SVN-%s" (vc-svn-current-branch-name file)))
当然,您还必须定义
vc svn当前分支名称
,因为该名称还不存在。我想它必须做一些类似的事情

(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模式vc模式)
替换为
(vc模式(“:eval(lunaryorn vc模式行)))
中的
模式行格式
?我不想在此软件包中硬编码我的模式行格式
svn mode line
。我觉得这太过分了。我觉得这可以做得更优雅一些。
vc模式行
的定义或它的一些子逻辑不应该以某种方式被覆盖吗?嗯,似乎
vc模式行
的定义缺乏一点灵活性,可以通过挂钩或函数变量来实现。@Nordlöw如果你想把它放在一个合适的包中并分发,你根本不应该碰
模式行格式
。软件包不应与用户自定义相冲突。相反,只需指导用户如何设置软件包。@Nordlöw好的,您还可以像Stefan建议的那样定义
vc svn mode line string
函数。VC模式将调用此函数以获取SVN的模式行字符串。这可能也比在每次模式行更新时重新评估VC状态更有效。@Nordlöw
(setcdr(assq'VC模式行格式)(任意)
。定义函数
VC svn模式行字符串在我的Emacs(git master)中无效。正在进行一些缓存,因此请确保在加载vc-svn.el之前定义它(例如,将其放入.emacs中,然后重新启动)。请尝试
(取消vc svn模式行字符串(文件)“测试”)
作为开始。