Como destacar o recuo do espaço anterior que não é arredondado para a largura atual?

7

Existe uma maneira de destacar (defina a cor do plano de fundo, por exemplo) o espaço antes de uma linha, quando o recuo não estiver alinhado com a largura atual do recuo?

Recuo de 4 espaços, por exemplo:

fn my_func() {
    if foo() {
        ##bar();
        blob();
    ###fez();
        baz();
    }
}

onde os #caracteres representam o plano de fundo mostrando uma cor diferente, volte até que o recuo esteja alinhado com 4.

Obviamente, isso só é útil quando o código segue convenções de recuo estritas.


Observe que estou ciente dos recursos avançados de indentação automática do emacs e dos plugins de realce de indentação, mas preferiria algo menos intrusivo que só aparece quando há um problema. Um pouco como destacar espaços à direita.

ideasman42
fonte
Isso não responde à sua pergunta, mas funções como c-indent-defuncorrigirão o recuo para você, o que pode alcançar o resultado desejado.
Tyler
@ Tyler, a questão é que você nem sempre é a única pessoa que escreve o código. A verificação de arquivos gravados por outras pessoas é um caso de uso bastante comum - e você nem sempre deseja reentrar o trabalho deles (correção de bugs ou alterações na revisão de código); portanto, é útil apenas ver o recuo ímpar.
ideasman42
Isso faz sentido. Apenas verificando - às vezes as pessoas perguntam como chegar a meio caminho de algo, sem perceber que o Emacs o levará até o objetivo. Mas seu caso de uso é razoável.
Tyler

Respostas:

3

Usando o bloqueio de fonte ...

(font-lock-add-keywords nil
  '(("^ \\{4\\}*\\( \\{1,3\\}\\)[^ ]" 1 'match)))
politza
fonte
Talvez seja bom usar em whitespace-trailingvez dematch
ideasman42
11
Modificado para ler a largura da guia atual (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))`
ideasman42 15/02
adicionou uma resposta um pouco expandida, fique à vontade para copiar dela.
ideasman42
3

Isso pode ser feito usando font-lock-add-keywords.

O exemplo abaixo mostra que você pode ativar seletivamente esse recurso em sua configuração - para diferentes formatos.

  • Observe que o recuo é lido tab-width.
  • Este exemplo usa whitespace-trailing, você pode querer usar matchou qualquer outra cor.

por exemplo:

;; highlight non-aligning indent offset
(defun highlight-indent-offset ()
 (font-lock-add-keywords
  nil
  `((,(lambda (limit)
        (re-search-forward
         (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))
         limit t))
     1 'whitespace-trailing))))

Então, esta função pode ser chamada para modos específicos: por exemplo,

(add-hook
 'rust-mode-hook
 (lambda ()
   (setq tab-width 4)
   (highlight-indent-offset)
   (setq indent-tabs-mode nil)))

Esta é uma pequena alteração na resposta do @ politza.

ideasman42
fonte
Por que não percorrer todo o caminho e torná-lo um modo menor.
politza
Eu nunca escrevi um modo menor antes, será necessário analisá-lo - que vantagens ele teria?
ideasman42
Um modo secundário pode ser desativado.
politza