2010/05/28

Emacs view-mode がステキ便利

ソースコードはもちろんですが、テキストファイルなどを Emacs で読む機会が多いです。
つい先日も、Twitter で見かけたテキストファイルをダウンロードして、Emacs で読んでいました。
実は、C-x C-q (読み取り専用)なども知らなかったため、C-n C-p で読んでいる時に文章中に n や p が紛れ込むこともしばしばです。これはテキストファイルに限らずプログラムを書いている時もそうで、わりと困っていました。

そこで、こういうものを見かけたので、試してみたら便利も便利。。。
  1. emacsでコードリーディングをするときはvi-modeがおすすめ - goinger的日記
  2. view-mode - とりあえず暇だったし何となく始めたブログ
  3. Ctrl+中指か薬指を使うキー操作が多いEmacsで指の負担を軽くする方法 - (rubikitch loves (Emacs Ruby CUI))
特に、3の rubikitch さんところで紹介されている key-chord.el と view-mode のコンボがすごく便利でした。

例えば、.emacs はよく編集しますが、編集を始めるまでに眺める時間の方が長かったりします。この際、view-mode をデフォにしてみました。
(global-set-key [f7] '(lambda ()
(interactive)
(find-file "~/.emacs")
(view-mode)))

どうせなので、ファイルを開いたときはデフォルトで view-mode にすることにしました。しばらくこの状態で試してみます。
(add-hook 'find-file-hook
'(lambda ()
(interactive)
(view-mode)))


設定は、rubikitch さんのところから頂きました。
キーバインドは好みで以下のように変更しました。メモがてらさらしておきます。
;; view-mode
(setq view-read-only t)
(defvar pager-keybind
`( ;; vi-like
;; ("h" . backward-word)
;; ("l" . forward-word)
;; ("j" . next-window-line)
;; ("k" . previous-window-line)
("h" . backward-char)
("l" . forward-char)
("j" . next-line)
("k" . previous-line)
;; (";" . gene-word)
("b" . scroll-down)
(" " . scroll-up)
;; w3m-like
;; ("m" . gene-word)
;; ("i" . win-delete-current-window-and-squeeze)
("w" . forward-word)
("e" . backward-word)
;; ("(" . point-undo)
;; (")" . point-redo)
;; ("J" . ,(lambda () (interactive) (scroll-up 1)))
;; ("K" . ,(lambda () (interactive) (scroll-down 1)))
("n" . ,(lambda () (interactive) (scroll-up 1)))
("p" . ,(lambda () (interactive) (scroll-down 1)))
;; bm-easy
;; ("." . bm-toggle)
;; ("[" . bm-previous)
;; ("]" . bm-next)
;; langhelp-like
;; ("c" . scroll-other-window-down)
;; ("v" . scroll-other-window)
))
(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)
(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))
(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)
(require 'key-chord)
(setq key-chord-two-keys-delay 0.04)
(key-chord-mode 1)
(key-chord-define-global "jk" 'view-mode)


入門 GNU Emacs 第3版

0 件のコメント:

コメントを投稿