Elispを使用して現在のDiredバッファー内のすべてのファイル名を取得する


10

タイトルが示すように、Elispを使用してDiredバッファー内のすべてのファイルエントリを取得するにはどうすればよいですか?


1
この質問が見た目と同じくらい簡単であれば、必要なのはだけですdirectory-files
Jordon Biondo 2014年

@JordonBiondo別のより一般的な関数を知っておくと便利です。もともと私with-current-bufferはDiredバッファでファイルまたはマークされたファイルのリストを取得することを意図していました。すべてのファイルのリストについては、を使用できますdirectory-files
Tu Do

@JordonBiondoもう一度やってみました。あなたの方法は、「適切な」Diredバッファーがある場合にのみ機能します。別のディレクトリからの任意のファイルで挿入されたカスタムのDiredバッファがある場合、それdirectory-filesはオプションではありません。
2014

回答:


7

マークの操作は不要で、おそらく問題があります。

明らかに、この種のことを行う機能が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バージョンはありますか?CLは好きですが、CL依存関係をProjectileで使用できません。
2014

cl-flet関数を定義するだけです。これにより、コードがすっきりしますが、それは単なる関数なので、必要に応じて定義してください。または、まったく使用せずdired-map-dired-file-lines、代わりにコードを複製して必要に応じて変更します。
phils 2014年

あなたが正しいです。マークを切り替えると、古いマークがクリアされるため、問題があります。あなたの答えは正しいと思います。
Tu Do

あなたのソリューションはファイルのみを取得し、ディレクトリは取得しないようです。可能な場合は更新してください。
Tu Do

ええ、私はちょうどに変更したdired-get-filenameために一部(dired-get-filename t t)のすべてを取得します。
Tu Do

6

これを行う単一の関数があるかどうかはわかりませんが、これでうまくいきます。

(let (r)
  (dired-unmark-all-files ?\r nil)
  (dired-toggle-marks)
  (setq r (dired-get-marked-files))
  (dired-toggle-marks)
  r)

場合によっては、次のように簡略化できます。

(progn (dired-toggle-marks)
       (dired-get-marked-files))

3

@ abo-aboの回答に加えて、ファイル(&dir)名のリストを取得する方法を説明します。

必要に応じて、の代わりにdired-copy-filename-as-kill(にバインドw)を使用することもできますdired-get-marked-files

これは、単一の、スペースで区切らにファイル名を置き、文字列、およびにその文字列をプッシュkill-ring

(もちろん、スペースで区切ると、ファイル名自体にスペース文字が含まれている場合はそれほど役に立ちません。;-))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.