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


10

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

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

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

Я ищу решение сначала скопировать элементы, а затем вставить их в соответствующий буфер.

Есть связанный вопрос Как быстро скопировать / переместить файл в Emacs 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(нулевой префикс 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), которая находится в меню строки меню Dir как пункт Dired Files, расположенные где угодно . Вы можете пометить, а затем вставить (скопировать) такие произвольные файлы из буфера Dired в любой каталог.


Обновление 2019-04-22:

Я также добавил возможность перемещать (а не просто вставлять) файлы, чьи (абсолютные) имена вы скопировали в список уничтожений в текущий (или другой) каталог. Это обязательно C-wв Dired.

diredp-move-files-named-in-kill-ringпредставляет собой интерактивную функцию Лиспа в dired+.el.

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

Переместите файлы, чьи абсолютные имена вы скопировали, в текущий каталог.

С неотрицательным префиксом arg вам вместо этого предлагается указать целевой каталог.

С не положительным префиксом arg вы можете увидеть подробную информацию о файлах, если вы нажмете, 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использует значение этой переменной, а не то, что в данный момент находится во главе списка уничтожений.

Когда звонят из Лисп:

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

Работал хорошо. Должен ли diredp C-wперемещать / переименовывать файл вместо копирования? Спасибо
Аззамса

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

Конечно. Я имею в виду, почему вы не добавите эту функцию? это было бы круто :). Потому что ток, только поддержка Cy. Только копировать, не перемещать / переименовывать.
Аззамса

Сейчас же. Я использую Dired-Ranger Hack для этого Спасибо.
Аззамса

К вашему сведению - теперь вы можете использовать C-wдля перемещения файлов, имена которых вы скопировали.
Дрю

4

Вы можете сделать следующее в vanilla Dired (сторонняя библиотека не требуется):

  1. Сначала перейдите в буфер Dired, в котором указан целевой каталог .

  2. Поместив курсор на строку заголовка каталога для вывода списка целевого каталога, используйте w(команда dired-copy-filename-as-kill). Это копирует абсолютное имя этого целевого каталога. (Вы можете скопировать имя каталога из любой строки заголовка дополнительного каталога Dired-list таким же образом.)

  3. Перейдите в буфер Dired, в котором перечислены файлы, которые вы хотите скопировать . Отметьте эти файлы.

  4. Используйте C(команду dired-do-copy) для копирования отмеченных файлов . В командной строке используйте C-yдля вставки (абсолютного) имени целевого каталога . Вы можете просто вставить его, не удосужившись удалить каталог по умолчанию, который вставлен в минибуфер. (Вставка после того, как это имя по умолчанию dir затемняет это имя по умолчанию - оно игнорируется.)

Я думаю, что это так же просто, как то, что вы описали ( C-wдля копирования отмеченных имен файлов, за которыми следует C-yцелевой листинг Dired), но в обратном порядке : сначала вы копируете имя целевого каталога, а затем вставляете его в команду C( dired-do-copy) ,

( dired-do-copyпроверяет наличие файлов с таким же именем в целевой директории и т. д.)


Совет: (Это не нужно, если вы используете Dired + - см. Мой другой ответ здесь.) Если вы собираетесь копировать (или перемещать) файлы из нескольких каталогов в один и тот же целевой каталог, и вы, возможно, делаете другие вещи с помощью kill-ring между ними, чтобы скопированное имя целевого каталога больше не было первым в списке уничтожений, а затем используйте дополнительный выбор, чтобы выбрать имя целевого директора. Вторичный выбор не зависит от региона или положения курсора - вы можете вставить его столько раз, сколько хотите, независимо от изменений в kill-ring. Вы можете вставить его с помощью мыши, но его удобнее использовать 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

2

Файловый менеджер Ranger работает так, как вы описываете, но он вдохновлен vim (таким образом, привязка клавиш vim yyк yank / copy pto paste и т.д.). Emacs также имеет реализацию Ranger. Попробуйте, может быть, это будет соответствовать вашим потребностям.

Для себя я использую emacs sunrise-commander, который похож на 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

Dired Ranger был верным решением для меня:

Вы можете добиться общего поведения файлового проводника, как вы описываете, просто с помощью этой простой конфигурации (при условии, что вы используете 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.