emacs でカーソルキーの動きを改善する

[戻る]

例えば abcdefghijklmnopqrstuwxyz という一行を狭い emacs で表示すると 以下のようになります。

abcdefghijklmnopq
rstuwxyz

この際、カーソルが a の位置にあったとすると、[↓]キーを押すと r で無く、次の行に飛んでいってしまいます。[↑]キーでも同様です。 これを a ならば r、f ならば x と直感的な動きをさせるよう改造する ためには .emacs なり何なりに以下のような行を追加します。

(global-set-key "\C-p" 'previous-window-line)
(global-set-key [up] 'previous-window-line)

(global-set-key "\C-n" 'next-window-line)
(global-set-key [down] 'next-window-line)

(defun previous-window-line (n)
  (interactive "p")
  (let ((cur-col
         (- (current-column)
            (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion (- n))
    (move-to-column (+ (current-column) cur-col))))

(defun next-window-line (n)
  (interactive "p")
  (let ((cur-col
         (- (current-column)
            (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion n)
    (move-to-column (+ (current-column) cur-col))))

さらにこう書くと、ファイルの末尾で[↓]キーを押した際、新たな行を追加せず そこで留まってくれる利点もあります。

なお、この二つの elisp 関数は 1993 年頃かな、 どっかから入手して、以降使使っているもので、作者や著作権は定かではありません。 まっ書いてても大丈夫でしょ。