2015年4月9日木曜日

[Emacs]view-mode を駆使して横着にカーソルを移動させる

 はじめに

他人のコードとかを読むとき楽してカーソル移動させたいなと感じて、Evil mode などを使ってみたんですが vi のコマンドをあんまり知らないので不便でした。
Emacs 内蔵の view-mode を上手く利用すると hjkl キーでのカーソル移動できたりページのスクロールなども 1 キーでできたりすることを知ったので紹介します。
ちなみにここで紹介するやり方を使えば view-mode の有効化・無効化が瞬時にできるのでコードリーディングのときだけでなく編集にも役立てます。


Emacs の設定

参考サイトほぼ丸パクリの設定は以下です。

(setq view-read-only t)
(defvar pager-keybind
      `( 
        ("h" . backward-char)
        ("l" . forward-char)
        ("j" . next-line)
        ("k" . previous-line)
        ("S-SPC" . scroll-down)
        (" " . scroll-up)
        ("@" . set-mark-command)
        ("a" . beginning-of-buffer)
        ("e" . end-of-buffer)
        ("f" . forward-word)
        ("b" . backward-word)
        ("]" . forward-word)
        ("[" . backward-word)
        ("}" . forward-paragraph)
        ("{" . backward-paragraph)
        ("n" . ,(lambda () (interactive) (scroll-up 1)))
        ("p" . ,(lambda () (interactive) (scroll-down 1)))
        ("N" . ,(lambda () (interactive) (scroll-up 10)))
        ("P" . ,(lambda () (interactive) (scroll-down 10)))
        ("c" . scroll-other-window-down)
        ("v" . scroll-other-window)
        ("(" . point-undo)
        (")" . point-redo)
        ("J" . jaunte)
        ))
(defun define-many-keys (keymap key-table &optional includes)
  (let (key cmd)
    (dolist (key-cmd key-table)
      (setq key (car key-cmd)
            cmd (cdr key-cmd))
      (if (or (not includes) (member key includes))
        (define-key keymap key cmd))))
  keymap)

(defun view-mode-hook0 ()
  (define-many-keys view-mode-map pager-keybind)
  (hl-line-mode 1)
  (define-key view-mode-map " " 'scroll-up))
(add-hook 'view-mode-hook 'view-mode-hook0)

;; 書き込み不能なファイルは view-mode で開くように
(defadvice find-file
  (around find-file-switch-to-view-file (file &optional wild) activate)
  (if (and (not (file-writable-p file))
           (not (file-directory-p file)))
      (view-file file)
    ad-do-it))
;; 書き込み不能な場合は view-mode を抜けないように
(defvar view-mode-force-exit nil)
(defmacro do-not-exit-view-mode-unless-writable-advice (f)
  `(defadvice ,f (around do-not-exit-view-mode-unless-writable activate)
     (if (and (buffer-file-name)
              (not view-mode-force-exit)
              (not (file-writable-p (buffer-file-name))))
         (message "File is unwritable, so stay in view-mode.")
       ad-do-it)))

(do-not-exit-view-mode-unless-writable-advice view-mode-exit)
(do-not-exit-view-mode-unless-writable-advice view-mode-disable)

4 行目からの設定見たら大体キーバインドが分かるでしょう。 point-undo とか jounte とかは好みで入れましょう。
 さらに key-chord をインストールして以下を書いておけば jk キー同時押しで view-mode の有効化と無効化を切り替えできます。
(require 'key-chord)
(setq key-chord-two-keys-delay 0.04)
(key-chord-mode 1)
(key-chord-define-global "jk" 'view-mode)
使え。

参考サイト

Ctrl+中指か薬指を使うキー操作が多い Emacs で指の負担を軽くする方法

0 件のコメント :

コメントを投稿