Emacs の eshell でバッファー末尾(EOB)から一文字戻る問題の対応
Emacs の 24.4 か 24.5 わかりませんが、
バッファーの末尾(EOB, End Of Buffer)で何かコマンドを実行するとカーソルが 1 文字戻る
という不具合が入りこんでいました。
ほとんどの場合は大した問題ではないのですが、 eshell
だとかなり不便です。
あまりちゃんとしたものではありませんが、対処方法を考えたので、
今回はそれを紹介します。
eshell ではバッファーの最後にカーソルがあるのが普通の状態です。 ここからバッファーの切り替え(switch-to-buffer)やウィンドウの移動(other-window) を行ってから戻ると、一文字移動し直さないと入力できないことになり、かなり面倒です。
この現象は多分バグなので、そのうち修正されるとは思いますが、ちょっと調べた感じだと特に解決方法は見つかりませんでした。 そのため場当たり的ではありますが、対処方法を考えてみました。
どうやるかというと advice という機能を利用します。
バッファーの切り替え等のコマンドを実行した後、 eshell モードで EOB の一文字後ろの場合には EOB に移動するようにします。
以下がそのためのコード なので、 ~/.emacs.d/init.el 等に書いてみてください。
(defun ex-move-to-eob-if-eshell (&rest args) (when (eq major-mode 'eshell-mode) (let ((pos (point))) (goto-char (+ pos 1)) (unless (eobp) (goto-char pos))))) (advice-add 'switch-to-buffer :after 'ex-move-to-eob-if-eshell) (advice-add 'other-window :after 'ex-move-to-eob-if-eshell) (advice-add 'eshell :after 'ex-move-to-eob-if-eshell)変更するコマンドは 3 つしか書いてませんが、 advice-add を追加すれば、他のコマンドでも移動するようになります。