EmacsをTerminalとして使う

emacs-libvterm っていうのを見つけたのだけどこれがすごく良いので紹介します。

emacs-libvterm

https://github.com/akermu/emacs-libvterm

EmacsにはTerminal系の機能としてterm-modeやeshellなどがあるんですが、遅かったり、クセが強かったりで使えてませんでした。一時期それでも使おうとしてたんですがちょっと無理でした。

それがemacs-libvtermはTerminal.appと遜色ないくらいに速く動いてくれます。しかもtmuxもちゃんと動く。 ちなみにneovim/libvterm というやつを元にしてるみたいなのでvim様には頭が上がらないですね。

f:id:tototoshi:20210401211017p:plain

試し始めはたまになんかもっさりしたり、tigみたいなncurses系のアプリで表示が崩れたりしたんだけどそれは使っている日本語フォントに起因する問題だったようで、 Cicaというフォントにしたら見事に解消しました。

https://github.com/miiton/Cica

Emacs in Emacsしてしまうのを封じる

さて、Emacsの中でシェル使えるようにしてもEmacsの中のシェルでさらにEmacsを開くとわけがわからなくなるのでそれを防止しましょう。emacs の代わりに emacsclient を使って、新たにEmacsを起動するのではなく今起動しているEmacsに新しいバッファを開くようにします。

Emacs側ではサーバーを起動して置いて

;; .emacs.d/init.el
(server-start)

さらに次のスクリプトを ~/bin/emacs として置いておきます。

#!/bin/bash

if [[ "$1" == "" ]]
then
    /path/to/emacsclient -n .
else
    /path/to/emacsclient -n "$@"
fi

逆にEmacsからterminal側に移るにも適宜keybindを設定してterminalとEmacsの行き来を便利にすると良いでしょう。

まとめ

emacs-libvtermを使うことでTerminalの中でEmacsを使うのではなくEmacsの中でTerminalが使えます。このブログはエイプリルフールではなくて真面目に書いたつもりです。

f:id:tototoshi:20210401211035p:plain