Emacs içindeki yorum sözdizimini başlatmadan M4'ün $ # değişkenini nasıl doğru bir şekilde yorumlayabilirim?


2

Aşağıdaki M4 makro tanımı var:

define(`printlist',`$1`'ifelse(`$#',1,,`printlist(shift($@))')')

#M4 sözdiziminde bir yorumu başlatır, ancak yalnızca a'dan önce gelmediğinde $: $#makronun aldığı argüman sayısıdır.

Bunu m4-font-lock-keywordsuygun şekilde ele almayı nasıl değiştirebilirim ?

Varsayılan değer:

(("\\(\\b\\(m4_\\)?dnl\\b\\|^\\#\\).*$" . font-lock-comment-face)
 ("\\$[*#@0-9]" . font-lock-variable-name-face)
 ("\\$\\@" . font-lock-variable-name-face)
 ("\\$\\*" . font-lock-variable-name-face)
 ("\\b\\(...\\)\\b" . font-lock-keyword-face))

Ben emacs lisp konusunda pek tecrübeli değilim, ama arkasından eşleme yapabilir misiniz? Düzenli ifadeler bu gibi şeyler yapabilir /(?<!\$)#/örneklerini maç için #bir olmadan $ondan önceki.
Ben Richards,

(modify-syntax-entry ?# "<\n" m4-mode-syntax-table)Yorumları vurgulamak için alternatif bir yöntem yorumlamak ve kullanmak isteyebilirsiniz - örneğin, m4-font-lock-keywordssözdizimi tablosunu kullanmak yerine değişkene bir yorum girişi eklemek .
kanun listesi

Bu ana modun kaynak kodunu görüntülemekle ilgilenebilecek forum katılımcıları için, aşağıdaki link muhtemelen asıl poster tarafından kullanılan ana mod kaynak kodunu içerir: opensource.apple.com/source/emacs/emacs- 70 / emacs / lisp / progmodes /…
kanun listesi

@lawlist Bu kısmi bir düzeltme: (modify-syntax-entry ?# "@" m4-mode-syntax-table)için doğru çalışacak /^#.*$/, ancak çalışmayacak /.*#.*$/(gerçek yorum sözdizimi söz konusu olduğunda).
Sean Allred

Yanıtlar:


1

Aslında, #ondan önce geldiğinde bir yoruma da başlayabilirsiniz $. İster #bir yorum başlatır veya değil alıntılanan metin içinde olup olmadığına bağlıdır.

Emacs'ın (m4) anlamını daha kesin olarak takip etmesini sağlamak için aşağıdaki kodu deneyebilirsiniz:

(defun m4--quoted-p (pos)
  "Return non-nil if POS is inside a quoted string."
  (let ((quoted nil))
    (dolist (o (nth 9 (save-excursion (syntax-ppss pos))))
      (if (eq (char-after o) ?\`) (setq quoted t)))
    quoted))

(defconst m4-syntax-propertize
  (syntax-propertize-rules
   ("#" (0 (when (m4--quoted-p (match-beginning 0))
             (string-to-syntax "."))))))

(add-hook 'm4-mode-hook
          (lambda () (set (make-local-variable 'syntax-propertize-function)
                          m4-syntax-propertize)))

syntax-propertize-functionYalnızca Emacs'in yeterince yeni sürümlerinde mevcut olduğuna dikkat edin (> = 24.1, IIRC).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.