Variabel yang dinyatakan warna

11

Saya mencari cara sederhana untuk membuat emacs mengingat variabel yang dideklarasikan dalam satu fungsi di C / C ++. Dengan "sederhana", maksud saya tanpa paket eksternal, hanya dengan beberapa baris elisp dalam file konfigurasi.

Konfigurasi default Emacs saya memengaruhi nama-nama variabel dengan warna kuning pada saat deklarasi, tetapi membiarkannya putih saat digunakan.

char toto; // 'char' is green, 'toto' is yellow

toto = 42; // 'toto' is white

Saya ingin membuat setiap "toto" dengan fungsi / lingkup yang sama berwarna kuning juga.

Saya sudah melihat pertanyaan ini tetapi saya ingin sesuatu yang lebih sederhana. Saya juga mencoba melakukan sesuatu dengan mode font-lock , tetapi saya tidak berhasil membuat sesuatu yang dapat disesuaikan dengan nama variabel.

Saya sudah punya ide untuk nama anggota kelas C ++ (menggunakan pola nama), jadi saya hanya ingin pencocokan variabel lokal di sini.

Aracthor
sumber
3
Ini mungkin lebih sulit daripada yang terlihat. nobugs.org/developer/parsingcpp
wasamasa
8
Mengapa Anda tidak ingin menggunakan paket apa pun? Jika ada paket yang menyediakan fitur ini, menginstalnya hampir pasti membutuhkan lebih sedikit elisp di konfigurasi Anda daripada membuat ulang fitur dari awal.
Tyler
11
Ini terdengar sangat mirip color-identifiers-modepaket . (Posting ini sebagai komentar karena Anda mengatakan Anda tidak ingin mempertimbangkan paket eksternal.)
Aaron Harris
7
Setiap "paket eksternal" juga dapat digambarkan sebagai "beberapa baris elisp dalam file konfigurasi". Menghindari kode yang sudah ada sebelumnya atas dasar bahwa seseorang telah menyediakannya dalam bentuk paket adalah tidak masuk akal.
phils
Versi Emacs apa yang Anda miliki?
DA Vincent

Jawaban:

1

Anda dapat mengumpulkan regexp untuk skema variabel Anda, sesuatu yang cocok (pseudo regexp code) [char|other|types] [a-z];dan [a-z] =*;dan menambahkannya ke daftar kata kunci font-lock untuk mode Anda; Dari manual di halaman Kustomisasi-Kata Kunci :

Misalnya, kode berikut menambahkan dua pola fontifikasi untuk mode C: satu untuk mengklasifikasikan kata 'FIXME', bahkan dalam komentar, dan yang lain untuk mengklasifikasikan kata 'dan', 'atau' dan 'tidak' sebagai kata kunci.

 (font-lock-add-keywords 'c-mode
  '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
    ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))

Contoh ini hanya memengaruhi mode C yang tepat. Untuk menambahkan pola yang sama ke mode C dan semua mode yang berasal darinya, lakukan ini sebagai gantinya:

 (add-hook 'c-mode-hook
  (lambda ()
   (font-lock-add-keywords nil
    '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
      ("\\<\\(and\\|or\\|not\\)\\>" .
       font-lock-keyword-face)))))
yPhil
sumber