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 バッファが開いているファイルのフルパス