Mengapa mode utama tidak memeriksa wajah saja?

10

Saat menulis mode utama, sering kali berguna untuk mengetahui 'apakah ada gunanya?' 'Apakah poin dalam komentar?'.

Sebagian besar mode utama tampaknya mencoba menguraikan bahasa pemrograman. Sebagai contoh:

  • python-syntax-content panggilan syntax-ppss
  • haskell-fill-paragraphpanggilan syntax-ppssdanre-search-forward
  • c-in-comment-line-prefix-p bergerak menunjuk dan menelepon looking-at
  • sp-point-in-commentpanggilan syntax-ppsstetapi juga memeriksa apakah itu pada delimeter komentar

Namun, ini tidak berfungsi dalam beberapa kasus. Dalam buffer mode-org, komentar di blok sumber tidak terdeteksi dengan benar oleh pendekatan ini.

Tampaknya juga tidak ada gunanya, karena buffer sudah menunjukkan komentar yang disorot .

Sebagai gantinya, Anda cukup memeriksa wajah pada titik:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

Mengapa mode utama tidak melakukan ini? Buffer sudah diklasifikasi, jadi saya berharap ini lebih cepat, lebih kuat, dan membutuhkan lebih sedikit kode.

Wilfred Hughes
sumber
1
Saya suka pertanyaan ini. Namun, bagaimana jika Anda tidak menggunakannya font-lock-mode? (Bukannya saya pikir Anda harus.)
mbork

Jawaban:

12

Masalahnya adalah itu tidak lebih kuat.

Pertama, mode utama justru yang bertanggung jawab untuk memutuskan apa komentar atau string. Jika mereka berhasil mendefinisikannya untuk tujuan penguncian font, mereka harus dapat melakukan hal yang sama untuk tujuan lain.

Kedua, membaca sintaks untuk menentukan konteks yang ada di dalamnya adalah cara yang lebih kuat untuk melakukannya jika dilakukan dengan benar. Jika Anda telah menemukan contoh di mana itu gagal, ada baiknya mengirimkan laporan bug ke penulis mode utama.


Alasan mengapa memeriksa wajah kurang kuat adalah karena dapat gagal dalam beberapa situasi.

  1. Sebagai permulaan, pengguna bisa menonaktifkan font-lock-mode(mungkin itu adalah buffer besar), tetapi bahkan dengan font-lock-modediaktifkan, wajah agak tidak stabil.

  2. Selain itu, pengguna dapat memiliki mode minor yang menambahkan beberapa font-lock-keywords(seperti menyoroti TODOdalam komentar). Atau mungkin ada mode minor yang secara dinamis menerapkan beberapa wajah setelah font-lock mengklasifikasikan buffer.

Singkatnya, mode utama tidak memiliki jaminan bahwa wajah yang ditentukan olehnya adalah wajah yang saat ini diterapkan.

Malabarba
sumber
2

Saya kira alasan utamanya adalah karena penggunaan font-lock syntax-ppss.

Stefan
sumber