Emacs

defadvice から advice-add に移行

Emacs 30.1 になり、defadvice がとうとう obsolete になりました。

私が advice を頻繁に使うようになった頃にはすでに advice-add を使うように推奨されていたため、自分の設定に残る defadvice は一つだけで、今回それを書き換えました。

orgバッファと専用編集バッファのコードの見た目を揃える

2025年にもなってタブスペースで悩むという貴重な体験をしましたが、無事に好みの設定にできました。

まず、普段編集する emacs-lisp-mode のファイルですが、他人様のファイルで特に指定のない状態ではインデントがタブ8で書かれていることも多いです。これは単純に tab-width のデフォルト値が 8 だけという理由だと思いますが、emacs-lisp-mode のファイルを編集するだけならなんら問題ないです。

define-key から keymap-set に移行

Emacs 29.1からキーバインドの設定には define-key ではなく keymap-set を使うように変更(推奨)されています。自分の設定も変更してみました。(see What’s New in Emacs 29.1?)

Table 1: before/after
変更前 変更後
define-key keymap-set
global-set-key keymap-global-set
local-set-key keymap-local-set
global-unset-key keymap-global-unset
local-unset-key keymap-local-unset
substitute-key-definition keymap-substitute
define-key-after keymap-set-after
lookup-key keymap-lookup
kye-binding keymap-lookup
locak-key-binding keymap-local-lookup
global-key-binding keymap-global-lookup

これまで kbd を挟んでいましたが、単純な置き換えではうまく行かないパターンもあったので、 SPC などの指定は、 "SPC", "RET", "<tab>", "S-<tab>", "<delete>" を kbd を挟まずに指定することでうまくいきました。

org-log-repeat を改良

org-log-repeat を non-nil に設定すると、繰り返しタスクを一度完了(その後に自動でTODOに戻る)するたびに、次のような情報が記録されます。

- State "DONE"       from "TODO"       [2025-02-10 Mon 22:55]

繰り返し頻度が高かったり、長期間に渡って完了開始を繰り返すタスクの場合には、記録されるデータがどんどん増えてしまいます。今のところ、私はこの記録をうまく活かせていないので停止することにしました。

ツリーのカットペースト時に統計情報を更新する

org-refile を使ってサブツリーを移動するのもいいですが、シンプルにサブツリーをカット&ペーストするのも直感的で良いですよね。

スピードコマンドを有効にしていれば、カット&ペーストは、ツリー(見出し)の行頭で ky で簡単できます( yorg-yank を呼ぶ設定は自分で追加が必要です)。

古い暗号化エントリーの Decryption failed を回避する

org ファイルの各エントリーは、gpg を使って暗号化できますが、かれこれ10年ほど前に暗号化したエントリーを復号できないケースに当たりました。数年前にも同じようなケースに遭遇しましたが、今回はその時とは違う方法で解決できたので、記録を残します。

インラインパッチ付きmacOS用EmacsをNativeComp対応に

脆弱性対策の為に先日、最新の安定版29.3がリリースされたEmacsですが、次のメジャーアップデートのEmacs 30からは、NativeCompがデフォルトでオンになるようです。

https://github.com/emacs-mirror/emacs/blob/master/etc/NEWS#L29

** Native compilation is now enabled by default.
'configure' will enable the Emacs Lisp native compiler, so long as
libgccjit is present and functional on the system.  To disable native
compilation, configure Emacs with the option:

./configure --with-native-compilation=no

macOS用のインラインパッチ付きEmacsはどうしましょう…

counsel-projectile-ag を使う

the_silver_sercher(ag) を用いた全文検索を Emacs から使う場合に、 counsel-ag を使っています。検索の範囲は、現在のバッファ(ファイル)があるディレクトリ以下に自動的に設定されますが、ソースコードを読んでいる時には検索の範囲を、ソースコードが属しているプロジェクト全体に設定したくなります。

macOS の Homebrew で GCC Emacs のビルドがうまく行かない

16dfe04be2c57fc82ccdd56cad97b39d559a5afe で解決しました (将来、再発するかもしれませんが…)

NativeComp が有効になった Emacs 28 ですが、macOS+Homebrew の環境では、うまくビルドできない場合があります。根本的な原因は Homebrew でインストールする libgccjit の状態に依存していて、現時点(2022-08-15)でも問題が再発しています。libgccjit のバージョンが12で、master branch と emacs-28 branch の双方で発生します。当面の解決策は、下記に示すパッチを configure.ac にあてて autogen.sh を呼べば、正しくビルドできる configure が生成されます。