Como posso interpretar corretamente a variável $ # do M4 sem iniciar a sintaxe de comentário no emacs?

1

Eu tenho a seguinte definição de macro M4:

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

# começa um comentário na sintaxe M4, mas somente quando não é precedido por $ : $# é o número de argumentos recebidos pela macro.

Como posso alterar m4-font-lock-keywords para lidar com isso de maneira apropriada?

O valor padrão é:

(("\(\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))
    
por Sean Allred 13.10.2014 / 18:20

1 resposta

0

Na verdade, # também pode começar um comentário quando precedido por $ . Se # inicia um comentário ou não, depende se ele está dentro do texto citado ou não.

Você pode tentar o código abaixo para fazer o Emacs (tentar) seguir a semântica da m4 com mais precisão:

(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)))

Note que syntax-propertize-function só existe em versões suficientemente recentes do Emacs (> = 24.1, IIRC).

    
por 15.10.2014 / 17:15