My開発メモ

ミニバッファに”Sorting declarations … done.”のメッセージが出て困る(Emacs)

haskellファイルを開いて作業していると、ミニバッファに

Sorting declarations in applicative.hs ... done.

というメッセージがずっと表示されるようになった。
(applicative.hsというのは、そのとき開いていたファイル)

DDSKKの漢字変換の一覧がミニバッファに表示されても、すぐこの “Sorting…” で
上書きされて見えなくなる。

この原因は、結論からいうと、anything-config.el にあったのだが、
その原因を突き止めた経過をメモしておく。

(1) このメッセージを出力しているのは、どのファイルか?

このメッセージを出力しているファイルを、次のようにして調べた。

$ cd ~/.emacs.d
$ grep -nwr ./ -e 'Sorting declarations'

すると、次のファイルがヒットした。

~/.emacs.d/elpa/haskell-mode-17.2/haskell-decl-scan.el

このファイルの 583行目と607行目である。

;; Declaration scanning via 'imenu'.

;;;###autoload
(defun haskell-ds-create-imenu-index ()
  "Function for finding `imenu' declarations in Haskell mode.
Finds all declarations (classes, variables, imports, instances and
datatypes) in a Haskell file for the `imenu' package."
  ;; Each list has elements of the form `(INDEX-NAME . INDEX-POSITION)'.
  ;; These lists are nested using `(INDEX-TITLE . INDEX-ALIST)'.

    ... (省略) ...

    ;; Now sort all the lists, label them, and place them in one list.
    (message "Sorting declarations in %s..." bufname)
      ... (省略) ...
   (message "Sorting declarations in %s...done" bufname)

これは何をしているのかというと、
“Haskellソースを解析して、宣言(declaration)の位置や構造を調べている”
ということらしい。(chatGPT先生の言葉)

そして、”Haskell Mode が Imenu用の目次(索引)を作っている途中に、
その進捗メッセージを表示している”(chatGPT)のである。

そして、これが何回も繰り返されていて、”Sorting”の文字が常に表示されている
ということなのである。

(2) imenu-auto-rescan変数を調べる

haskellファイル(ここでは applicative.hs)を開いた状態で、次のコマンドを
実行した。

M-x describe-variable RET imenu-auto-rescan RET

次のような結果だった。

imenu-auto-rescan is a variable defined in ‘imenu.el’.
Its value is t
Original value was nil
Non-nil means Imenu should always rescan the buffers.
You can customize this variable.

このメッセージによると、imenu-auto-rescan のデフォルト値は nil であるが、
現在は t である。
だから、Imenuはバッファを自動的に再スキャンしているのである。

(3) imenu-auto-rescan を nil にしてみた

ここで試しに imenu-auto-rescan を nil にしてみた。

M-x set-variable RET imenu-auto-rescan RET nil RET

すると、DDSKKの変換候補漢字一覧がミニバッファに表示された。

(4) imenu-auto-rescan を t にしているのは、どのファイルか?

.emacs.d ディレクトリの中を調べてみた。

$ grep -nr 'imenu-auto-rescan' ~/.emacs.d

./elpa/lsp-ui-20230811.552/lsp-ui-imenu.el:281:
    (let ((imenu-auto-rescan t))
./elisp/anything-20170125.1710/anything-config.el:6985:
    (setq imenu-auto-rescan t)

(5) 原因は anything-config.el だった

これで原因がわかったのだが、anything-config.el の設定を変更するのは避けた。

かわりに、init.el の最後に

(setq imenu-auto-rescan nil)

と書くことにした。これでうまくいった。

カテゴリー: Emacs, Haskell, memo

タグ: Anything, Imenu, imenu-auto-scan, Sorting declarations

カウント: 21