🕌

GNU Emacs40周年なので設定を見直す

に公開

はじめに

GNU Emacsは1985年にリリースされたらしいので、気付けば40周年でした。ということを理由にして設定を見直します。

今まで設定ファイルは、~/.emacs.d/init.elに記述していましたが、XDG宗派の教えに合わせて~/.config/emacs/init.elに変更します。Emacsは標準でこのファイルを読み込んでくれるため、特別な設定は必要ありません。

early-init.el

early-init.elを使っていなかったので、この機会にいくつかの設定を移します。early-init.elに適切に設定を移すことで、起動速度、起動直後のちらつきなどを抑制できます。

UIの非表示

まずは、使用しないUIを非表示にします。マウス操作しなければ基本的に使わないものを以下の設定で非表示にします。

;; メニューバー非表示
(menu-bar-mode -1)

;; ツールバー非表示
(tool-bar-mode -1)

;; スクロールバー非表示
(scroll-bar-mode -1)

;; ツールチップ非表示
(tooltip-mode -1)

ちらつき抑制

;; 起動時に自動でリサイズが発生しちらつくのを抑制
(setq frame-inhibit-implied-resize t
      inhibit-compacting-font-caches t
      default-frame-alist
      '((font . "Iosevka Term Medium-14")
	(width . 80) (height . 30)
	(vertical-scroll-bars . nil)
	(horizontal-scroll-bars . nil)
	(tool-bar-lines . 0)
	(menu-bar-lines . 0)
	(undecorated . nil)
	(fullscreen . nil)
	(inhibit-double-buffering . t)))

GCの抑制

起動時に一時的にGCを発生させないようにします。init.el側でこの設定は解除します。

;; 起動時にGCの発生を抑制
(setq gc-cons-threshold most-positive-fixnum
      gc-cons-percentage 0.6)

~/.Xresources無視, スタートアップメッセージ非表示

(setq inhibit-x-resources t
      inhibit-startup-screen t
      inhibit-startup-message t
      inhibit-splash-screen t)

警告非表示

;; ネイティブコンパイルの警告非表示
(when (boundp 'native-comp-async-report-warnings-errors)
  (setq native-comp-async-report-warnings-errors nil))

straight.elを使う設定

;; straight.elを使うため、Emacsの自動パッケージ有効化を無効化
(setq package-enable-at-startup nil)

;; straight.el
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

init.el

GC抑制を戻す

emacs-startup-hookで、起動が完了した際にGCの設定を元に戻します。

;; GC抑制を戻す
(add-hook 'emacs-startup-hook
          (lambda ()
            (setq gc-cons-threshold (* 128 1024 1024)
                  gc-cons-percentage 0.1)))

straight.elとuse-packageの設定

;; straight.elでuse-packageをインストール
(straight-use-package 'use-package)

;; use-packageを使う際、デフォルトでstraight.elを使う
(setq straight-use-package-by-default t)

フォント設定

英数と日本語を良い感じに組み合わせたフォントを使うか、別々に指定もできるので、一旦別々に指定しておきます。

;; Iosevka + IBM Plex Sans JP フォント設定
(when (display-graphic-p) ;; GUI環境のみ有効化
  ;; デフォルトの英数字フォント
  (set-face-attribute 'default nil
                      :family "Iosevka Term Medium"
                      :height 140) ;; 14pt

  ;; 日本語キャラクターセット
  (dolist (charset '(japanese-jisx0208
                     japanese-jisx0212
                     japanese-jisx0213-1
                     japanese-jisx0213-2
                     katakana-jisx0201
                     kana han symbol cjk-misc bopomofo))
    (set-fontset-font t charset
                      (font-spec :family "IBM Plex Sans JP Medium"))))

ロケール・文字コード・情報表示・基本的な挙動

絶対に末尾スペースを削除するという固い決意が大事。

;; ロケール
(set-language-environment "Japanese")

;; ファイル読み書き時の優先文字コード
(prefer-coding-system 'utf-8)

;; 新規バッファ作成時に優先する文字コード
(set-default-coding-systems 'utf-8)

;; CUI Emacsでターミナルとのやりとりに使用する文字コード
(set-terminal-coding-system 'utf-8)

;; キーボード入力時の文字コード
(set-keyboard-coding-system 'utf-8)

;; ベル音無効
(setq ring-bell-function 'ignore)

;; 行番号: 最初の行を1とし絶対指定で割り振る
(setq display-line-numbers-type t)

;; 全体で行番号表示を有効化
(global-display-line-numbers-mode t)

;; モードラインに改行コードを表示
(setq eol-mnemonic-dos "(CRLF)")
(setq eol-mnemonic-mac "(CR)")
(setq eol-mnemonic-unix "(LF)")

;; モードラインに行・列番号を表示
(line-number-mode t)
(column-number-mode t)

;; バックアップファイル無効
(setq make-backup-files nil)

;; 自動保存無効
(setq auto-save-default nil)

;; 自動保存のリストを作成しない
(setq auto-save-list-file-prefix nil)

;; 同時編集防止無効
(setq create-lockfiles nil)

;; Emacs外でファイルに変更があった場合に、自動で変更を読み込む
(global-auto-revert-mode 1)

;; 末尾のスペースを可視化
(setq-default show-trailing-whitespace t)

;; 保存時、末尾のスペースを削除
(add-hook 'before-save-hook 'delete-trailing-whitespace)

;; タブの表示
(require 'whitespace)
(setq whitespace-display-mappings
      '((tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))
(setq whitespace-style '(face tabs tab-mark))
(global-whitespace-mode 1)
(setq whitespace-style '(face trailing tabs tab-mark))

キーバインド

ここはお好みに応じて。C-x C-bibufferを使うようにすると見やすくて便利です。

;; キーバインド設定
;; C-h: Backspace
(global-set-key "\C-h" 'delete-backward-char)

;; C-x C-b: ibuffer
(global-set-key "\C-x\C-b" 'ibuffer)

;; 補完
(global-set-key (kbd "C-<tab>") #'completion-at-point)

見た目系

;; テーマ
(load-theme 'modus-vivendi t)

;; 括弧の階層別色分け
(use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))

;; カーソルジャンプ時、一時的にハイライト表示
(use-package beacon
  :config (beacon-mode 1))

補助系

;; ミニバッファのコマンド・ファイル名補完を垂直表示
(use-package vertico
  :init (vertico-mode))

;; 順序不一致・複数キーワード一致
(use-package orderless
  :custom (completion-styles '(orderless basic)))

;; 候補補足表示
(use-package marginalia
  :init (marginalia-mode))

;; キーバインドヘルプ・支援
(use-package which-key
  :init (which-key-mode))

開発系

後で書く

Discussion