Rientro personalizzato per righe specifiche?


8

Attualmente provo a capire come posso gestire alcune righe in modo specifico senza incasinare il rientro del resto del buffer. Considera la seguente funzione MyFunccome esempio:

void MyFunc()
{
  unsigned y = 0;

DONOTINDENT;

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

Qui, voglio che la riga DONOTINDENT;sia rientrata nella colonna 0, mentre il resto della funzione dovrebbe essere rientrato normalmente. Ho provato a risolverlo usando la seguente personalizzazione 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, questo funziona abbastanza bene per la linea DONOTINDENT;, tuttavia non funziona per tutte le linee successive, poiché sono rientrate rispetto a DONOTINDENT;. Quindi, se DONOTINDENT;è rientrato nella colonna 0, unsigned int x = 5 + 2;sarà rientrato anche nella colonna 0, ma dovrebbe essere rientrato nella colonna c-basic-offset.

Come posso correggere il rientro per le seguenti righe? C'è qualche variabile interna che posso usare per influenzare il calcolo del livello di rientro delle righe successive, o questo calcolo è basato esclusivamente sul rientro precedente. Penso che dovrebbe essere possibile in qualche modo realizzare questo dato che le etichette nelle dichiarazioni di caso-caso sono rientrate in un modo simile, ma ho faticato a capirlo quando scavavo nel codice cc-mode.

Grazie in anticipo!

Cordiali saluti, Fabian

Risposte:


0

Penso che sia possibile, a seconda della natura della linea DONOTINDENT.

Una regola di cc-offset-alist personalizzata consente regole di rientro diverse a seconda dell'elemento sintattico da indentare. Potresti provare a combinare questo con i simboli sintattici corretti per indentare righe specifiche come desideri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.