Lekukan khusus untuk jalur tertentu?

8

Saat ini saya mencoba mencari tahu, bagaimana saya bisa menangani beberapa baris secara khusus tanpa mengacaukan lekukan sisa buffer. Pertimbangkan fungsi berikut MyFuncsebagai contoh:

void MyFunc()
{
  unsigned y = 0;

DONOTINDENT;

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

Di sini, saya ingin baris DONOTINDENT;diindentasikan ke kolom 0, sedangkan fungsi lainnya harus diindentasi secara normal. Saya mencoba menyelesaikan ini menggunakan kebiasaan berikut 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, ini berfungsi dengan baik untuk baris DONOTINDENT;, tetapi tidak bekerja untuk semua baris berikutnya, karena ini adalah indentasi relatif terhadap DONOTINDENT;. Jadi, jika DONOTINDENT;diindentasikan ke kolom 0, unsigned int x = 5 + 2;akan diindentasikan ke kolom 0 juga, tetapi harus diindentasi ke kolom c-basic-offset.

Bagaimana saya bisa memperbaiki lekukan untuk baris berikut? Apakah ada beberapa variabel internal yang dapat saya gunakan untuk memengaruhi perhitungan level indent dari baris berikutnya, atau apakah perhitungan ini murni berdasarkan pada indentasi sebelumnya. Saya pikir, itu mungkin bisa dilakukan entah bagaimana karena label dalam switch-case-statement diindentasikan dengan cara yang sama, tetapi saya kesulitan untuk mencari tahu ini ketika menggali ke dalam kode mode cc.

Terima kasih sebelumnya!

Salam, Fabian

Rosepeter
sumber

Jawaban:

0

Saya pikir itu mungkin, tergantung pada sifat garis DONOTINDENT.

Sebuah kebiasaan cc-offset-alist aturan memungkinkan aturan lekukan yang berbeda tergantung pada elemen sintaksis untuk indent. Anda dapat mencoba menggabungkan ini dengan simbol sintaksis yang benar untuk membuat indentasi baris tertentu sesuai keinginan.

vxid
sumber