Emacs の eshell でバッファー末尾(EOB)から一文字戻る問題の対応

Emacs の 24.4 か 24.5 わかりませんが、 バッファーの末尾(EOB, End Of Buffer)で何かコマンドを実行するとカーソルが 1 文字戻る という不具合が入りこんでいました。 ほとんどの場合は大した問題ではないのですが、 eshell だとかなり不便です。
あまりちゃんとしたものではありませんが、対処方法を考えたので、 今回はそれを紹介します。

まず、何が問題かというと コマンドを書いていない場所から一文字カーソルを戻った場所は 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 を追加すれば、他のコマンドでも移動するようになります。


スポンサーサイト
 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
44位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

08月 | 2015年09月 | 10月
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。