Atualmente, tento descobrir como lidar com algumas linhas especificamente sem atrapalhar o recuo do restante do buffer. Considere a seguinte função MyFunc
como 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
fonte