kobapan@wiLiki
Login
Emacs

Emacs:buffer-listからファイルとディレクトリの一覧をフルパスで取得

完成形

=>("/path/to/file" "/path/to/directories/")

問題の数々

1. 開いているバッファの一覧は、関数 buffer-list で取得できる。しかし、*scrach*バッファなどの実体のないバッファも含まれてしまう。

(buffer-list)
=> (#<buffer *scratch*> #<buffer bookmark-buffers.el> #<buffer bookmark-buffers> #<buffer *Messages*> #<buffer  *code-conversion-work*>)

2. ファイルならば、関数 buffer-list が返すバッファオブジェクトのリストから、関数 buffer-file-name にオブジェクトを渡せば、 フルパスを取得できる。

(mapcar
 (lambda (x)
   (buffer-file-name x))
 (buffer-list))
=>(nil "/path/to/bookmark-buffers.el" nil nil nil)

3. 問題はディレクトリ。ディレクトリならば、関数 buffer-name にバッファオブジェクトを渡せば取れる。

(mapcar
 (lambda (x)
   (buffer-name x))
 (buffer-list))
=>("*scratch*" "bookmark-buffers.el" "bookmark-buffers" "*Messages*" " *code-conversion-work*")

しかし、diredバッファオブジェクトからフルパスを取得する関数はない。

4. そこで 関数 set-buffer で各バッファを訪れた上で、カレントバッファのパスを取得する。

(set-buffer x)
(or (buffer-file-name) list-buffers-directory)

Variable: list-buffers-directory

This buffer-local variable specifies a string to display in a buffer listing where the visited file name would go, for buffers that don't have a visited file name. Dired buffers use this variable.

このバッファローカルな変数は、訪問しているファイル名を持たないバッファに対して、バッファ一覧において訪問しているファイル名を表示する部分に表示する文字列を指定する。diredのバッファはこの変数を使う

↑なに言ってるかわかんない。。。けど助かった。

buffer-nameとbuffer-file-name

buffer-name バッファ名

buffer-file-name バッファが開いているファイルのフルパス

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...