Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

EmacsでFlycheckのウィンドウをトグルできるようにした

自分は普段の開発ではEmacsを使っていて、VSCodeユーザに笑われつつも(被害妄想)今のところ普通に開発できている。

そして、エラー表示にはFlycheckを使っている:

www.flycheck.org

FlycheckはLSP-modeに対応しているので、LSPで検出したエラーをEmacsの枠組みでちゃんと表示できる。Flycheckもlsp-modeも、いちおうデファクトな地位を築いている(最近はeglotというlsp-mode互換?な拡張機能も出ているようだ)。

ウィンドウを出し入れしたい

さて、Flycheckではエラーを一覧するための関数としてflycheck-list-errorsが用意されている:

www.flycheck.org

ただ、コマンドを実行すると出たままになってしまってちょっと邪魔なのと、dedicated window(そのウィンドウを特定のバッファが占有するモード)にならないので、エラー一覧の画面に他のバッファを開いてしまうことがあって困っていた。

この2点の問題を解消するべく、いくつかのelispを書いた。

まず、特定のショートカットでflycheck-list-errorsを実行してエラーリストを開き、もう一度同じショートカットを押下するとそのウィンドウを消すようにした:

(define-key evil-normal-state-map (kbd "SPC !")
  #'(lambda ()
      (interactive)
      (if (get-buffer-window "*Flycheck errors*")
          ;; when already window opened, close
          (delete-window (get-buffer-window "*Flycheck errors*"))
        ;; otherwise, open flycheck error list and make it dedicated
        (progn
          (flycheck-list-errors)
          (let* ((original-buffer-name (buffer-name))
                 (original-window (get-buffer-window original-buffer-name))
                 (flycheck-window (get-buffer-window "*Flycheck errors*")))
            (select-window flycheck-window)
            (set-window-dedicated-p flycheck-window t)
            (select-window original-window))))))

自分はEVILを使っているので、EVILユーザでなければevil-normal-state-mapのあたりを適宜読み替えてほしい。

この関数をevalすると、SPC !を押下するたびに、エラーリストウィンドウがトグルされるようになる。エラーリストウィンドウにdedicated属性を付与するようにしてあるので、勝手にバッファが上書きされることはない。

加えて、常に画面下部10%のサイズで表示されるようにした:

(add-to-list 'display-buffer-alist
             `(,(rx bos "*Flycheck errors*" eos)
              (display-buffer-reuse-window
               display-buffer-in-side-window)
              (side            . bottom)
              (reusable-frames . visible)
              (window-height   . 0.1)))

これはflycheckのマニュアルからのコピペをいじっただけなので、あまりよくわかっていないが、まあとにかくこれでよい。

こんな感じで画面下に表示されるようになった

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?