はじめに
今回は、最小設定群(2023年)を紹介します。
常にこれを使っているわけではなく、私がたまにログインして、ファイルの内容確認を主な目的として Emacsを起動し、後はかるーく編集する時に使うための最小設定群です。
空の init.el からサーバ上の Emacs を使い始めて、操作中に あ"あ"! となった事象を解消した設定群です。あ"あ"! と思った項目に対応する設定は、基本的に、普段使いの設定群からコピペしています。
この最小設定群でも、意外と乗り切れますね。ポイントは、
- カーソル移動系の設定
- 画面内に表示されて欲しいと期待する情報を制御するための設定
は最低限必要ってことですかね。
init-min.el
外部パッケージは、markdown-mode
だけ取り込んでいます。それ以外はビルトインパッケージを使い、以下ではview-mode
, org-mode
, dired-mode
に対する設定を加えています。
基本設定
;; 余計なファイルを生成させない
(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です。
;; 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
たまにしか使わないサーバ上では不用意にファイルを変更したくないので、普段の操作性を担保しつつ、読み込み専用モードでファイルを開きます。
;; 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
読むだけで編集しないなら、下記の設定でも十分いけそうです。ガチにしたいときは、こちらを参照。
(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
これも操作性を維持するための設定を加えています。
(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!