コードリーディング用の設定

こんな感じの状況

コードリーディングをしたい。
1つのファイルをみるだけだとview-modeを使えばいいかも。
複数のファイルを楽にたどりたい。
そうなると、どうやって読みたいファイルを開くかが問題。
その上、anythingで探せるほどファイル名なども覚えていない。

こんな感じのものが欲しい

  • vim見たいなkey-bindで移動できる
  • 上の階層などにも楽に移動したい。

minor-modeでも作ればいいかな。

実際に作ってみた。

(require 'elscreen)

;;for code reading
(defvar dw-target nil)	;;(<frame> . <buffer>)

(defun dw-target-set ()
  (setq dw-target
	(cons (selected-frame) (current-buffer))))

(defun dw-dired () (interactive)
  (dw-target-set)
  (call-interactively 'dired-other-frame)
  (directory-walking-mode t)
  )

(defun dw-find-file-with-target-buffer () (interactive)
  (let ((file (dired-get-file-for-visit)))
    (let ((frame (car dw-target))
	  (buf (cdr dw-target)))
      (progn
	(select-frame-set-input-focus frame)
	(elscreen-kill buf)
	(elscreen-find-file file)
	(view-mode-enable) ;view-mode
	(dw-target-set)))))

(defun dw-find-file-wrapper () (interactive)
  (if (file-directory-p (dired-get-file-for-visit))
      (progn (dired-find-file)
	     (directory-walking-mode t))
    (dw-find-file-with-target-buffer)))

(defmacro defun-dw (name action)
  `(defun ,name () (interactive) ,action))

;→、←
(defun-dw dw-forward (dw-find-file-wrapper))
(defun-dw dw-backward (progn (dired-up-directory) (directory-walking-mode t)))

;↓,↑
(defun-dw dw-next-line (dired-next-line 1))
(defun-dw dw-previous-line (dired-previous-line 1))

;],[
(defun-dw dw-next-dirline (dired-next-dirline 1))
(defun-dw dw-previous-driline (dired-prev-dirline 1))

;;toggle frame(file <-> dired)
(defun-dw dw-next-frame (other-frame 1))
(defun-dw dw-previous-frame (other-frame -1))

(easy-mmode-define-minor-mode  directory-walking-mode
			       "minor-mode for walking directory (when code-reading, it is convenient.)"
			       nil
			       " <λ..>"
			       '(;emacs-style
				 ("\C-f" . dw-forward)
				 ("\C-b" . dw-backward)
				 ("\C-n" . dw-next-line)
				 ("\C-p" . dw-previous-line)

				 ;vi-style
				 ("h" . dw-backward)
				 ("j" . dw-next-line)
				 ("k" . dw-previous-line)
				 ("l" . dw-forward)

				 ("[" . dw-previous-driline)
				 ("]" . dw-next-dirline)

				 
				 ("\C-c\C-o" . dw-find-file-with-target-buffer)
				 ("\C-c\C-n" . dw-next-frame)
				 ("\C-c\C-p" . dw-previous-frame)
				 ("o" . dw-next-frame)
				 ("i" . dw-previous-frame)
				 ))

(add-hook 'view-mode-hook
	  (lambda ()
	    (define-key  view-mode-map "\C-c\C-n" 'dw-next-frame)
	    (define-key  view-mode-map "\C-c\C-p" 'dw-previous-frame)
	    (define-key  view-mode-map "o" 'dw-next-frame)
	    (define-key  view-mode-map "i" 'dw-previous-frame)
	    ))

;;==setting===
;; (global-set-key "\C-cd" 'dw-dired)
;; (autoload 'dw-dired "directory-walker-mode" "DW-start λ..." t)

(provide 'directory-walker-mode)

使い方

  • dw-diredを呼ぶ(コメントの用に.emacsを設定していると"C-c d"で起動)
    • diredが別のframeで起動する(でも、diredの関数はあまり使わない)
  • dired(っぽい感じのbuffer)での操作
    • j(↓),k(↑)で上下移動できる
    • h(←)で一つ上の階層に行く
    • l(→)で現在のカーソルがディレクトリならサブディレクトリを開く
    • l(→)で現在のカーソルがファイルならdw-diredを起動したバッファのところで開く
  • 開いたbuffer上での操作
    • view-modeで開かれる
  • iとoとでそれぞれのframeをtoggleできる。