¿Cómo resaltar la sangría de espacio anterior que no se redondea al ancho actual?

7

¿Hay alguna manera de resaltar (establecer el color de fondo, por ejemplo) el espacio antes de una línea, cuando su sangría no está alineada con el ancho de sangría actual?

Sangría de 4 espacios para, por ejemplo:

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

donde los #caracteres representan el fondo que muestra un color diferente, hasta que la sangría se alinea a 4.

Por supuesto, esto solo es útil cuando el código sigue estrictas convenciones de sangría.


Tenga en cuenta que estoy al tanto de las funciones avanzadas de sangría automática de emacs y los complementos de resaltado de sangría, pero preferiría algo menos intrusivo que solo aparece cuando hay un problema. Un poco como resaltar los espacios finales.

ideasman42
fuente
Esto no responde a su pregunta, pero funciona como c-indent-defuncorregirá la sangría para usted, lo que podría lograr el resultado deseado.
Tyler
@Tyler, el problema es que no siempre eres la única persona que escribe el código. Revisar archivos escritos por otros es un caso de uso bastante común, y no siempre desea volver a sangrar su trabajo (corrección de errores o cambios para la revisión de código), por lo que solo es útil ver una sangría impar.
ideasman42
Eso tiene sentido. Solo verificando: a veces las personas preguntan cómo llegar a la mitad de algo, sin darse cuenta de que Emacs lo llevará hasta la meta. Pero su caso de uso es razonable.
Tyler

Respuestas:

3

Usando el bloqueo de fuente ...

(font-lock-add-keywords nil
  '(("^ \\{4\\}*\\( \\{1,3\\}\\)[^ ]" 1 'match)))
politza
fuente
Tal vez agradable de usar en whitespace-trailinglugar dematch
ideasman42
1
Modificado para leer el ancho de pestaña actual (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))`
ideasman42
agregó una respuesta ligeramente expandida, no dude en copiarla.
ideasman42
3

Esto se puede hacer usando font-lock-add-keywords.

El siguiente ejemplo muestra que puede habilitar selectivamente esta función en su configuración, para diferentes formatos.

  • Tenga en cuenta que se lee la sangría tab-width.
  • Este ejemplo usa whitespace-trailing, es posible que desee usar matcho cualquier otro color.

p.ej:

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

Entonces esta función se puede llamar para modos específicos: por ejemplo,

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

Este es un cambio menor a la respuesta de @ politza.

ideasman42
fuente
¿Por qué no ir hasta el final y convertirlo en un modo menor?
politza
Nunca he escrito un modo menor antes, tendré que investigarlo, ¿qué ventajas tendría?
ideasman42
Un modo menor puede ser deshabilitado.
politza