📌

Emacsの門を10数年ぶりに叩いた

に公開

故あって、仕事で使うメインエディタをVSCodeからEmacsに変えた。

定義ファイル

使っていたのは15年以上前な気がする。
当時はinit-loaderで分割してた気がする。昔書いた記事

今は、No分割がメジャーらしい。

ということで、定番のここを見て、init.elのベースをコピー。
(2020年代も半分過ぎたか、、、)

今回設定した内容を列挙

結構昔に設定してたやつがある。。。。(人は変わらない)

C-hでbackspace

いつの時代も最初に設定するやつ

(global-set-key "\C-h" 'delete-backward-char)

メニューバーを表示させない

Terminalで使うので上のメニューバーは使わないので非表示に

(menu-bar-mode -1)

モードラインに列番号(何文字目か)を表示

今気づいたけど0スタートなのは、まぁプログラマ的な?

(column-number-mode 1)

スクロールする際の行数を1に

(setq scroll-conservatively 1)

昔は以下だったけど、有効なのかな?

(setq scroll-step 1)

C-x p でバッファを逆に移動

C-x oの逆

(global-set-key "\C-xp" (lambda ()
                          (interactive)
                          (other-windows -1)))

Emacs内のPATHの設定

shell側のPATHとEmacs内のPATHを合わせる

元ネタはここです

(dolist (dir (list
              "/sbin"
              "/usr/sbin"
              "/bin"
              "/usr/bin"
              "/opt/local/bin"
              "/sw/bin"
              "/usr/local/bin"
              "/usr/texbin"
              (expand-file-name "~/bin")
              (expand-file-name "~/.emacs.d/bin")
              ))
 (when (and (file-exists-p dir) (not (member dir exec-path)))
   (setenv "PATH" (concat dir ":" (getenv "PATH")))
   (setq exec-path (append (list dir) exec-path))))

上記書かなくても exec-path-from-shell パッケージいれるだけでOK

行番号

以外に面倒だったのは行番号表示。

vtermで、行番号を表示するとEnter押すたびに%(改行)が表示されてうっとおしいので、vtermでは無効にした。

;; 指定したモードで行番号を表示する
(dolist (mode '(
                prog-mode-hook   ;;全てのプログラムモード
                text-mode-hook)) ;; テキストモード
  (add-hook mode (lambda () (display-line-numbers-mode))))

;; 指定されたモードの行番号表示を無効にする
(dolist (mode '(
                vterm-mode-hook)) ;; vtermは変に改行が表示されるので
  (add-hook mode (lambda () (display-line-numbers-mode -1))))

全部で表示していいなら (global-display-line-numbers-mode 1) を書けばOK

括弧の補完

(electric-pair-mode t)

現在行の強調表示

こっちも行番号と同じく、、、

;; 指定したモードで行番号を表示する
(dolist (mode '(
                prog-mode-hook   ;;全てのプログラムモード
                text-mode-hook)) ;; テキストモード
  (add-hook mode (lambda () (hl-line-mode))))

;; 指定されたモードの行番号表示を無効にする
(dolist (mode '(
                vterm-mode-hook)) ;; vtermは変に改行が表示されるので
  (add-hook mode (lambda () (hl-line-mode -1))))

パッケージ

使ってるパッケージ

パッケージは leaf-convert-insert-template を使って最初に定義。

ほとんどデフォルトだけど、一部カスタマイズ

  • paren
  • files
    • バックアップファイルが作成されるのを解消するために。ここをまんま使ってる
  • ivy
  • company

indent-bars

インデントごとに縦線をいれてくれるやつ

基本leafでいれたままhookだけ

:hook
prog-mode-hook yaml-mode-hook

なんでかhookが動かぬ。。

ターミナル

vtermを選択。過去はmulti-termを使っていたらしいが。。

一部思い通りにならずカスタマイズ

(leaf vterm
  :doc "Fully-featured terminal emulator"
  :req "emacs-25.1"
  :tag "terminals" "emacs ≥ 25.1"
  :url "https://github.com/akermu/emacs-libvterm"
  :added "2025-07-27"
  :emacs 25.1
  :ensure t
  :custom
  (vterm-max-scrollback. 10000)
  (vterm-buffer-name-string "vterm: %s")
  (vterm-keymap-exceptions
   . '("<f1>" "<f2>" "C-c" "C-x" "C-u" "C-g" "C-1" "M-x" "M-o" "C-v" "M-v" "C-у" "M-y"))
  :config
  ;; Workaround of not working counsel-yank-pop
  ;; https://github.com/akermu/emacs-libvterm#counsel-yank-pop-doesnt-work
  (defun my/vterm-counsel-yank-pop-action (orig-fun &rest args)
    (if (equal major-mode 'vterm-mode)
        (let ((inhibit-read-only t)
              (yank-undo-function (lambda (_start_end) (vterm-undo))))
          (cl-letf (((symbol-function 'insert-for-yank)
                     (lambda (str) (vterm-send-string str t))))
            (apply orig-fun args)))
      (apply orig-fun args)))
  (advice-add 'counsel-yank-pop-action : around #'my/vterm-counsel-yank-pop-action))

テーマ

Lupan's themesを使用。

lupan-material-darkを使ってます。

背景が真っ黒だとほかのアプリケーションと区別がつかないので、背景が黒じゃなくて見やすそうだったので。

パッケージになってないので、手で入れる。

  • git cloneしてローカルにもってくる
  • 持ってきたディレクトリを ~/.emacs.d/elpa/ におく
  • 以下をinit.elに記述
(leaf lupan-themes
  :load-path "~/.emacs.d/elpa/lupan-themes/"
  :require 'lupan-themes
  :config
  (load-theme 'lupan-material-dark t))

なんか最初出来なくて、なんでか有効になった。。。

理由はよくわかってない、、、

キーバインド

MetaキーのESCはちょっと遠いということで、C-[をMetaキーにする。

Emacsでのやりかたは試したけど無理なので、ターミナル(ghostty)側で実現

keybind = ctrl+[=esc:

Discussion