Emacsでxhtmlとhtml5のflymakeをトグル

xhtml5_xhtml

私はhtml-modeでhtml5とxhtmlを両方扱います。その度にinit.elいじるのも面倒なのでマイナーモードを使って振り分けてみました。

XHTMLはこちらを参考にしました。 Flymake Html : emacswiki

HTML5はこちらを参考にpyファイルを入手し、パーミッションと内容を変更します。
Emacs の Flymake で HTML5 の構文チェックを「Validator.nu (X)HTML5 Validator」使ってやってみるメモAdd Star : 牌語備忘録 - pygo

tidyおよび上記リンクのhtml5check.pyはEmacsの環境変数PATHの通ったフォルダに置きましょう。(getenv "PATH")を評価すれば分かるかも。

Switch flymake between html5 and xhtml

;; htmlファイルで html5 xhtml をトグルするための準備
(setq xhtml-err-line-patterns '("line \([0-9]+\) column \([0-9]+\) - \(Warning\|Error\): \(.*\)" nil 1 2 4))
(setq xhtml-allowed-file-name-masks '("\.html$\|\.ctp" flymake-html-init))
(setq html5-err-line-patterns '("\(Warning:.*?\|Error:.*?\)From line ?\([0-9]+\)+,.*?column ?\([0-9]+\).*?$" nil 2 3 1))
(setq html5-allowed-file-name-masks '("\.html$\|\.ctp" flymake-html5-init))
 
;; flymake-xhtml-modeを定義
(define-minor-mode flymake-xhtml-mode
  "XHTML Validation"
  :lighter " XHTML"
  (defun flymake-html-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "tidy" (list local-file))))
  ;; html5用の設定があったら削除
  (setq flymake-allowed-file-name-masks (delete html5-allowed-file-name-masks flymake-allowed-file-name-masks))
  (add-to-list 'flymake-allowed-file-name-masks
               xhtml-allowed-file-name-masks)
  ;; html5用の設定があったら削除
  (setq flymake-err-line-patterns (delete html5-err-line-patterns flymake-err-line-patterns))
  (add-to-list 'flymake-err-line-patterns
               xhtml-err-line-patterns)
  ;; flymake-html5-modeを停止
  (setq flymake-html5-mode nil)
  (flymake-mode t))
 
 
;; flymake-html5-modeを定義
(define-minor-mode flymake-html5-mode
  "HTML5 Validation"
  :lighter " HTML5"
  (defun flymake-html5-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "html5check.py" (list "" local-file))))
  ;; xhtml用の設定があったら削除
  (setq flymake-allowed-file-name-masks (delete xhtml-allowed-file-name-masks flymake-allowed-file-name-masks))
  (add-to-list 'flymake-allowed-file-name-masks
               html5-allowed-file-name-masks)
  ;; xhtml用の設定があったら削除
  (setq flymake-err-line-patterns (delete xhtml-err-line-patterns flymake-err-line-patterns))
  (add-to-list 'flymake-err-line-patterns
               html5-err-line-patterns)
  ;; flymake-xhtml-modeを停止
  (setq flymake-xhtml-mode nil)
  (flymake-mode t))

htmlファイルを開いて、
M-x flymake-xhtml-mode
または
M-x flymake-html5-mode
でそれぞれの構文チェックを選択できます。切り替えも可能。とりあえず問題なし。