最終更新日: 2019-02-03 日 20:37
ホーム | 文書トップ | 目次

Emacs Flycheck

Table of Contents

概要

Flycheckは、on-the-flyで(その場で)書式チェックを行うものである。

インストール

基本設定

(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

デフォルトの表示

エラーの時

!マークが付く

flycheck_error_icon1.png

警告の時

?マークが付く

flycheck_warn_icon1.png

エラーと警告が両方出ている場合

flycheck_error_warn_icon1.png

カスタマイズ例

エラーの時

×マークとする

flycheck_error_icon2.png

警告の時

◆マークとする

flycheck_warn_icon2.png

エラーと警告が両方出ている場合

flycheck_error_warn_icon2.png

設定方法

(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_warn_icon3.png

上記を全て含めた設定例

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

参考

ホーム | 文書トップ | 目次
Created by Emacs 27.1 (Org mode 9.3)