Sangría personalizada para líneas específicas?

8

Actualmente trato de averiguar cómo puedo manejar algunas líneas específicamente sin estropear la sangría del resto del búfer. Considere la siguiente función MyFunccomo ejemplo:

void MyFunc()
{
  unsigned y = 0;

DONOTINDENT;

  unsigned int x = 5 + 2;
  return x + 12;
}

Aquí, quiero que la línea DONOTINDENT;tenga sangría en la columna 0, mientras que el resto de la función debe sangrarse normalmente. Traté de resolver esto usando la siguiente costumbre c-special-indent-hook:

(defun my-c-mode-indent-hook ()
  (let (p1 p2 myline)
    (setq p1 (line-beginning-position))
    (setq p2 (line-end-position))
    (setq myLine (buffer-substring-no-properties p1 p2))

    (if (string-match-p "DONOTINDENT" myLine)
        (save-excursion
          (indent-line-to 0))
      )
    )
  )

(defun my-c-mode-common-hook ()
  ;; my customizations for all of c-mode and related modes
  (setq c-special-indent-hook 'my-c-mode-indent-hook)
  )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

OK, esto funciona bastante bien para la línea DONOTINDENT;, sin embargo, no funciona para todas las líneas posteriores, ya que estas están sangradas en relación con DONOTINDENT;. Entonces, si DONOTINDENT;se sangra a la columna 0, unsigned int x = 5 + 2;también se sangrará a la columna 0, pero se debe sangrar a la columna c-basic-offset.

¿Cómo puedo arreglar la sangría para las siguientes líneas? ¿Hay alguna variable interna que pueda usar para influir en el cálculo del nivel de sangría de las líneas posteriores, o este cálculo se basa únicamente en la sangría anterior? Creo que debería ser posible lograr esto de alguna manera, ya que las etiquetas en las declaraciones de mayúsculas y minúsculas están sangradas de manera similar, pero luché por resolver esto al profundizar en el código del modo cc.

¡Gracias por adelantado!

Saludos cordiales, Fabian

Rosepeter
fuente

Respuestas:

0

Creo que es posible, dependiendo de la naturaleza de la línea DONOTINDENT.

Una regla personalizada cc-offsets-alist permite diferentes reglas de sangría dependiendo del elemento sintáctico a sangrar. Puede intentar combinar esto con los símbolos sintácticos correctos para sangrar líneas específicas como desee.

vxid
fuente