Proste sposoby kopiowania / wklejania plików i katalogów między buforowanymi buforami

10

Czy istnieje proste M-w C-ypodejście do kopiowania plików wklejania i katalogów między dwoma buforowanymi buforami?

Mam na myśli zaznaczenie niektórych elementów (plików i bufora) poprzez mskopiowanie ich przez M-w(lub inny skrót), a następnie przejście do innego buforowanego bufora (który niekoniecznie znajduje się w oknie obok okna poprzedniego buforowanego bufora (ów) ) to yankingcały skopiowany plik C-y(lub inny skrót) tam? Jest to proste zadanie, które może wykonać wiele eksploratorów plików w różnych systemach operacyjnych.

Problem z klasyczną opcją kopiowania C w dired polega na tym, że zaraz po naciśnięciu pyta o miejsce docelowe. Jeśli ścieżka bufora docelowego jest bardzo długa lub istnieje zbyt wiele otwartych buforów diodowych, takie podejście jest skomplikowane.

Szukam rozwiązania, aby najpierw skopiować elementy, a następnie wkleić je w odpowiednim buforowanym buforze.

Istnieje podobne pytanie Jak szybko skopiować / przenieść plik w Emacs Dired? który wykorzystuje klasyczne podejście do naciskania C, gdy dwa okna z diodami oddzielają się pionowo przy użyciu opcji (setq dired-dwim-target t).

Jakie są sposoby na osiągnięcie tego?

Imię
źródło

Odpowiedzi:

5

Dodałem tę funkcję teraz do Dired + .

Możesz użyć C-y(polecenie diredp-yank-files), aby wkleić pliki, których absolutne nazwy skopiowałeś do pierścienia zabijania, do bieżącego katalogu. dired-current-directoryZwraca „bieżący katalog” : wstawiony podkatalog, w którym znajduje się kursor, lub główny katalog Dired, jeśli kursor nie znajduje się na liście podkatalogów.

C-yZamiast przedrostka arg wyświetla monit o podanie katalogu docelowego do wklejenia. Dlatego nie musisz znajdować się w buforze Dired, aby wkleić pliki do katalogu.

Powinieneś skopiować nazwy plików do pierścienia zabijania za pomocą M-0 wlub M-x diredp-copy-abs-filenames-as-kill.

W Dired + te polecenia również ustawiają zmienną diredp-last-copied-filenamesna ten sam ciąg nazw plików. C-yużywa wartości tej zmiennej, a nie tego, co aktualnie znajduje się na szczycie pierścienia zabijania. Oznacza to, że nie trzeba wklejać natychmiast po skopiowaniu nazw plików. Oznacza to, że zamiast kopiować nazwy plików do pierścienia zabijania, wystarczy umieścić nazwy w tej zmiennej (np. Programowo).

Podczas używania C-ypojawi się monit o potwierdzenie ( ylub n). Możesz także nacisnąć l(dla „listy”) po wyświetleniu monitu, aby wyświetlić listę plików, które zostaną wklejone.


Możesz także skopiować zaznaczone pliki z bieżącego bufora Dired i dowolne zaznaczone pliki w oznaczonych podkatalogach, zdefiniowanych rekurencyjnie . Do tego używasz M-0 M-+ M-w(przedrostek zero z poleceniem diredp-copy-filename-as-kill-recursive) lub używasz M-x diredp-copy-abs-filenames-as-kill-recursive.


Zauważ, że dzięki Dired + możesz łatwo mieć bufor Dired, który wyświetla dowolną liczbę plików i katalogów z dowolnego miejsca. Oznacza to, że wymienione wpisy nie muszą znajdować się w tym samym katalogu ani nawet w powiązanych katalogach. Zobacz C-x D F(polecenie diredp-dired-for-files), które znajduje się w menu paska menu Dir jako element Dired Files Location Anywhere . Możesz oznaczyć, a następnie wkleić (skopiować) takie dowolne pliki z bufora Dired do dowolnego katalogu.


Aktualizacja 22.04.2019:

Dodałem także możliwość przenoszenia (nie tylko wklejania) plików, których (absolutne) nazwy skopiowałeś do pierścienia zabijania do bieżącego (lub innego) katalogu. Jest to związane z C-wDired.

diredp-move-files-named-in-kill-ringto interaktywna funkcja Lisp w dired+.el.

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

Przenieś pliki, których absolutne nazwy skopiowałeś, do bieżącego katalogu.

Z nieujemnym prefiksem arg pojawi się monit o podanie katalogu docelowego.

Z nie dodatnim argumentem przedrostek arg możesz zobaczyć szczegóły dotyczące plików, jeśli klikniesz, lgdy pojawi się monit o potwierdzenie wklejenia. W przeciwnym razie zobaczysz tylko nazwy plików. Szczegóły, które widzisz, są zdefiniowane przez opcję diredp-list-file-attributes.

Powinieneś skopiować listę nazw plików jako ciąg znaków do pierścienia zabijania za pomocą M-0 wlub M-x diredp-copy-abs-filenames-as-kill. Te polecenia również ustawiają zmienną diredp-last-copied-filenamesna ten sam ciąg. diredp-move-files-named-in-kill-ringużywa wartości tej zmiennej, a nie tego, co aktualnie znajduje się na szczycie pierścienia zabijania.

