next up previous
Next: 5.5 フレームサイズを変える例 Up: 5 Emacslisp Previous: 5.3 ディレクトリ表示

5.4 ファイルブラウザの例

コマンドとして, n,pで表示行を選んで,fコマンドで ファイルならば内容を表示し,ディレクトリならば そのディレクトリへ入ってbrowserを再帰的に 呼び出すものを以下に示す.
(defun browser (dir)
  "ファイルブラウザ"
  (interactive "fディレクトリ: ")
  (setq dir (expand-file-name dir))
  (if
      (null (file-directory-p dir))
      (error "存在するディレクトリを指定してください"))
  (let
      ((filelist (directory-files dir)) f header)
    (switch-to-buffer "*file headings*")
    (cd dir)
    (erase-buffer)
    (while filelist
      (setq f (car filelist))
      (insert f)
      (move-to-column 32 t)
      (cond
          ((file-directory-p f)
           (insert "<Directory>\n"))
        (t
         (save-excursion
           (set-buffer (get-buffer-create "*tmp*"))
           (insert-file-contents f nil 0 80)
           (skip-chars-forward " \t\n")
           (setq header
                 (buffer-substring
                  (point)
                  (progn (end-of-line)
                         (point)))))
         (insert header "\n")))
      (setq filelist (cdr filelist)))
    (kill-buffer "*tmp*")
    (goto-char (point-min))
    (use-local-map browser-mode-map)
    (setq major-mode 'browser-mode
          mode-name "browserdir")))

(defun browser-next-line (arg)
  "ARG行進める"
  (interactive "p")
  (forward-line arg)
  (browser-show-heading))

(defun browser-previous-line (arg)
  "ARG行戻る"
  (interactive "p")
  (browser-next-line (- arg)))

(defun browser-show-heading ()
  "今の行のファイルを隣のウィンドウへ表示する"
  (interactive)
  (let ((file (browser-get-filename))
        (hbuffer (get-buffer-create "*headings*"))
        (sw (selected-window)))
    (save-excursion
      (set-buffer hbuffer)
      (erase-buffer)
      (cond
          ((file-directory-p file)
           (insert "ディレクトリ"))
        (t
         (insert-file-contents file nil 0 (* 40 80)))))
    (pop-to-buffer hbuffer)
    (select-window sw)))

(defun browser-get-filename ()
  "カレント行のファイル名を取得"
  (save-excursion
    (beginning-of-line)
    (buffer-substring
     (point)
     (progn (skip-chars-forward
             "^ \t") (point)))))

(defun browser-find-file ()
  "カレント行のファイルをオープン"
  (interactive)
  (let ((file (browser-get-filename)))
    (cond
        ((file-directory-p file)
         (browser file))
      (t (find-file (browser-get-filename))))))

(progn
  (defvar browser-mode-map (make-keymap) "browserのキーマップ")
  (define-key browser-mode-map "n" 'browser-next-line)
  (define-key browser-mode-map "p" 'browser-previous-line)
  (define-key browser-mode-map "f" 'browser-find-file))
(expand-file-name "~")
"e:/home/inaba"
(file-name-nondirectory (expand-file-name "~"))
"inaba"
(file-exists-p (expand-file-name "~"))
t
(file-executable-p (expand-file-name "~"))
t
(file-directory-p (expand-file-name "~"))
t
(file-readable-p (expand-file-name "~"))
t
(file-writable-p (expand-file-name "~"))
t
(file-symlink-p (expand-file-name "~"))
nil
(file-modes (expand-file-name "~"))
511


generated through LaTeX2HTML. M.Inaba 平成18年5月7日