emacs-libvterm (vterm)

はじめに

長年、Emacsのshell-modeで色付けが正しくされないことに不満を持っていました。 何度か、eshell や ansi-term を試用したことはあるのですが、ある程度色付けはされるものの、他の使い勝手が悪かったり(具体的にどういうことだったかは忘れてしまいました)して、諦めてshell-modeを使い続けていました。

この度、kubensコマンドを使う際に色付けがされず困ってしまったので、再度解決策を探しました。

Reddit - Dive into anything

上記 reddit を参照し、emacs-libvterm がこれに対しての完全な解決策になりそうです。

概要およびインストール方法

GitHub - akermu/emacs-libvterm: Emacs libvterm integration
Emacs libvterm integration. Contribute to akermu/emacs-libvterm development by creating an account on GitHub.

Emacs-libvterm (vterm) is fully-fledged terminal emulator inside GNU Emacs based on libvterm, a C library. As a result of using compiled code (instead of elisp), emacs-libvterm is fully capable, fast, and it can seamlessly handle large outputs.

emacs-libvterm(vterm) は、elispでなくC言語で書かれたlibvtermをベースとし、各環境に合わせてビルドするターミナルエミュレータであり、これによりフル機能と高速化を実現したものとなります。

上記をインストールします。

事前に cmake と libtool-bin をインストールしておけば、自動でビルドが行われます。

; To build this, you need to install "cmake" and "libtool-bin" first
(use-package vterm
  :ensure t
  )

使い勝手

色付け以外にも通常のshellと同様の機能が使用できるというところが非常に便利です。

shell-modeではインタラクティブな動作について制約がありました。例えば、vi(!)などは実行できてもカーソル移動等が正しく行われず、実際には使用することはできませんでした。

vterm上ではvi(!!)も使用することができます。

一方、shell-modeのメリットとして、shellのバッファ中を自由に移動してテキストをコピーしたりできることがありました。 そのため、shell中で過去に実行したコマンドを呼び出すためには、↑でなく、Ctrl + ↑ を使うなどの操作の違いがありました。

vtermでは通常のshellと同じ動作を実現しているため、shell中で過去に実行したコマンドを呼び出すためには、Ctrl + ↑ を使うことができます。 もし、バッファ中のテキストをコピーしたい場合(もしくはカーソル操作で移動したい場合)は、vterm-copy-mode (C-c C-t) に入ることでこれを行うことができます。 Enterキーで元の位置に戻ります。

emacs-libvtermの開発者はEmacs上でshellを使うことのメリットをよく理解していますね!! 今のところ、vtermは私にとって完璧な解決策です。

なお、今回は Ubuntu22.04(WSL) で使用した結果となります。 公式ドキュメントの記載によるとWindowsネイティブEmacs(NTEmacs)では使用できないように見えます。

おわりに

Emacs上でshellを使いたい場合は vterm を使いましょう!

以上です。

Copied title and URL