タイトルが示すように、Elispを使用してDiredバッファー内のすべてのファイルエントリを取得するにはどうすればよいですか?
with-current-buffer
はDiredバッファでファイルまたはマークされたファイルのリストを取得することを意図していました。すべてのファイルのリストについては、を使用できますdirectory-files
。
directory-files
はオプションではありません。
タイトルが示すように、Elispを使用してDiredバッファー内のすべてのファイルエントリを取得するにはどうすればよいですか?
with-current-buffer
はDiredバッファでファイルまたはマークされたファイルのリストを取得することを意図していました。すべてのファイルのリストについては、を使用できますdirectory-files
。
directory-files
はオプションではありません。
回答:
マークの操作は不要で、おそらく問題があります。
明らかに、この種のことを行う機能がdired内にあります(十分に文書化されていません)。ここに簡単なアプローチがあります:
;; Silence compile-time warning:
(declare-function dired-map-dired-file-lines "dired-aux")
(defun my-dired-files ()
"Return a list of files (only) in the current dired buffer."
(eval-when-compile (require 'cl-lib))
(require 'dired-aux)
(let (flist)
(cl-flet ((fpush (fname) (push fname flist)))
(dired-map-dired-file-lines #'fpush))
(nreverse flist)))
編集:
コメントで、結果のリストにファイルパスだけでなくディレクトリパスも含めたいと言っています。
dired-map-dired-file-lines
ディレクトリを明示的に除外し、それらを含めるオプションはありません。しかし、元の関数をコピーして不要なテストを省略するだけで、関数を定義するのは簡単です。
(defun my-dired-map-over-files-and-dirs (fun)
"Perform FUN with point at the end of each file or directory line.
FUN takes one argument, the absolute filename."
(save-excursion
(let (file buffer-read-only)
(goto-char (point-min))
(while (not (eobp))
(save-excursion
(and (not (eolp))
(setq file (dired-get-filename nil t)) ; nil on non-file
(progn (end-of-line)
(funcall fun file))))
(forward-line 1)))))
これをdired-map-dired-file-lines
初期関数の代わりに使用するだけです。その後、declare-function
通話を除外することもできます。
もちろん、関数を呼び出す代わりに、この新しい関数をさらに変更して、目的のリストを直接作成することもできます。より一般的なアプローチは実際には問題ないと思いますが、すべてを単一の関数にラップすることをお勧めします。
cl-flet
関数を定義するだけです。これにより、コードがすっきりしますが、それは単なる関数なので、必要に応じて定義してください。または、まったく使用せずdired-map-dired-file-lines
、代わりにコードを複製して必要に応じて変更します。
dired-get-filename
ために一部(dired-get-filename t t)
のすべてを取得します。
directory-files
。