私が使う最小設定（2023年）

# はじめに

今回は、最小設定群（2023年）を紹介します。

常に[これ](https://github.com/takaxp/emacs.d/blob/master/init-min.el)を使っているわけではなく、私がたまにログインして、ファイルの内容確認を主な目的として Emacsを起動し、後はかるーく編集する時に使うための最小設定群です。

空の init.el からサーバ上の Emacs を使い始めて、操作中に **あ"あ"！** となった事象を解消した設定群です。**あ"あ"！** と思った項目に対応する設定は、基本的に、普段使いの[設定群](https://takaxp.github.io/init.html)からコピペしています。

この最小設定群でも、意外と乗り切れますね。ポイントは、
1. カーソル移動系の設定
2. 画面内に表示されて欲しいと期待する情報を制御するための設定

は最低限必要ってことですかね。

# init-min.el
外部パッケージは、`markdown-mode`だけ取り込んでいます。それ以外はビルトインパッケージを使い、以下では`view-mode`, `org-mode`, `dired-mode`に対する設定を加えています。

## 基本設定
```emacs-lisp
;; 余計なファイルを生成させない
(setq make-backup-files nil)
(setq auto-save-default nil)
(setq auto-save-list-file-prefix nil)

;; 長いファイルを開く場合でも行番号を常に表示
(setq line-number-display-limit-width 100000)

;; C-x C-c で閉じる時に、ワンクッション置く
(setq confirm-kill-emacs 'y-or-n-p)

;; 手に馴染んでしまったキーバインド群を設定
(global-set-key (kbd "RET") 'electric-newline-and-maybe-indent)
(global-set-key (kbd "C-M-t") 'beginning-of-buffer)  ;; M-<
(global-set-key (kbd "C-M-b") 'end-of-buffer) ;; M->
(global-set-key (kbd "C-M-p") (lambda () (interactive) (other-window -1)))
(global-set-key (kbd "C-M-n") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "C-;") 'comment-dwim) ;; M-; is the default
(global-set-key (kbd "M-=") 'count-words)
(global-set-key (kbd "M-]") 'bs-cycle-next)
(global-set-key (kbd "M-[") 'bs-cycle-previous)
(global-set-key (kbd "C-c g") 'goto-line)

;; ホーム的に瞬時にscratchバッファを表示するための関数
(defun my-open-scratch ()
  "Switch the current buffer to \*scratch\* buffer."
  (interactive)
  (switch-to-buffer "*scratch*"))
(global-set-key (kbd "C-M-s") #'my-open-scratch)
```

## markdown-mode

インストール先は、`${HOME}/.emacs.d`にしています。(他のパッケージも)必要になれば、同様にインストール先フォルダで git でパッケージを取り寄せて、`'load-path`にパスを入れてあげればOKです。

```emacs-lisp
;; markdown-mode
;; cd ${HOME}/.emacs.d
;; git clone --depth 1 https://github.com/jrblevin/markdown-mode.git

;; インストール先をパスに追加
(add-to-list 'load-path "~/.emacs.d/markdown-mode")
;; markdown-mode が有効になる時にパッケージを読み込む
(autoload 'markdown-mode "markdown-mode" nil t)
;; *.md なファイルを開く時に、markdown-mode を有効化する
(push '("\\.md$" . markdown-mode) auto-mode-alist)
```
## view-mode
たまにしか使わないサーバ上では不用意にファイルを変更したくないので、普段の操作性を担保しつつ、読み込み専用モードでファイルを開きます。
```emacs-lisp
;; view-mode
;; ファイルを開く時に、view-modeを有効化する（モード有効中は書き込み禁止）
(add-hook 'find-file-hook #'view-mode)
(with-eval-after-load "view"
  ;; 自分の感覚に合うようにキーバインドを変更
  (define-key view-mode-map (kbd "i") 'View-exit-and-edit)
  (define-key view-mode-map (kbd "<SPC>") 'ignore)
  (define-key view-mode-map (kbd "<DEL>") 'ignore)
  (define-key view-mode-map (kbd "f") 'forward-char)
  (define-key view-mode-map (kbd "b") 'backward-char)
  (define-key view-mode-map (kbd "n") 'my-org-view-next-heading)
  (define-key view-mode-map (kbd "p") 'my-org-view-previous-heading)
  (define-key view-mode-map (kbd "<tab>") 'my-view-tab)
  (define-key view-mode-map (kbd "S-<tab>") 'my-view-shifttab)

  ;; org-mode との衝突を回避
  (defun my-org-view-next-heading ()
    (interactive)
    (if (and (derived-mode-p 'org-mode)
             (org-at-heading-p))
        (org-next-visible-heading 1)
      (next-line)))
  (defun my-org-view-previous-heading ()
    (interactive)
    (if (and (derived-mode-p 'org-mode)
             (org-at-heading-p))
        (org-previous-visible-heading 1)
      (previous-line)))
  (defun my-view-tab ()
    (interactive)
    (when (and (derived-mode-p 'org-mode)
               (or (org-at-heading-p)
                   (org-at-property-drawer-p)))
      (let ((view-mode nil))
        (org-cycle))))
  (defun my-view-shifttab ()
    (interactive)
    (when (derived-mode-p 'org-mode)
      (let ((view-mode nil))
        (org-shifttab)))))
```
## org-mode
読むだけで編集しないなら、下記の設定でも十分いけそうです。ガチにしたいときは、[こちら](https://takaxp.github.io/init.html#org47616d05)を参照。
```emacs-lisp
(with-eval-after-load "org"
  ;; font lock を有効化
  (add-hook 'org-mode-hook #'turn-on-font-lock)
  ;; ツリーを展開する時に、展開されているドロアを自動で閉じる
  (add-hook 'org-tab-first-hook 'my-org-hide-drawers)
  ;; 長い行を改行する
  (setq org-startup-truncated nil)
  ;; 見出しを表す＊の冗長な部分を非表示にする
  (setq org-hide-leading-stars t)

  ;; ドロアを閉じる
  (defun my-org-hide-drawers ()
    "Hide all drawers in an org tree."
    (interactive)
    (save-excursion
      (beginning-of-line)
      (unless (looking-at-p org-drawer-regexp)
        (org-cycle-hide-drawers 'subtree)))))
```

## dired-mode
これも操作性を維持するための設定を加えています。
```emacs-lisp
(with-eval-after-load "dired"
  ;; u押下で上のディレクトリに移動
  (define-key dired-mode-map (kbd "u") 'dired-up-directory)
  ;; 手に馴染んだキーバインドで上書き
  (define-key dired-mode-map
              (kbd "C-M-p") (lambda () (interactive) (other-window -1)))
  (define-key dired-mode-map
              (kbd "C-M-n") (lambda () (interactive) (other-window 1)))
  ;; ファイルサイズを読みやすくする
  (setq dired-listing-switches "-lha"))
```

# まとめ
使用頻度が高まれば、さらに設定を追加する気もしますが、ほぼデフォルト設定でも、実はちゃんと使えるんだなと感じますね。

なお、シェルでは `alias e="emacs -nw"` を設定して、`e`押下でいつでもEmacsを呼べるようにしています。

Enjoy!