tkancf.com

Emacsに入門した 2024年

投稿日: 2024-04-25

Emacsに入門した 2024年

イントロ

最近Emacsの設定を頑張っていました。

10年ぐらいVimmerをやっているんですが、Emacsを羨ましいと思う要素がありました。 下記3つの機能です。

このうち、画像表示については3rd/image.nvimなどを利用してNeovimで画像表示が可能になっています。
dmacroについては、(私が知っている限りでは)Vimに似たプラグインは見つけられませんでした。
org-modeについては、nvim-orgmode/orgmodeというプラグインがかなりよく出来ており、org-modeの大体の機能はこれで利用できます。

ただ、nvim-orgmode/orgmodeでEmacsのorg-modeと完全に同等かというと、Emacsのorg-modeと使い比べてみると細々足りてない機能が気になります。
org-modeを利用したいというのが主目的で、org-modeを利用するからにはその機能を全て使いたくなったので、Emacsに入門してみました。

Vim, Neovimでのorg-modeについて

org-modeを使う前にVim, Neovimでのorg-modeの状況についても少々調べました。
2024年現在だと以下のような状況かなと思っています。

Emacsのorg-modeにしか無さそうな機能

しばらくEmacsのorg-modeを利用して、おそらくEmacsのorg-modeにしか無いなと思っているのは下記機能です。

おそらくどの機能も作れなくは無い or 探せばどこかには似た機能やプラグインが存在するかもしれないんですが、私的にはEmacsを使ったほうが近道に感じました。

nvim-orgmode/orgmodeでも実現できること

おそらく、これがVimもしくはNeovimのプラグインで一番多機能だと思います。
基本的な機能はあります。

これで十分という場合も多いと思います。

Neovimのnvim-neorg/neorgプラグイン

まだ発展途上という感じですが、nvim-neorg/neorgというNeovim用にorg-mode likeな機能を提供しようとしているプラグインがあります。
現在はneorgでは未実装のTODO管理機能、clock機能は個人的に外せなかったので選択肢にはならなかったんですが、 neorgファイル用のLSPが存在しており、ファイルへのリンクなどがやりやすく良いプラグインだと思います。

Emacsの設定について

まだEmacs歴が浅いので、雰囲気でやっている部分もあるんですが下記方針で設定を作っています。

パッケージ管理にはuse-packageを使う

Vimのプラグインマネージャーが多くあるように、Emacsにもパッケージマネージャーがいくつかあるみたいです。 どれが良いのか評価出来るほど理解していませんが、use-packageで設定しているパッケージのREADMEを多く見かけたので、 use-packageを使っています。

多数派に従っていると、ChatGPT, Claude等に設定方法を聞いた時に楽なので多そうなやつにしました。

設定はorgファイルから生成する

Emacsには、 org-babel-tangle というorgファイルに書いたコードブロックをつなげて一つのファイルにしてくれる機能があります。
これを利用して、 init.org というドキュメントにコードブロックとしてEmacs Lispを書いておき、設定をビルドする際にファイルとして書き出します。
更新時に簡単に実行出来るようにMakefileで管理することが多いようです。

他の人の設定を参考にMakefileに以下のようなスクリプトを用意しました。
make buildを実行することで、init.orgからinit.elが生成されて、init.el のコンパイルが実行されます。

.PHONY: build
build: ## Build emacs config
@$(EMACS) -Q --batch --eval "(progn (require 'ob-tangle) (org-babel-tangle-file \"./init.org\" \"./init.el\" \"emacs-lisp\"))"
@$(EMACS) --batch -Q -f batch-byte-compile init.el

このorgファイルから設定ファイルを生成するという体験がかなり便利で、org-mode最高ポイントの一つです。

Spacemacs, Doom Emacsのようなディストリビューションは利用しない

一応、2016年ぐらいにSpacemacsを一瞬利用していたことがあります。
よく出来ているんですが、ブラックボックスが多すぎると管理しきれず、何もわからんとなってしまったので今回は一から自分で設定を作っていきました。
どのようなプラグインを利用しているか等の設定の参考には便利だったので、よくソースを見に行きました。

左手小指、薬指の負担を減らす

左手小指、薬指が貧弱なため、Emacsのデフォルトキーバインドをそのまま利用していると、私の指は耐えられません。
evil-mode(Vim likeなキーバインドを提供するパッケージ)の利用である程度緩和できますが、他にも以下のような工夫をしています。

スペースキー長押しでCtrlキーにする

Karabiner-ElementsでEmacsに限らず設定しています。
ターミナルでもCtrlキーは多様するので、小指の負担がかなり減ります。

C-xをC-jにリマップ

C-xはデフォルトで様々なコマンドのprefixになっており、頻繁に入力するキーです。
xキーは左手薬指で押す必要があり、何度も入力していると貧弱な私の薬指では耐えられませんでした。
下記のように設定してC-jで元のC-xの挙動をするようにしています。

(define-key key-translation-map (kbd "C-j") (kbd "C-x"))

Super-jにM-xをリマップ

同様の理由でSuper-jにM-xをリマップしています。
Macなので、SuperキーはCommandキーになり、押しやすいです。

Super-kに*の割当

org-modeで*を連打してるとShiftキーのせいで左手の小指が痛くなるので設定しています。
Markdownはヘッダが#記号なので、左のShiftキーを押さずに済むんですよね...。

Vim likeキーバインドは捨てられないので、evil-modeに頼る

テキスト編集はVimが最強だと思っているので、それに近い環境はほしいです。
evil-modeはVimの基本的な機能はちゃんと使えるし、拡張も出来るので満足いく設定をしていけそうです。
ただ、Vimと全く同様で不満が全く無いかというとそんなことは無いです。

困りごと・不満点

evil-modeの不満点

設定でなんとかなるかもですが、今のところ困っている部分です。

ex-gfmでMarkdownを出力するとリストの表記が変

ex-gfmに限らずなんですが、リスト表記をMarkdownエクスポートすると、 -␣文字列 となるはずが、 -␣␣␣␣文字列となってしまいます。
設定次第な気がするんですが、見た目が微妙なのでなんとか直したいところです。

まとめ

ちょっと不満もありますが、Emacs楽しいですね。
常用するかはまだ決めてないんですが、なんとなくEmacs入門の扉は開けたかなと思います。
気に入った機能をVimで再現してみるとかも楽しいかもしれません。もうしばらく遊んでみたいと思います。