Na wezwanie z Lisp:

  • Opcjonalny argument NO-CONFIRM-Poznacza, że ​​nie pytaj o potwierdzenie przeniesienia.
  • Opcjonalny argument DETAILSjest przekazywany do diredp-y-or-n-files-p.
Rysował
źródło
Dobrze działało. Czy diredp musiał C-wprzenieść / zmienić nazwę pliku zamiast kopiować? Dzięki
azzamsa,
@azzamsa: Nie, nie sądzę. ( kill-ringWydaje mi się, że masz na myśli nazwy plików, które mają na myśli Dired, aby gdzieś przenieść te pliki, np. Z pytaniem, gdzie je przenieść.)
Drew
Pewnie. Mam na myśli, dlaczego nie dodajesz tej funkcjonalności? byłoby świetnie :). Ponieważ obecne, obsługują tylko Cy. Tylko kopiuj, nie przenoś / zmień nazwę.
azzamsa,
Teraz. Do tego dziękuję za pomocą hacku dired-ranger .
azzamsa,
Do Twojej wiadomości - możesz teraz używać C-wdo przenoszenia plików, których nazwy skopiowałeś.
Drew
4

Możesz wykonać następujące czynności w waniliowym Dired (nie wymaga biblioteki innej firmy):

  1. Najpierw przejdź do bufora Dired, który zawiera katalog docelowy .

  2. Gdy kursor znajduje się w wierszu nagłówka katalogu, aby wyświetlić listę katalogu docelowego, użyj w(polecenie dired-copy-filename-as-kill). Spowoduje to skopiowanie bezwzględnej nazwy tego katalogu docelowego. (Możesz skopiować nazwę katalogu z dowolnego wiersza nagłówka katalogu Dired-list w ten sam sposób.)

  3. Przejdź do bufora Dired, który zawiera listę plików, które chcesz skopiować . Zaznacz te pliki.

  4. Użyj C(polecenie dired-do-copy), aby skopiować zaznaczone pliki . W wierszu poleceń użyć C-ydo wklej (absolutny) nazwę katalogu docelowego . Możesz go po prostu wkleić, nie zawracając sobie głowy usunięciem domyślnego katalogu, który jest wstawiany do minibufora. (Wklejenie po domyślnej nazwie katalogu przyciemnia tę domyślną nazwę - jest ignorowane).

Myślę, że jest to tak proste, jak to opisujesz ( C-waby skopiować oznaczone nazwy plików, a następnie C-yw docelowym wykazie Dired), ale kolejność jest odwrotna : najpierw skopiuj nazwę katalogu docelowego, a następnie wklej ją do polecenia C( dired-do-copy) .

( dired-do-copysprawdza istniejące pliki o tej samej nazwie w katalogu docelowym itp.)


Wskazówka: (Nie jest to konieczne, jeśli używasz Dired + - patrz moja inna odpowiedź tutaj.) Jeśli zamierzasz kopiować (lub przenosić) pliki z wielu katalogów do tego samego katalogu docelowego i możesz robić inne rzeczy z pierścieniem zabijania pomiędzy nimi, aby skopiowana docelowa nazwa katalogu nie mogła już być pierwsza w pierścieniu zabijania, a następnie użyj dodatkowego wyboru, aby wybrać docelową nazwę katalogu. Drugi wybór nie zależy od regionu ani pozycji kursora - możesz go wkleić tyle razy, ile chcesz, niezależnie od zmian w pierścieniu zabijania. Możesz go wkleić za pomocą myszy, ale wygodniej jest go używać C-M-yz biblioteki second-sel.el.

Rysował
źródło
3

Twój pomysł brzmi prosto, być może możesz spróbować go wdrożyć samodzielnie, możesz też skorzystać z poniższych wskazówek, aby rozpocząć, jeśli chcesz.

(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)))
Xuchunyang
źródło
Dziękuję Ci bardzo. Mam sugestię: po wklejeniu zaktualizuj (odśwież) bufor buforowany, aby zobaczyć nowe skopiowane elementy.
Imię
Kolejna sugestia: aby odznaczyć zaznaczone elementy po wklejeniu.
Imię
@ Imię Dobre sugestie. Zalecam, abyś wdrożył je samodzielnie, ponieważ to ty będziesz go używać. Powodzenia.
xuchunyang
2

Menedżer plików Ranger działa tak, jak to opisujesz, ale jest inspirowany przez vim (a więc skróty klawiszowe vim yydo szarpania / kopiowania pdo wklejania itp.). Emacs ma również implementację Rangera. Spróbuj, może będzie pasować do twoich potrzeb.

Dla siebie używam emacs sunrise-commander, który jest podobny do Midnight Commander (mc), ilekroć czuję, że potrzebuję zarządzania plikami z podwójnymi panelami.

Aktualizacja: dired-ranger ma opisaną kopię / wklej. Przynajmniej w dokumentach.

;; 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.
;; ...
Maxim Kim
źródło
dired-rangeri rangerdostępny na MELPA. Masz na myśli który?
Imię
cóż, nie wiedziałem o dired-tropicielu, ale z opisu wygląda to tak, jakbyś chciał.
Maxim Kim
1

Sugerowałbym również użyć dired-ranger. Oto co mam w swoim 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)))
)
Timm
źródło
0

Dired Ranger był dla mnie prawdziwym rozwiązaniem:

Za pomocą tej prostej konfiguracji (zakładając, że używasz use-package) możesz osiągnąć typowe zachowanie eksploratora plików zgodnie z opisem.

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
azzamsa
źródło