Recuo personalizado para linhas específicas?


8

Atualmente, tento descobrir como lidar com algumas linhas especificamente sem atrapalhar o recuo do restante do buffer. Considere a seguinte função MyFunccomo um exemplo:

void MyFunc()
{
  unsigned y = 0;

DONOTINDENT;

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

Aqui, quero que a linha DONOTINDENT;seja recuada para a coluna 0, enquanto o restante da função deve ser recuado normalmente. Tentei resolver isso usando o seguinte costume 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, isso funciona muito bem para a linha DONOTINDENT;, no entanto, não funciona para todas as linhas subseqüentes, pois elas são recuadas em relação a DONOTINDENT;. Portanto, se DONOTINDENT;for recuado para a coluna 0, unsigned int x = 5 + 2;também será recuado para a coluna 0, mas deve ser recuado para a coluna c-basic-offset.

Como posso corrigir o recuo para as seguintes linhas? Existe alguma variável interna que eu possa usar para influenciar o cálculo do nível de recuo das linhas subseqüentes ou esse cálculo é puramente baseado no recuo anterior. Acho que deveria ser possível, de alguma forma, fazer isso, pois os rótulos nas instruções de caso de troca são recuados de maneira semelhante, mas lutei para descobrir isso ao pesquisar no código do modo cc.

Desde já, obrigado!

Atenciosamente, Fabian

Respostas:


0

Eu acho que é possível, dependendo da natureza da linha DONOTINDENT.

Uma regra personalizada cc-offsets-alist permite regras de indentação diferentes, dependendo do elemento sintático a ser indentado. Você pode tentar combinar isso com os símbolos sintáticos corretos para recuar linhas específicas conforme desejar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.