Git 模式行中的Subversion分支
如果文件位于Subversion repo支持的目录中,以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
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模式行字符串(文件)“测试”)
作为开始。