Emacs Flycheck
Table of Contents
概要
Flycheckは、on-the-flyで(その場で)書式チェックを行うものである。
インストール
- Emacs Package(package.el) を使用し、flycheck をインストールする。
基本設定
(when (locate-library "flycheck") (require 'flycheck) (global-flycheck-mode) )
使い方
- flycheck-list-errors (C-c ! l)
- 指摘のリストを別ウィンドウに表示する
- flycheck-compile (C-c ! C-c)
- チェッカーを実行する
flycheck-compileは、チェッカーの定義をデバッグするときに役に立つ
チェッカーの定義
MSYS2 の gcc を使う設定
"my-gcc"というチェッカーを定義し、c-mode でこのチェッカーを使うようにする。
(flycheck-define-checker my-gcc "A C checker using gcc." :command ("gcc" "-c" "-I../../inc" "-I." "-Ic:/msys64/mingw32/i686-w64-mingw32/include""-O1" "-Wall" source "-o" temporary-file-name) :error-patterns ((error line-start (file-name) ":" line ":" column ":" " Error: " (message) line-end) (error line-start (file-name) ":" line ":" column ":" " Fatal Error: " (message) line-end) (warning line-start (file-name) ":" line ":" column ":" " Warning: " (message) line-end)) :modes (c-mode c++-mode)) (add-hook 'c-mode-common-hook '(lambda() (flycheck-select-checker 'my-gcc)))
flycheck-define-checker の記述方法
入力指定
普通は "soruce" を指定すればよいが、コンパイルが実行されるディレクトリがソースと同じである必要がある場合は source-inplace を指定する。
:command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source-inplace "-o" null-device)
出力指定
下記の記述だと、コンパイルが実行されるので、同じディレクトリにオブジェクトファイル(.o) が生成される。
実際のコンパイラやコンパイルオプションが異なる場合は、実際のビルドでエラーになることがあるので、オブジェクトファイルが生成されない方が望ましい。
:command ("gcc" "-c" "-Iinc" "-I../../inc" "-O1" "-Wall" source)
下記の記述だと、Windowsで、gcc によっては、同じディレクトリに "NUL" というファイルが生成されることがある。
:command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source "-o" null-device)
その場合、下記のように temporary-file-name を指定すると回避できる
:command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source "-o" temporary-file-name)
define-fringe-bitmap
デフォルトの表示
エラーの時
!マークが付く
警告の時
?マークが付く
エラーと警告が両方出ている場合
カスタマイズ例
エラーの時
×マークとする
警告の時
◆マークとする
エラーと警告が両方出ている場合
設定方法
(when (fboundp 'define-fringe-bitmap) (define-fringe-bitmap 'my-flycheck-fringe-indicator (vector #b00000000 #b00000000 #b00000000 #b00000000 #b00000000 #b00001000 #b00011100 #b00111110 #b01111111 #b00111110 #b00011100 #b00001000 #b00000000 #b00000000 #b00000000 #b00000000 #b00000000)) ) (define-fringe-bitmap 'my-flycheck-fringe-indicator2 (vector #b00000000 #b00000000 #b00000000 #b00000000 #b01000001 #b01100011 #b00110110 #b00011100 #b00011100 #b00011100 #b00110110 #b01100011 #b01000001 #b00000000 #b00000000 #b00000000 #b00000000)) (flycheck-define-error-level 'error :overlay-category 'flycheck-error-overlay :fringe-bitmap 'my-flycheck-fringe-indicator2 :fringe-face 'flycheck-fringe-error) (flycheck-define-error-level 'warning :overlay-category 'flycheck-warning-overlay :fringe-bitmap 'my-flycheck-fringe-indicator :fringe-face 'flycheck-fringe-warning) (flycheck-define-error-level 'info :overlay-category 'flycheck-info-overlay :fringe-bitmap 'my-flycheck-fringe-indicator :fringe-face 'flycheck-fringe-info) (set-face-foreground 'flycheck-fringe-error "red") (set-face-foreground 'flycheck-fringe-warning "magenta") (set-face-foreground 'flycheck-fringe-info "lightblue")
flycheck-pos-tip
flycheck-pos-tip をインストールして下記設定をする。
(when (locate-library "flycheck-pos-tip") (with-eval-after-load 'flycheck (flycheck-pos-tip-mode)) )
エラー、警告の内容をその場にツールチップで表示することができる。
上記を全て含めた設定例
flycheck と flycheck-pos-tip をインストール
(when (locate-library "flycheck") (require 'flycheck) (global-flycheck-mode) (flycheck-define-checker my-gcc "A C checker using gcc." :command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source "-o" temporary-file-name) :error-patterns ((error line-start (file-name) ":" line ":" column ":" " Error: " (message) line-end) (error line-start (file-name) ":" line ":" column ":" " Fatal Error: " (message) line-end) (warning line-start (file-name) ":" line ":" column ":" " Warning: " (message) line-end)) :modes (c-mode c++-mode)) (add-hook 'c-mode-common-hook '(lambda() (flycheck-select-checker 'my-gcc))) (when (locate-library "flycheck-pos-tip") (with-eval-after-load 'flycheck (flycheck-pos-tip-mode)) ) (when (fboundp 'define-fringe-bitmap) (define-fringe-bitmap 'my-flycheck-fringe-indicator (vector #b00000000 #b00000000 #b00000000 #b00000000 #b00000000 #b00001000 #b00011100 #b00111110 #b01111111 #b00111110 #b00011100 #b00001000 #b00000000 #b00000000 #b00000000 #b00000000 #b00000000)) ) (define-fringe-bitmap 'my-flycheck-fringe-indicator2 (vector #b00000000 #b00000000 #b00000000 #b00000000 #b01000001 #b01100011 #b00110110 #b00011100 #b00011100 #b00011100 #b00110110 #b01100011 #b01000001 #b00000000 #b00000000 #b00000000 #b00000000)) (flycheck-define-error-level 'error :overlay-category 'flycheck-error-overlay :fringe-bitmap 'my-flycheck-fringe-indicator2 :fringe-face 'flycheck-fringe-error) (flycheck-define-error-level 'warning :overlay-category 'flycheck-warning-overlay :fringe-bitmap 'my-flycheck-fringe-indicator :fringe-face 'flycheck-fringe-warning) (flycheck-define-error-level 'info :overlay-category 'flycheck-info-overlay :fringe-bitmap 'my-flycheck-fringe-indicator :fringe-face 'flycheck-fringe-info) (set-face-foreground 'flycheck-fringe-error "red") (set-face-foreground 'flycheck-fringe-warning "magenta") (set-face-foreground 'flycheck-fringe-info "lightblue") )
参考
- 【Emacs】flycheckでエラー、警告をソースコード中に表示する
- flycheck-select-checker するところが非常に参考になった
- Flycheck で使う実行ファイルに node_modules/.bin のものを自動で使うようにするヤツ
- よく使うEmacs拡張
- Flycheckでモダンなシンタックスチェック
- flycheck-pos-tip はここから
- My Emacs Config
- define-fringe-bitmap で参考にした
- How to change flycheck symbol?, like spacemacs
- define-fringe-bitmap で参考にした
- 38.10.4 フェイスを扱う関数
- GNU Emacs Lispリファレンスマニュアル より。set-face-foreground するときに参考にした
- fringeの使い方 (適当めも)