1 つの Dired バッファ内の複数の無関係なディレクトリ

1 つの Dired バッファ内の複数の無関係なディレクトリ

複数の無関係な (サブディレクトリではない) ディレクトリを 1 つの dired バッファに挿入するにはどうすればよいでしょうか。私の場合、複数のファイル変更 (たとえば、'wdired' モードで複数の名前変更と変更、または単に異なるディレクトリに複数のマーク) を含む無関係なディレクトリを含む dired バッファを準備し、視覚的に再確認してから、1 回のキーストロークで実行したいと考えています。

答え1

関数の(最初の)引数として、ディレクトリ名の代わりに文字列のリストを指定しますdired

  • リストの最初の要素は Dired バッファの名前です。

  • リスト内の他の要素はディレクトリまたはファイル名です。

結果の Dired バッファには、リスト内の各要素の行が含まれます。

リストされているディレクトリは、もちろん、iDired バッファで を使用して挿入 (つまり、そのファイル リストに展開) できます。

たとえば、これを評価します。

(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))

ここで、 はDIRNディレクトリ名 (文字列)、 はFILENファイル名 (文字列) です。 の現在の値に対する絶対名または相対名を使用できますdefault-directory

ここでの結果は、ディレクトリとmy dired bufferの行とファイル、、を含む Dired バッファ です。DIR1DIR2FILE1FILE2FILE3

質問の残りの部分はよくわかりません。ただし、上記の結果の Dired バッファは通常の Dired バッファです。 を使用してwdired変更などを許可できます。


アップデート#1あなたのコメントを受けて --

いい指摘ですね。はい、Dired のi( dired-maybe-insert-subdir) では、挿入されたサブディレクトリがすべて同じディレクトリ ツリーに属している必要があります。理由はわかりません。おそらく、 の処理を​​扱うコードの一部 (考慮すべきコードはたくさんあります) がlsそれに依存しているのでしょう。あるいは、実際には必要のない制限なのかもしれません。

この制限に対処する (回避する) 方法の 1 つは、リストに含めるすべてのサブディレクトリの共通の祖先ディレクトリから開始することです。つまり、M-x cdDired バッファを作成する前に、その共通の祖先ディレクトリから開始します。極端な場合、これはルート ディレクトリを意味します。これはすべてのケースで確実に機能します。リストにM-x cd渡すディレクトリとファイルには、絶対ファイル名を使用する必要がある可能性があります。dired

しかし、おっしゃるとおり、MS Windows を使用しており、ディレクトリが異なるドライブ文字にある場合、これは解決策ではありません。

以下は、試すことができる別の方法です。他の場所で問題が発生するかどうかはわかりません。(発生する場合、どのような問題が発生したかを知りたいです。ライブラリのファイルヘッダーを参照してください。dired+.el連絡先情報。

dired-aux.elファイル:dired-insert-subdirとからこれら 2 つの関数のソース コードをコピーしdired-insert-subdir-newpos、次のようにコピーを変更します。

  • の場合dired-insert-subdir、この行をコメントアウトします。

    (dired-insert-subdir-validate dirname switches)
    
  • の場合dired-insert-subdir-newpos、コードを次のように変更します。

    (defun dired-insert-subdir-newpos (new-dir)
      ;; Find pos for new subdir, according to tree order.
      (let ((alist  dired-subdir-alist)
            elt dir new-pos)
        (while alist
          (setq elt    (car alist)
                alist  (cdr alist)
                dir    (car elt))
          (if (dired-tree-lessp dir new-dir)
              ;; Insert NEW-DIR after DIR
              (setq new-pos  (dired-get-subdir-max elt)
                    alist    ())
            (setq new-pos  (point-max))))
        (goto-char new-pos))
      ;; want a separating newline between subdirs
      (unless (eobp) (forward-line -1))
      (insert "\n")
      (point))
    

次に、標準の Dired コードをロードした後で変更したコードをロードし、元の関数を効果的に置き換えます。(あるいは、それらの関数をアドバイスすることもできます。)

これにより、共通の祖先ディレクトリから開始する必要がなくなり、期待どおりに動作するようです。ただし、前述したように、Dired (または Wdired) コードの他の部分がこのような変更によって影響を受けるかどうかはわかりません。少し実験してみてください。

ただし、dired-insert-subdir-validate実際には 2 つの項目をチェックしますが、そのうちの 1 つだけを削除する必要があります (おそらく)。挿入するサブディレクトリが同じディレクトリ ツリー内にあるかどうかをチェックするほかに、lsそのスイッチがリスト全体のスイッチと互換性があるかどうかもチェックします。すべて削除しても問題は発生しませんdired-insert-subdir-validateが、このスイッチ チェックが本当に重要な場合は、ディレクトリ ツリーをチェックするこのコード部分だけを削除してみてくださいdired-insert-subdir-validate

  (or (dired-in-this-tree dirname (expand-file-name default-directory))
      (error  "%s: not in this directory tree" dirname))

このようなコード変更が簡単に修正できない望ましくない副作用をもたらさないように思われる場合は、ダイレッド+

この点を指摘していただきありがとうございます。私は通常、共通の祖先からこのようなリストを作成しているため、これまでこの制限に気付いていませんでした。


ところで、私は、次の機能強化リクエストについて Emacs の「バグ」#18421 を提出しました: Dired が同じツリーにないディレクトリ リストに対応できるようにします。


* アップデート #2 *

この機能を追加しましたダイレッド+

私は定義を修正しましたC-x ddired)、C-x 4 ddired-other-window)、 そしてC-x 5 d( dired-other-frame) なので、非正のプレフィックス引数 (例: C-- C-x d) を使用すると、(1) Dired バッファ名 (任意の名前、必ずしもディレクトリ名である必要はありません) と (2) 一覧表示する個々のファイルまたはディレクトリの入力を求められます。

非負のプレフィックス引数の場合も、ls使用するスイッチの入力を求めるプロンプトが表示されます。(C-0スイッチの入力を求めるプロンプトと、一覧表示するバッファ名とファイルの入力を求めるプロンプトの両方が表示されます。)

直したi( dired-maybe-insert-subdir) を使用すると、任意のディレクトリで動作します。もちろん、プレフィックス引数を使用して、挿入されたサブディレクトリ リストに使用するiさまざまなスイッチを指定することもできます。ls

関連情報