Search code examples
gitsvnemacsversion-controlmodeline

Subversion Branch in Mode-Line


If a file lies in a directory backed by a Subversion repo ending with either trunk or branches/X how do I make the trunk or X show up in the mode-line as SVN-trunk or SVN-X similar to what is shown in Git-backed files typically as Git-master.


Solution

  • Determining SVN status

    I am not aware of any built-in way to do this, but you can write your own code for this purpose.

    Based on vc-svn-repository-name and vc-backend you can write a function that returns a custom mode text for SVN, and falls back to the default for all other VC systems:

    (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)))
    

    If the current file is under SVN, we check its repo URL according to your convention and compile a corresponding mode text. Don't be confused by the name of vc-svn-repository-hostname, the function actually returns the complete repo URL of the given file.

    For all other backends, or if the URL does not match any pattern, we fall back to the default VC status text as in vc-mode.

    Adding to the mode line

    You can then use this function in the mode line, by adding a corresponding mode line construct to mode-line-format:

    (setq-default mode-line-format
                  '(…
                    (vc-mode (" " (:eval (lunaryorn-vc-mode-line))))
                    …))
    

    Since mode-line-format is buffer-local, we use setq-default to change its global value. Our new mode line construct checks whether vc-mode is active, that is, whether the file is under version control, and evaluates our function in this case, to obtain our custom status text. See Mode Line Data for more information about mode line constructs.

    The ellipsis stand for the other content of the mode line, which you may also customize to your liking. I'd suggest, though, that you simply copy the default value of mode-line-format, and replace (vc-mode vc-mode) with our new construct. That will simply replace the old VC information with our custom status text, and leaves everything else as before.