Pertanyaan Emacs cc-mode indentation problem dengan kelas C ++ 0x enum


Emacs cc-mode tampaknya belum mengenali tipe-aman enum class diperkenalkan pada C ++ 0x. Hasil yang saya dapatkan adalah indentasi ganda untuk enums kedua, ketiga, dll:

enum class Color {
    Blue,
        Red,
        Orange,
        Green
        };

Apa yang saya inginkan adalah:

enum class Color {
    Blue,
    Red,
    Orange,
    Green
};

Bisakah Anda merekomendasikan perintah yang bagus untuk ditambahkan .emacs yang akan membuat memperlakukan cc-mode enum class cara yang sama seperti memperlakukan yang lama enum?


32
2018-06-27 18:40


asal


Jawaban:


Ini masalahnya:

cc-mode bergantung pada asumsi bahwa kata kunci adalah kata tunggal. Menambahkan dukungan untuk enum_class dari pada enum class hanya akan menjadi masalah mengubah beberapa regexps.

Sebaliknya Emacs memperlakukan ini sebagai sebuah kelas. Cara yang tepat untuk memecahkan ini adalah mengajar Emac bahwa ini adalah enum. Tapi itu di luar lingkup jawaban.

Ini adalah peretasan:

Jadi kita akan memodifikasi lekukan yang ada untuk berperilaku berbeda dalam kasus yang satu ini. (Kode tersedia untuk mengutak-atik ini inti.)

(Defun di dalam kelas-enum-p (pos)
  "Periksa apakah POS ada di dalam kurung kurung huruf C ++ \" enum class \ "."
  (abaikan-kesalahan
    (save-excursion
      (goto-char pos)
      (daftar-up -1)
      (mundur-sexp 1)
      (lihat kembali "enum [\ t] + kelas [\ t] + [^}] +"))))

(defun align-enum-class (langelem)
  (jika (di dalam kelas-enum-p (c-langelem-pos langelem))
      0
    (c-lineup-paling-intro-cont langelem)))

(defun align-enum-class-closing-brace (langelem)
  (jika (di dalam kelas-enum-p (c-langelem-pos langelem))
      '-
    '+))

(defun fix-enum-class ()
  "Setup` c ++ - mode 'untuk menangani \ "kelas enum \". "
  (tambahkan-ke-daftar 'c-offsets-alist' (paling-intro-cont. align-enum-class))
  (tambahkan ke daftar 'c-offsets-alist
               '(pernyataan-cont. align-enum-class-closing-brace)))

(add-hook 'c ++ - mode-hook' fix-enum-class)

Ini tidak terlalu diuji. ;)

Bagaimana itu bekerja:

c-offsets-alist menentukan indentasi untuk posisi yang berbeda di pohon sintaks. Ini dapat diberikan konstanta atau fungsi.

Kedua fungsi ini mencari tahu apakah posisi saat ini dalam itu enum class {...}. Jika itu yang terjadi, mereka mengembalikan 0 atau '-, yang diinterpretasikan oleh cc-mode sebagai kedalaman indentasi. Jika tidak, mereka mengembalikan nilai default.

inside-class-enum-p hanya bergerak ke penjepit sebelumnya dan memeriksa apakah teks sebelumnya adalah "enum class".


26
2017-07-01 16:02