emacsのc/c ++モードでは、#if 0…#endif block on endif blockのコードの顔を変更します。
-
13-10-2019 - |
質問
他のいくつかのコードエディターで見つかった機能をEMACS構成に追加しようとしています。これにより、#IF 0 ...#ENDIFブロックがコメントフェイス/フォントに自動的に設定されます。私のテストに基づいて、 CPP-Highlight-Mode 私が望むようなことをしますが、ユーザーアクションが必要です。 Font-Lock機能に縛り付けることは、動作を自動化するための正しいオプションであるように思われます。
GNUのドキュメントの例に従って、シングルラインの正規表現の顔を変更することに成功しました。例えば:
(add-hook 'c-mode-common-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\|TODO\\|HACK\\|fixme\\|todo\\|hack\\)" 1
font-lock-warning-face t)))))
ファイル内のどこでもデバッグ関連のキーワードを強調表示するために正常に動作します。ただし、#if 0 ...#endifがマルチラインの正規表現として一致するのに問題があります。この投稿でいくつかの有用な情報を見つけました(のような地域を構成する方法」u003C?php foo; bar; ?> 「)、それは、マルチラインマッチを可能にするために特にEMACSを通知する必要があることを示唆しました。しかし、このコード:
(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))))))
それでも私のためにはうまくいきません。おそらく私の正規表現は間違っています(ただし、使用しているように見えますが MX Re-Builder)、私は自分の構文を台無しにしたか、間違ったアプローチに完全に従っています。 OS X 10.6.5でAquamacs 2.1(GNU Emacs 23.2.50.1に基づいています)を使用しています。
どんな支援も感謝します!
解決
マルチラインの再gexpを機能させたとしても、ネストされた問題はまだあります #ifdef/#endif
最初にフォントロックを停止するので #endif
. 。このコードは機能しますが、大きなファイルに顕著なスローダウンがあるかどうかはわかりません。
(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)
編集:考慮する #else
編集#2:if/else/endifの任意のネストを処理するためのニフトリーコード