diredバッファ間でファイルとディレクトリをコピー/貼り付ける簡単な方法


10

M-w C-y2つのdiredバッファ間でファイルとディレクトリを貼り付ける簡単な方法はありますか?

一部のアイテム(ファイルとバッファー)をマークmしてM-w(または別のショートカット)でコピーしてから、別のdiredバッファーに移動します(これは、必ずしも前のdiredバッファーのウィンドウによってウィンドウ内に並んでいるとは限りません)。 )その後、yankingすべてのコピーされたファイルC-y(または別のショートカット)がありますか?これは、さまざまなOSの多くのファイルエクスプローラーで実行できる単純なタスクです。

古典的なコピーオプションCの問題は、それが押されるとすぐに宛先を要求することです。宛先バッファのパスが非常に長い場合、または開かれたdiredバッファが多すぎる場合、このアプローチは複雑になります。

最初にアイテムをコピーしてから、適切なdiredバッファーに貼り付けるソリューションを探しています。

関連する質問があります迅速にEmacsのdiredで/移動ファイルをコピーする方法は? これは、オプションを使用して2つのdiredウィンドウが垂直に分離されているときにCを押すという従来のアプローチを使用しています(setq dired-dwim-target t)

これを達成する方法は何ですか?

回答:


5

この機能をDired +に追加しました。

C-y(コマンドdiredp-yank-files)を使用して、絶対名をキルリングにコピーしたファイルを現在のディレクトリに貼り付けることができます。ここで「現在のディレクトリ」とはdired-current-directory、カーソルが置かれている挿入されたサブディレクトリ、またはカーソルがサブディレクトリリストにない場合はDiredメインディレクトリを返します。

プレフィックスargをC-y使用すると、代わりに貼り付けのターゲットディレクトリを指定するように求められます。したがって、ディレクトリにファイルを貼り付けるためにDiredバッファにいる必要はありません。

M-0 wまたはを使用して、ファイル名をキルリングにコピーしておく必要がありますM-x diredp-copy-abs-filenames-as-kill

Dired +では、これらのコマンドは変数diredp-last-copied-filenamesを同じファイル名の文字列に設定します。 C-y現在、キルリングの先頭にあるものではなく、その変数の値を使用します。つまり、ファイル名をコピーした直後に貼り付ける必要はありません。そして、ファイル名をキルリングにコピーする代わりに、その名前を変数に(たとえば、プログラムで)入れるだけでよいことを意味します。

を使用するとC-y、確認を求められます(yまたはn)。lプロンプトが表示されたら(「リスト」の場合)を押して、貼り付けられるファイルのリストを表示することもできます。


現在のDiredバッファーからマークされたファイルと、再帰的に定義されたマークされたサブディレクトリ内のマークされたファイルをコピーすることもできます。そのためにはM-0 M-+ M-w(コマンドでゼロのプレフィックス引数diredp-copy-filename-as-kill-recursive)を使用するか、を使用しますM-x diredp-copy-abs-filenames-as-kill-recursive


Dired +を使用すると、どこからでも任意の数のファイルとディレクトリを一覧表示するDiredバッファーを簡単に作成できることに注意してください。つまり、リストされているエントリは、同じディレクトリまたは関連ディレクトリにある必要はありません。C-x D F(コマンドdiredp-dired-for-files)を参照してください。これは、Dirメニューバーメニューの項目Dired Files Located Anywhereとしてあります。そのような任意のファイルをマークして、Diredバッファーから任意のディレクトリに貼り付ける(コピーする)ことができます。


アップデート2019-04-22:

また、キルリングにコピーした(絶対)名のファイルを現在の(または別の)ディレクトリに移動する(貼り付けるだけでなく)機能も追加しました。これはC-wDiredに拘束されています。

diredp-move-files-named-in-kill-ringのインタラクティブなLisp関数ですdired+.el

(diredp-move-files-named-in-kill-ring &optional DIR NO-CONFIRM-P DETAILS)

絶対名をコピーしたファイルを現在のディレクトリに移動します。

負でないプレフィックス引数を使用すると、代わりにターゲットディレクトリの入力を求められます。

正でないプレフィックス引数を使用lすると、貼り付けの確認を求めるプロンプトが表示されたときにファイルの詳細を確認できます。それ以外の場合は、ファイル名のみが表示されます。表示される詳細はオプションによって定義されます diredp-list-file-attributes

M-0 wまたはを使用して、ファイル名のリストを文字列としてキルリングにコピーしておく必要がありますM-x diredp-copy-abs-filenames-as-kill。これらのコマンドは、変数diredp-last-copied-filenamesを同じ文字列に設定します。 diredp-move-files-named-in-kill-ring現在、キルリングの先頭にあるものではなく、その変数の値を使用します。

Lispから呼び出された場合:

  • オプションのarg NO-CONFIRM-Pは、移動の確認を求めないことを意味します。
  • オプションの引数DETAILSがに渡されdiredp-y-or-n-files-pます。

うまくいきました。diredpはC-w、コピーではなくファイルを移動/名前変更する必要がありましたか?ありがとう
azzamsa 2018年

@azzamsa:いいえ、そうは思いません。(私は、kill-ringDiredにそれらのファイルをどこかに移動するように指示するためににあるファイル名を使用することを意味していると思います。たとえば、移動先のプロンプトを出します。)
Drew

承知しました。つまり、この機能を追加しないのですか?素晴らしいものになるだろう :)。現在のところ、Cyのみをサポートしています。コピーのみ、移動/名前変更は不可。
azzamsa、2018年

今。私はこのおかげでdired-rangerハックを使用します。
azzamsa 2018年

FYI- C-w名前をコピーしたファイルの移動に使用できるようになりました。
ドリュー

4

