Ändern Sie im C/C ++ - Modus in EMACs das Gesicht des Codes in #IF 0… #Endif -Block, um das Gesicht zu kommentieren

StackOverflow https://stackoverflow.com/questions/4549015

Frage

Ich versuche, meine EMACS -Konfiguration in einigen anderen Code -Editoren Funktionen hinzuzufügen, wobei C/C ++ - Code in #IF 0 ... #Endif -Blöcke automatisch auf das Kommentargesicht/die Schriftart oder die Schriftart eingestellt werden. Basierend auf meinen Tests, CPP-Highlight-Modus tut so etwas wie das, was ich will, erfordert aber Benutzeraktion. Es scheint, als wäre es die richtige Option, das Verhalten automatisch zu gestalten.

Ich habe Beispiele in der GNU-Dokumentation erfolgreich verfolgt, um das Gesicht von einzelnen regulären Ausdrücken zu ändern. Zum Beispiel:

(add-hook 'c-mode-common-hook
  (lambda ()
    (font-lock-add-keywords nil
      '(("\\<\\(FIXME\\|TODO\\|HACK\\|fixme\\|todo\\|hack\\)" 1 
        font-lock-warning-face t)))))

Funktioniert gut, um die Debugg -Keywords überall in einer Datei hervorzuheben. Ich habe jedoch Probleme, #IF 0 ... #endif als multiline reguläre Ausdruck zu entsprechen. Ich fand einige nützliche Informationen in diesem Beitrag (Wie man Region wie "wie" komponiert "u003C?php foo; bar; ?> "), das deutete darauf hin, dass EMACs speziell mitgeteilt werden müssen, um Multiline -Übereinstimmungen zu ermöglichen. Aber dieser Code:

(add-hook 'c-mode-common-hook
  (lambda ()
    '(progn
      (setq font-lock-multiline t)
      (font-lock-add-keywords nil
        '(("#if 0\\(.\\|\n\\)*?#endif" 1
          font-lock-comment-face t))))))

funktioniert immer noch nicht für mich. Vielleicht ist mein regulärer Ausdruck falsch (obwohl er mithilfe der Verwendung zu funktionieren scheint MX Re-Builder) Ich habe meine Syntax durcheinander gebracht oder verfolge den falschen Ansatz vollständig. Ich verwende Aquamacs 2.1 (das auf GNU EMACS 23.2.50.1 basiert) unter OS X 10.6.5, wenn dies einen Unterschied macht.

Jede Hilfe wäre geschätzt!

War es hilfreich?

Lösung

Auch wenn Sie den Multiline Regexp zur Arbeit haben, hätten Sie immer noch Probleme mit verschachtelten #ifdef/#endifDa es zum ersten Mal aufhören würde, die Schriftart zu sperren #endif. Dieser Code funktioniert, obwohl ich nicht sicher bin, ob es für große Dateien eine spürbare Verlangsamung gibt:

(defun my-c-mode-font-lock-if0 (limit)
  (save-restriction
    (widen)
    (save-excursion
      (goto-char (point-min))
      (let ((depth 0) str start start-depth)
        (while (re-search-forward "^\\s-*#\\s-*\\(if\\|else\\|endif\\)" limit 'move)
          (setq str (match-string 1))
          (if (string= str "if")
              (progn
                (setq depth (1+ depth))
                (when (and (null start) (looking-at "\\s-+0"))
                  (setq start (match-end 0)
                        start-depth depth)))
            (when (and start (= depth start-depth))
              (c-put-font-lock-face start (match-beginning 0) 'font-lock-comment-face)
              (setq start nil))
            (when (string= str "endif")
              (setq depth (1- depth)))))
        (when (and start (> depth 0))
          (c-put-font-lock-face start (point) 'font-lock-comment-face)))))
  nil)

(defun my-c-mode-common-hook ()
  (font-lock-add-keywords
   nil
   '((my-c-mode-font-lock-if0 (0 font-lock-comment-face prepend))) 'add-to-end))

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

BEARBEITEN:Berücksichtigen #else

Bearbeiten #2:Niftier -Code für willkürliche Verschachteln von if/else/endifs

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top