Прості способи копіювання / вставки файлів і каталогів між розведеними буферами


10

Чи є простий M-w C-yпідхід до копіювання файлів і каталогів вставлення між двома розведеними буферами?

Я маю на увазі маркування деяких елементів (файлів і буфера), mпотім скопіювавши їх M-w(або інший ярлик), потім перейшовши на інший розроблений буфер (який не обов'язково знаходиться у вікні поруч із вікном попередніх переведених буферів) ) тоді yankingвесь скопійований файл C-y(або інший ярлик) там? Це просте завдання, яке можуть виконати багато дослідників файлів у різних ОС.

Проблема з класичним варіантом копіювання C у розділеному варіанті полягає в тому, що як тільки його натискають, він запитує місце призначення. Якщо шлях до буфера призначення дуже довгий або в ньому занадто багато відкритого буфера, що відкривається, такий підхід є складним.

Я шукаю рішення спочатку скопіювати елементи, а потім вставити їх у відповідний розділений буфер.

Існує пов'язане питання Як швидко скопіювати / перемістити файл в Emacs Dired? який використовує класичний підхід натискання клавіші C, коли два вертикально відокремлених вікна розділені вертикально за допомогою опції (setq dired-dwim-target t).

Які способи досягти цього?

Відповіді:


5

Зараз я додав цю функцію до Dired + .

Ви можете використовувати C-y(команду diredp-yank-files), щоб вставити файли, абсолютні імена яких ви скопіювали в кільце вбивства, у поточний каталог. Тут dired-current-directoryповертається "поточна директорія" : вставлений підкаталог, де знаходиться курсор, або основний каталог Dired, якщо курсор відсутній у списку субдір.

За допомогою аргументу з префіксом C-yзамість цього буде запропоновано вказати цільовий каталог для пасти. Таким чином, вам не потрібно знаходитись у в'язаному буфері, щоб вставити файли в каталог.

Ви повинні були скопіювати імена файлів у кільце для вбивства за допомогою 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(нульовий префікс arg з командою 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), що знаходиться в меню панелі " Дір", як пункт " Оброблені файли" . Ви можете помітити та потім вставити (скопіювати) такі довільні файли з буфера, що перебуває в подвійному режимі, до будь-якого каталогу.


Оновлення 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використовує значення цієї змінної, не те, що зараз знаходиться на чолі кільця вбивства.

Коли телефонують з Ліспа:

  • Необов’язкові NO-CONFIRM-Pзасоби аргументу не вимагають підтвердження для переміщення.
  • Необов’язковий аргумент DETAILSпередається до diredp-y-or-n-files-p.

Працювали приємно. Чи довелося diredp C-wпереміщувати / перейменувати файл замість копії ?. Дякую
azzamsa

@azzamsa: Ні, я не думаю, що так. (Я думаю, ви маєте на увазі використання імен файлів, які є на те, kill-ringщоб сказати Dired перенести ці файли кудись, наприклад, підказки, куди їх перемістити.)
Дрю

Звичайно. Я маю на увазі, чому б вам не додати цю функціональність? це було б приголомшливо :). Тому що струм підтримує лише Cy. Копіювати лише, не переміщувати / перейменувати.
azzamsa

Тепер. Я використовую hared-ranger hack для цієї подяки.
azzamsa

FYI - Тепер ви можете використовувати C-wдля переміщення файлів, імена яких ви скопіювали.
Дрю

4

Ви можете зробити наступне у ванільному режимі (не потрібна стороння бібліотека):

  1. Перш за все, перейдіть до буфера, що пересувається, у якому перелічено цільовий каталог .

  2. За допомогою курсору в рядку заголовка каталогу для переліку цільового каталогу використовуйте w(команду dired-copy-filename-as-kill). Це копіює абсолютну назву цього цільового каталогу. (Ви можете скопіювати ім’я dir з будь-якого рядка заголовка піддіру Dired-listing таким же чином.)

  3. Перейдіть до буфера Dired, у якому перераховані файли, які потрібно скопіювати . Позначте ці файли.

  4. Використовуйте C(команда dired-do-copy) для копіювання позначених файлів . У відповідь підкажіть, C-yщоб вставити (абсолютне) ім'я цільового каталогу . Ви можете просто вставити його, не турбуючись, щоб видалити каталог за замовчуванням, який вставлений у мінібуфер. (Вставляючи його після цього типового імені дира, затьмарюється це ім'я за замовчуванням - воно ігнорується.)

Я думаю, це так просто, як те, що ви описуєте ( C-wскопіювати позначені імена файлів, C-yподані в цільовому списку Dired), але порядок протилежний : спершу ви скопіюєте ім'я цільового каталогу, а потім вставите його в команду C( dired-do-copy) .

( dired-do-copyперевірка наявних файлів з однойменною назвою в цільовому режимі тощо)


Порада: (Це не потрібно, якщо ви використовуєте Dired + - дивіться мою іншу відповідь тут.) Якщо ви маєте намір скопіювати (або перемістити) файли з декількох каталогів в один і той же цільовий каталог, і ви можете робити інші речі з програмою kill-ring між ними, щоб скопійоване ім'я цільового dir більше не було спочатку в кільце для введення, а потім використовуйте вторинний вибір для вибору імені цільового dir. Вторинний вибір не залежить від регіону або положення курсору - ви можете вставити його скільки завгодно разів, незалежно від змін у кільце для вбивства. Ви можете вставити його за допомогою миші, але зручніше використовувати його C-M-yз бібліотеки second-sel.el.


3

Ваша ідея звучить прямо, можливо, ви можете спробувати її реалізувати самостійно, ви також можете скористатися наступним, щоб почати, якщо хочете.

(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)))

Дуже дякую. У мене є пропозиція: після вставлення оновіть (оновіть) відредагований буфер, щоб побачити нові скопійовані елементи.
Ім'я

Ще одна пропозиція: зняти позначення позначених елементів після вставки.
Ім'я

@Name Гарні пропозиції. Я рекомендую вам реалізувати їх самостійно, оскільки ви є тим, хто збирається ним скористатися. Удачі.
xuchunyang

2

Менеджер файлів Ranger працює так, як ви описуєте, але його надихає vim (таким чином, vim-прив'язки клавіш yyвимкнути / скопіювати, pщоб вставити тощо). Emacs також має реалізацію рейнджера. Спробуйте, можливо, це відповідатиме вашим потребам.

Я для себе використовую emacs sunrise-командир, який схожий на Midnight Commander (mc), коли я відчуваю, що мені потрібно керувати двома панелями-файлами.

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-rangerі rangerдоступні на MELPA. Ти маєш на увазі який?
Ім'я

ну, я не знав про dired-ranger, але з опису це виглядає як щось, що ви хочете.
Максим Кім

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

Вірний рейнджер був справжнім рішенням для мене:

Ви можете домогтися загальної поведінки провідника файлів, як ви описуєте, лише за допомогою цього простого конфігурації (якщо використовувати його use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.