vanilla Diredで以下を実行できます(サードパーティのライブラリは必要ありません)。

  1. まず、ターゲットディレクトリをリストするDiredバッファに移動します。

  2. ターゲットディレクトリのリストを表示するには、ディレクトリヘッダー行にカーソルを合わせて、w(コマンドdired-copy-filename-as-kill)を使用します。これにより、そのターゲットディレクトリの絶対名がコピーされます。(同じ方法で、Dired-listing subdirヘッダー行からdir名をコピーできます。)

  3. コピーするファイルがリストされているDiredバッファに移動します。それらのファイルをマークします。

  4. C(コマンドdired-do-copy)を使用して、マークされたファイルコピーします。プロンプトで、を使用C-yして、ターゲットディレクトリの(絶対)名前貼り付けます。ミニバッファに挿入されているデフォルトのディレクトリを削除する手間をかけずに、単に貼り付けることができます。(そのデフォルトのディレクトリ名の後に貼り付けると、そのデフォルトの名前は淡色表示されます-無視されます。)

これは、あなたが説明するのと同じくらい簡単です(C-wマークされたファイル名をコピーC-yし、その後にターゲットのDiredリストでコピーする)が、順序は逆です:最初にターゲットディレクトリ名をコピーしてから、それをCdired-do-copy)コマンドに貼り付けます。

dired-do-copyターゲットディレクトリなどに同じ名前の既存のファイルがあるかどうかを確認します)


ヒント:Dired +を使用している場合は必要ありません。他の回答はこちらをご覧ください。)複数のディレクトリから同じターゲットディレクトリにファイルをコピー(または移動)するつもりで、kill-ringで他のことをしている可能性がある場合その間、コピーされたターゲットディレクトリ名がkill-ringの最初にない場合があるため、2次選択を使用してターゲットディレクトリ名を選択します。2番目の選択は、リージョンやカーソルの位置に依存しません-キルリングの変更に関係なく、何回でも貼り付けることができます。マウスを使用して貼り付けることができますがC-M-y、ライブラリから使用する方が便利second-sel.elです。


2

あなたのアイデアは簡単に聞こえます。多分あなたは自分でそれを実装することを試みることができます。もし望むなら、以下を使って始めることもできます。

(defvar your-dired-copy-list nil)

(defun your-dired-copy ()
  (interactive)
  (setq your-dired-copy-list (dired-get-marked-files)))

(defun your-dired-paste ()
  (interactive)
  (when your-dired-copy-list
    (shell-command
     (mapconcat
      #'shell-quote-argument
      `("cp" "-r" ,@your-dired-copy-list ,default-directory)
      " "))
    (setq your-dired-copy-list nil)))

どうもありがとうございました。私は提案があります:貼り付けた後、新しくコピーされたアイテムを表示するために、diredバッファを更新(リフレッシュ)します。
名前を

別の提案:貼り付けた後、マークされたアイテムのマークを外します。
名前

@名前良い提案。あなたがそれを使うつもりなので、自分で実装することをお勧めします。幸運を。
xuchunyang 2018

2

レンジャーファイルマネージャーはあなたが説明する方法で動作しますが、vim(したがってyy、yank / copy pto pasteなどのvimキーバインディング)に触発されています。Emacsにもレンジャーの実装があります。試してみてください。おそらくあなたのニーズに合うでしょう。

私自身は、二重パネルのファイル管理が必要だと感じるたびに、Midnight Commander(mc)に似たemacs sunrise-commanderを使用しています。

Upd:dired-rangerには、あなたが説明したコピー/貼り付けがあります。少なくともドキュメントでは。

;; Multi-stage copy/pasting of files
;; ---------------------------------

;; A feature present in most orthodox file managers is a "two-stage"
;; copy/paste process.  Roughly, the user first selects some files,
;; "copies" them into a clipboard and then pastes them to the target
;; location.  This workflow is missing in dired.

;; In dired, user first marks the files, then issues the
;; `dired-do-copy' command which prompts for the destination.  The
;; files are then copied there.  The `dired-dwim-target' option makes
;; this a bit friendlier---if two dired windows are opened, the other
;; one is automatically the default target.

;; With the multi-stage operations, you can gather files from
;; *multiple* dired buffers into a single "clipboard", then copy or
;; move all of them to the target location.  Another huge advantage is
;; that if the target dired buffer is already opened, switching to it
;; via ido or ibuffer is often faster than selecting the path.

;; Call `dired-ranger-copy' to add marked files (or the file under
;; point if no files are marked) to the "clipboard".  With non-nil
;; prefix argument, add the marked files to the current clipboard.

;; Past clipboards are stored in `dired-ranger-copy-ring' so you can
;; repeat the past pastes.
;; ...

あるdired-rangerrangerMELPAに利用できます。どっち?
名前

まあ、私はdired-rangerについては知りませんでしたが、説明から、あなたが望むsmthのように見えます。
Maxim Kim、

1

私も使用することをお勧めしますdired-ranger。これは私が私の中に持っているものですinit.el

(use-package dired-ranger
  :ensure t
  :config
  (setq dired-ranger-copy-ring-size 1)
    (define-key dired-mode-map (kbd "C-w")
        (lambda ()
            (interactive)
            (dired-ranger-copy nil) ; t adds item to dired-ranger-copy-ring
            (define-key dired-mode-map (kbd "C-y") 'dired-ranger-move)))
    (define-key dired-mode-map (kbd "M-w")
        (lambda ()
            (interactive)
            (dired-ranger-copy nil)
            (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)))
)

0

Diredレンジャーは私にとって真の解決策でした:

あなたが説明するように、この単純な設定を使用するだけで、一般的なファイルエクスプローラーの動作を実現できます(使用する場合use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.