Passen Sie das Erscheinungsbild des VC-Modus in der Moduszeile an

7

Ich verwende vc-mode, um Informationen über den aktuellen VC-Status in meiner Moduszeile wie folgt anzuzeigen:

(setq mode-line-format '(… (vc-mode vc-mode) …))

Allerdings finde ich das Standardformat vc-modeziemlich ausführlich. Insbesondere enthält es den Namen des aktuellen VC-Backends, was für mich nicht besonders interessant ist. Normalerweise weiß ich, als welches VCS der aktuelle Puffer verwendet wird, und ich verwende sowieso kein anderes VCS als Git.

Wie kann ich das Erscheinungsbild von anpassen vc-mode? Im Idealfall würde ich den Namen des Backends ausblenden und nur den Namen des aktuellen Zweigs (oder wahrscheinlich etwas Ähnliches git describe) anzeigen .

vc-modeKann ich alternativ, wenn es nicht angepasst werden kann, den aktuellen Filialnamen von VC zur Verwendung in einem benutzerdefinierten (:eval …)Konstrukt erhalten?


quelle

Antworten:

5

Wie kann ich das Erscheinungsbild von anpassen vc-mode? Im Idealfall würde ich den Namen des Backends ausblenden und nur den Namen des aktuellen Zweigs anzeigen.

Das ist ziemlich genau das, was Smart-Mode-Line macht. Sie können es versuchen oder einfach den Rat kopieren, den es verwendet:

(defadvice vc-mode-line (after strip-backend () activate)
  (when (stringp vc-mode)
    (let ((noback (replace-regexp-in-string 
                   (format "^ %s" (vc-backend buffer-file-name))
                   " " vc-mode)))
      (setq vc-mode noback))))

Beachten Sie, dass dies eine optimierte Version davon ist. Den vollständigen Code für die Beratung finden Sie hier , der je nach Status der Filiale auch unterschiedliche Gesichter anwendet.


Als Alternative gibt es hier eine noch optimierte Version, die keinen Rat verwendet.

(setcdr (assq 'vc-mode mode-line-format)
        '((:eval (replace-regexp-in-string "^ Git" " " vc-mode))))
Malabarba
quelle
Das würde funktionieren - obwohl ich lieber ein :evalKonstrukt anstelle eines Ratschlags verwenden würde -, aber es ist nicht genau das, was ich als "Anpassen" bezeichnen würde. Es ist ein schmutziger Hack, nicht wahr? Ich würde treacly einen saubereren Weg bevorzugen…
1
@lunaryorn Ja, es ist ein Hack. vc-modeist in diesem Aspekt nicht sehr anpassbar (das kann ich sagen). Ich würde auch einen saubereren Weg bevorzugen. :-)
Malabarba
2
@lunaryorn Ich habe die Antwort bearbeitet, um das :evalKonstrukt zu verwenden.
Malabarba
3

Ich war auch mit dem Standardverhalten nicht zufrieden. Ich konnte die VC-Info-Zeichen niemals gerade halten - ":" für bearbeitet, "@" für hinzugefügt usw. Sie können meine Methode verwenden.

Ich habe mehrere benutzerdefinierte Gesichter definiert, um die Status in verschiedenen Farben anzuzeigen. Dann habe ich eine Funktion geschrieben, um die Standard-VC-Informationen in eine Zeichenfolge zu übersetzen, die in die Moduszeile eingefügt werden soll. Dann habe ich :evalmeiner Liniendefinition eine Linie hinzugefügt , um sie anzuzeigen.

;; Gesichter definieren.

(defface my / mode: vc-hinzugefügt
  `(
     (((Klassenfarbe))
        (: Hintergrund "# FFAA55": Vordergrund "schwarz"))
     (t
        (: Gewicht fett: unterstreichen t))
   )
  "VC-Status-Tag-Gesicht für Dateien, die gerade hinzugefügt wurden
Versionskontrolle."
  : Gruppe 'MY / mode)

(defface my / mode: vc-bearbeitet
  `(
     (((Klassenfarbe))
        (: Hintergrund "# F05B80": Vordergrund "schwarz")); "# F04040" vielleicht?
     (t
        (: Gewicht fett: unterstreichen t))
   )
  "VC-Status-Tag-Gesicht für Dateien, die der Versionskontrolle unterliegen
aber die wurden bearbeitet. "
  : Gruppe 'MY / mode)

(defface my / mode: vc-in-sync
  `(
     (((Klassenfarbe))
        (: Hintergrund "# 60CC60": Vordergrund "schwarz"))
     (t
        (: Gewicht fett: unterstreichen t))
   )
  "VC-Status-Tag-Gesicht für Dateien, die der Versionskontrolle unterliegen
und die mit dem Respository synchronisiert sind. "
  : Gruppe 'MY / mode)

(defface my / mode: vc-none
  `(
     (((Klassenfarbe))
        (: Hintergrund "# 70A0D0": Vordergrund "schwarz"))
     (t
        (: Gewicht fett: unterstreichen t))
   )
  "VC-Status-Tag-Gesicht für Dateien, die nicht unter der Version sind
Steuerung"
  : Gruppe 'MY / mode)

(defface my / mode: vc-unknown
  `(
     (((Klassenfarbe))
        (: Hintergrund "# FF0000": Vordergrund "weiß"))
     (t
        (: Gewicht fett: unterstreichen t))
   )
  "VC-Status-Tag-Gesicht für Dateien, deren Versionskontrollstatus
nicht ermittelbar."
  : Gruppe 'MY / mode)

(defvar my-vc-mode-attrs
  '(("". ("NoVC" my / mode: vc-none))
    ("-". ("VC =" my / mode: vc-in-sync))
    (":". ("VC>" my / mode: vc-bearbeitet))
    ("@". ("VC +" my / mode: vc-hinzugefügt))
    ("?". ("? VC?" My / mode: vc-unknown))
    )
  "Nachschlagetabelle zum Übersetzen des VC-Modus-Zeichens in eine andere Zeichenfolge / Fläche."
)


;; Diese Funktion hilft mir, den Versionskontrollstatus zu verstehen.
(defun my-mode-line-vc-info ()
  "Versionskontrollstatusinformationen über die Datei in zurückgeben
der aktuelle Puffer als fontified String.

Die Moduszeilenvariable "vc-mode" ist null, wenn sich die Datei nicht unter befindet
Versionskontrolle und zeigt einen Bindestrich oder einen Doppelpunkt an, je nachdem, ob
Die Datei wurde seit dem Einchecken geändert. Ich kann die nie behalten
Gerade.

Diese Funktion gibt "NoVC" zurück, wenn die Datei nicht unter der Version ist 
Steuerung. Es wird eine Zeichenfolge mit einem = -Zeichen angezeigt, wenn die Datei synchronisiert ist
mit seiner Versionskontrolle und einer Zeichenfolge mit einem> -Zeichen, wenn die Datei hat
wurde seit dem letzten Check-in geändert. "
  (let * ((Klasse
          (cond
           ;; Wenn nicht unter Versionskontrolle
           ((nicht VC-Modus)
            "")

           ;; Wenn unter Versionskontrolle das Zeichen -: @ dekodiert wird
           ((String-Match "\\`? \\ (?: CVS \\ | Git \\) \\ ([-: @] \\) \\ ([^^: ~ \ x00- \ x1F \\\ \ /] + \\)? "vc-mode)
            (Match-String-No-Properties 1 VC-Modus))

           ;; Andernfalls weisen Sie auf Verwirrung hin
           (t
            "?")
           ))

         (Ast
          (if (jede Klasse '("-" ":" "@"))
              (concat "" (match-string-no-properties 2 vc-mode))
            "")))

         ;; Ruft die Eigenschaftenliste für das Klassenzeichen oben ab
         (Requisiten (cdr (Assoc-Klasse my-vc-mode-attrs)))
         )

    (concat (Eigentum (Auto Requisiten) Gesicht (Cadr Requisiten))
            Ast)))

(set-default 'mode-line-format
   '((
     ...
        (: eval (my-mode-line-vc-info))
     ...))
Sue D. Nymme
quelle
Vielen Dank. Dies sieht aus wie etwas, das ich wirklich in meine eigene Konfiguration kopieren muss :)
Wo kann ich die Funktion bekommen any?
MonLau