• 作成:
  • 更新:

Emacsのflycheckの省略記号と省略単位を変える

flycheckの省略記号を...から…に変える

flycheckのバッファで表示される文字列がフォーマットの設定以上の場合、切り捨てて省略が行われます。

そして省略された文字列には省略の証として右側に...が付きます。

以下のような感じです。

...による省略

これは非常に無駄ですよね。省略した証に...と3文字も使ってほしくないです。

この省略文字は指定することが可能です。

その方法をググっても中々出てこなかったのでここにメモしておきます。 ...で検索するのではなくでコードを検索したら即座に分かっていたのですが、 ...で検索していたので時間がかかってしまった。

mule-util.elで設定してあるtruncate-string-ellipsis変数を指定することで制御可能です。

leafだと以下のような感じです。

(leaf mule-util
  :doc
  "flycheckでの省略記号を小さくします。"
  :require t
  :defvar truncate-string-ellipsis
  :setq (truncate-string-ellipsis . "…"))

設定後の省略は以下のようになります。

…による省略

1文字表示が増えましたね。

良かった。

なんでデフォルト値は...なんてことになってるんですか? 参照しろと出されている、 Make it possible to show longer ID · Issue #1101 · flycheck/flycheck を読んでもよく分からない。 1文字ぐらい表示が増えてもあんまり利益がないからこのデフォルト値なのか? LinuxのベーシックなTTYで表示できなくなると困るから、あくまでシステムデフォルトな値はこうなってるのかな。

Emacs 28ではデフォルトで…にしようとするのでこの設定は不要

Emacs JP Slackにこの記事をシェアした所、 @tadsanに、 Emacs 28では((char-displayable-p ?…) "…")で表示可能か判定して、普通の環境では無設定でtruncate-string-ellipsisになることを教えてもらいました。

Use '…' for ellipsis in truncate-string-to-width by default (bug#41250) · emacs-mirror/emacs@5ec2115

私は今Gentooの安定版で入るEmacs 27を使っているので気が付きませんでした。なのでEmacs 28を使っている人はこの設定は不要です。

flycheckの省略単位を変更する

1文字増えてもそこまで問題解決はしませんよね。

本格的にググる時にはidをコピペするので、カーソルを移動してコピーのキーバインドを実行すれば良いのですが…

そんなに長くないidについては即座に確認したいですね。 eslintなどのidは結構長く名前で説明しているので尚更です。

幅を実行時に変えるには、 tabulated-listを使っているので共通の関数を使うことが出来ます。 tabulated-list-widen-current-columnですね。デフォルトだと{に縮小が、 }に拡大が割り当てられているはずです。これを拡大したいカラムにフォーカスして実行することで拡大が出来ます。

しかしこれは一時的な切り換えに過ぎないので、 Emacsを再起動するとデフォルトの幅に戻ってしまいます。

levelはともかくidはデフォルトで15幅ぐらいは欲しい気がします。

フォーマットはflycheck-error-list-formatとして定義されていますが、これはdefconstで定義されているため変更することが出来ません。

なのでこちらも強引な手段を取らざるを得ません。

Emacsのdocker.elでイメージ名が見切れてしまうのを解決 - ncaq を参考にして、

(leaf flycheck
  :ensure t
  :init
  (defun flycheck-error-list-mode-setup ()
    ;; levelを幅10に、idを幅20にします。
    ;; flycheck-error-list-formatがdefconstなので強引に変更せざるを得ません。
    (setf (cadr (aref tabulated-list-format 3)) 10)
    (setf (cadr (aref tabulated-list-format 4)) 20))
  :hook (flycheck-error-list-mode-hook . flycheck-error-list-mode-setup))

このように強引にフックして書き換えてしまいます。

幅変更後

うーん… 幅は正しく変更されましたが、上のヘッダと位置がズレてしまっていますね…

flycheck--error-list-msg-offsetとかが変更前のflycheck-error-list-formatの値を読み込んでるからだと思います。 tabulated-list-widen-current-columnとかで幅を変更すると正しく揃います。かと言ってdefconstの値を無理矢理変更するのも気持ちが悪い。まあ変更しても良いらしいのですが、 flycheck--error-list-msg-offsetdefconstで読み込み時に定義されているので、それを読み込む前にflycheck-error-list-formatの設定を完了させる必要があります。それをやる場合はflycheck-error-list-formatをゼロから定義する必要があり、完全にモンキーパッチなのでやる気がしません。複雑になる割にヘッダのズレなんてどうでも良いので、これは放置することにしました。

とりあえずストレスはある程度軽減しました。

先行文献

問題を理解して解決してから適切な検索クエリが見つかって先行文献が見つかりました。

Flycheckのエラーリストのフォーマットが変わっていた - Umi Uyuraのブログ