Personalizar a aparência do modo vc na linha de modo

7

Eu uso vc-modepara mostrar informações sobre o estado atual do VC na minha linha de modo, assim:

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

No entanto, acho o formato padrão de vc-modebastante detalhado. Notavelmente, inclui o nome do back-end do VC atual, o que não é particularmente interessante para mim - geralmente sei em que VCS o buffer atual está e realmente não uso nenhum VCS além do Git.

Como posso personalizar a aparência de vc-mode? Idealmente, ocultaria o nome do back-end e mostraria apenas o nome da ramificação atual (ou provavelmente algo semelhante a git describe).

Como alternativa, se vc-modenão puder ser personalizado, posso obter o nome da filial atual do VC, para uso em uma (:eval …)construção personalizada ?


fonte

Respostas:

5

Como posso personalizar a aparência de vc-mode? Idealmente, ocultaria o nome do back-end e mostraria apenas o nome da ramificação atual.

Isso é basicamente o que a linha de modo inteligente faz. Você pode experimentá-lo ou apenas copiar os conselhos que ele usa:

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

Observe que esta é uma versão simplificada. Você pode encontrar o código completo para o conselho aqui , que também aplica faces diferentes, dependendo do estado da ramificação.


Como alternativa, aqui está uma versão ainda mais simplificada que não usa conselhos.

(setcdr (assq 'vc-mode mode-line-format)
        '((:eval (replace-regexp-in-string "^ Git" " " vc-mode))))
Malabarba
fonte
Isso funcionaria - embora eu prefira usar uma :evalconstrução em vez de um conselho - mas não é exatamente o que eu chamaria de "personalização". É um truque sujo, não é? Eu preferiria, de maneira treacly, uma maneira mais limpa ...
11
@ lunaryorn Sim, é um hack. vc-modenão é altamente personalizável nesse aspecto (que eu posso dizer). Eu preferiria uma maneira mais limpa também. :-)
Malabarba
2
@ lunaryorn Eu editei a resposta para usar a :evalconstrução.
Malabarba
3

Também não estava feliz com o comportamento padrão. Eu nunca consegui manter os caracteres de informação vc corretos - ":" para edição, "@" para adição, etc. Você pode usar o meu método.

Eu defini várias faces personalizadas para exibir os status em várias cores. Então eu escrevi uma função para traduzir as informações padrão de vc em uma string para inserir na linha de modo. Em seguida, adicionei uma :evallinha na minha definição de linha de modo para mostrá-la.

;; Definir rostos.

(defface my / mode: vc-added
  `(
     (((cor da classe))
        (: plano de fundo "# FFAA55": primeiro plano "preto"))
     (t
        (: peso em negrito: sublinhado t))
   )
  "Etiqueta de status do VC para arquivos que foram adicionados a
controle de versão."
  : grupo 'MY / mode)

(defface my / mode: vc-editado
  `(
     (((cor da classe))
        (: plano de fundo "# F05B80": primeiro plano "preto")); "# F04040" talvez?
     (t
        (: peso em negrito: sublinhado t))
   )
  "Etiqueta de status do VC para arquivos que estão sob controle de versão
mas que foram editados ".
  : grupo 'MY / mode)

(defface my / mode: vc-in-sync
  `(
     (((cor da classe))
        (: plano de fundo "# 60CC60": primeiro plano "preto"))
     (t
        (: peso em negrito: sublinhado t))
   )
  "Etiqueta de status do VC para arquivos que estão sob controle de versão
e que estão sincronizados com o repositório ".
  : grupo 'MY / mode)

(defface my / mode: vc-none
  `(
     (((cor da classe))
        (: plano de fundo "# 70A0D0": primeiro plano "preto"))
     (t
        (: peso em negrito: sublinhado t))
   )
  "Etiqueta de status do VC para arquivos que não estão na versão
ao controle"
  : grupo 'MY / mode)

(defface my / mode: vc-unknown
  `(
     (((cor da classe))
        (: plano de fundo "# FF0000": primeiro plano "branco"))
     (t
        (: peso em negrito: sublinhado t))
   )
  "Etiqueta de status de VC para arquivos cujo status de controle de versão
Não pode ser determinado."
  : grupo 'MY / mode)

(defvar my-vc-mode-attrs
  '(("". ("NoVC" meu / modo: vc-nenhum)))
    ("-". ("VC =" meu / modo: vc-em-sincronização))
    (":". ("VC>" meu / modo: editado por vc))
    ("@". ("VC +" meu / modo: vc adicionado))
    ("?". ("? VC?" Meu / modo: vc-desconhecido))
    )
  "Tabela de pesquisa para traduzir o caractere do modo vc em outra string / face."
)


;; Essa função me ajuda a entender o status do controle de versão.
(desafiar minha-modo-linha-vc-info ()
  "Retornar informações de status de controle de versão sobre o arquivo em
o buffer atual, como uma string com fonte.

A variável da linha de modo `vc-mode 'é nula se o arquivo não estiver em
controle de versão e exibe um hífen ou dois pontos, dependendo se
o arquivo foi modificado desde o check-in. Eu nunca posso manter aqueles
direto.

Esta função retorna \ "NoVC \" se o arquivo não estiver na versão 
ao controle. Ele exibe uma sequência com um sinal = se o arquivo estiver sincronizado
com seu controle de versão e uma string com um sinal> se o arquivo tiver
foi modificado desde o último check-in ".
  (deixe * ((classe
          (cond
           ;; Se não estiver sob controle de versão
           ((não no modo vc)
            "")

           ;; Se sob controle de versão decodificar o caractere -: @
           ((correspondência de string "\\`? \\ (?: CVS \\ | Git \\) \\ ([-: @] \\) \\ ([^^: ~ \ x00- \ x1F \\\ \ /] + \\)? "modo vc)
            (match-string-no-properties 1 vc-mode))

           ;; Caso contrário, indique confusão
           (t
            "?")
           )))

         (ramo
          (if (qualquer classe '("-" ":" "@"))
              (concat "" (combinar-sequência-sem-propriedades 2 modo vc))
            ""))

         ;; Buscar lista de propriedades para o caractere de classe acima
         (props (cdr (classe assoc my-vc-mode-attrs))))
         )

    (concat (propertize (adereços de carro) 'face (adereços cadr))
            ramo)))

(definir padrão "formato de linha de modo
   '(
     ...
        (: eval (meu-modo-linha-vc-info))
     ...))
Sue D. Nymme
fonte
Obrigado. Isto se parece com algo que eu realmente precisa copiar em minha própria configuração :)
onde posso obter a função any?
MonLau