【Emacs】Lispコード
内のキーワードの斜体が気になる

関連記事

1. 問題:キーワード強調の斜体が気になる

Lispコードを書いていたら、キーワードが斜体で表示されていることが気になりました。

1. 問題:キーワード強調の斜体が気になる

defunletdotimesloop などのキーワードが斜体になると、なぜかコードが揃わない。

1.1. 原因の特定:describe-char で face を調べる

どの face を修正すればよいかは、describe-char で確認できます。

1.1. 原因の特定:describe-char で face を調べる

ずれているキーワード上にカーソルを置き、M-x describe-char を実行してください1

There are text properties here:
  face                 font-lock-keyword-face
  fontified            t

face の値がそのまま修正対象になります。
コメントが斜体になっているなら font-lock-comment-face、キーワードなら font-lock-keyword-face です2

2. 解決:face-remap-add-relative:slant normal だけ上乗せ

set-face-attribute でグローバルに変えると他のモードにも影響します。

;; font italic fix for lisp modes
(defun my/disable-italic-in-lisp-faces ()
  (face-remap-add-relative 'font-lock-comment-face '(:slant normal))
  (face-remap-add-relative 'font-lock-keyword-face '(:slant normal)))

(add-hook 'lisp-mode-hook       #'my/disable-italic-in-lisp-faces)
(add-hook 'emacs-lisp-mode-hook #'my/disable-italic-in-lisp-faces)Code language: Lisp (lisp)

バッファローカルに効かせるには face-remap-add-relative を使います3
既存の face に対して属性を相対的に上書きするので、テーマの色や太さはそのままに、斜体だけを通常体に戻せます。

2. 解決:face-remap-add-relative で :slant normal だけ上乗せ

lisp-modeemacs-lisp-mode に限定して反映するなら、hook に入れます4

face-remapping-alist:family まで書くと、色の継承が崩れることがあります。
:slant normal だけで十分なケースがほとんどなので、シンプルにこれだけにとどめるのがよいです。

既存バッファに即時反映するには、バッファ内で (my/disable-italic-in-lisp-faces) を評価するか、M-x revert-buffer してください。

  1. describe-char はカーソル位置の文字について、文字コード、エンコーディング、使用フォント、テキストプロパティ(face を含む)などを *Help* バッファに表示します。C-u C-x = でも同じコマンドを呼び出せます。 – International Chars (GNU Emacs Manual)
  2. font-lock-keyword-faceforif のような構文上の意味を持つキーワードに使われます。font-lock-comment-face はコメント全体に、font-lock-comment-delimiter-face はコメント区切り文字に使われます。 – Faces for Font Lock (GNU Emacs Lisp Reference Manual)
  3. face-remap-add-relative は Emacs 23 から face-remap.el に含まれる関数です。既存の face 定義に対して属性を相対的に上乗せし、戻り値の「cookie」を face-remap-remove-relative に渡すとリマッピングを取り消せます。 – Face Remapping (GNU Emacs Lisp Reference Manual)
  4. add-hook はモードが有効になったときに実行される関数のリストに追加します。lisp-mode-hook は Common Lisp 編集用、emacs-lisp-mode-hook は Emacs Lisp 編集用のフックです。既存バッファには hook は遡って実行されません。 – Hooks (GNU Emacs Lisp Reference Manual)