Dizinli arabellekler arasında dosya ve dizinleri kopyalamanın / yapıştırmanın basit yolları


10

M-w C-yİki direkli arabellek arasındaki yapıştırma dosyalarını ve dizinleri kopyalamak için basit bir yaklaşım var mı ?

Bazı öğeleri (dosyalar ve arabellek) msonra M-w(veya başka bir kısayol) ile kopyalayarak , daha sonra başka bir dired arabelleğe (bu bir önceki dired arabellek (ler) penceresinin yan yana olması gerekmez) işaretleyerek ) sonra yankingtüm kopyalanan dosya C-y(veya başka bir kısayol) var mı? Bu, farklı işletim sistemindeki birçok dosya kaşifinin yapabileceği basit bir görevdir.

Yönlendirilmiş klasik Kopyalama seçeneği C ile ilgili sorun , basıldığı anda hedefe yönelmesidir. Hedef tamponun yolu çok uzunsa veya çok fazla açık dired tamponu varsa, bu yaklaşım karmaşıktır.

Önce öğeleri kopyalamak için uygun bir dired arabelleğe yapıştırmak için bir çözüm arıyorum.

İlgili bir soru Emacs Dired hızlı bir şekilde dosya kopyalama / taşıma nasıl? iki dirsekli pencere opsiyonu ile dikey olarak ayrıldığında klasik C basma yaklaşımını kullanır (setq dired-dwim-target t).

Bunu başarmanın yolları nelerdir?

Yanıtlar:


5

Bu özelliği şimdi Dired + ' a ekledim .

Mutlak adları kill ring'e kopyaladığınız dosyaları geçerli dizine yapıştırmak için C-y(command diredp-yank-files) komutunu kullanabilirsiniz . Burada "geçerli dizin" dired-current-directorydöndürür: imlecin bulunduğu eklenmiş alt dizin veya imleç bir alt dizin listesinde değilse Dired ana dizini.

Bir önek argümanı ile C-yyapıştırmanın hedef dizinini sorar. Bu nedenle, dosyaları bir dizine yapıştırmak için bir Dired buffer'da olmanıza gerek yoktur.

Dosya adlarını M-0 wveya tuşlarını kullanarak kill halkasına kopyalamış olmalısınız M-x diredp-copy-abs-filenames-as-kill.

Dired + 'da bu komutlar da değişkeni diredp-last-copied-filenamesaynı dosya adı dizesine ayarlar . C-yşu anda öldürme halkasının başında ne varsa o değişkenin değerini kullanır. Bu, dosya adlarını kopyaladıktan hemen sonra yapıştırmamanız gerektiği anlamına gelir. Ve bu, dosya adlarını kill halkasına kopyalamak yerine, adları bu değişkene (örneğin programlı olarak) koyabileceğiniz anlamına gelir.

Kullandığınızda sizden C-yonay istenir ( yveya n). lYapıştırılacak dosyaların listesini görüntülemek için istendiğinde ("liste" için) öğesine de basabilirsiniz .


İşaretli dosyaları geçerli Dired arabelleğinden ve işaretli alt dizinlerindeki işaretli dosyaları tekrarlanan şekilde kopyalayabilirsiniz . Bunun için M-0 M-+ M-w(komut ile sıfır önek arg diredp-copy-filename-as-kill-recursive) veya kullanın M-x diredp-copy-abs-filenames-as-kill-recursive.


Dired + ile istediğiniz yerden, istediğiniz sayıda dosya ve dizini listeleyen bir Dired buffer'a sahip olabileceğinizi unutmayın. Yani, listelenen girdilerin aynı dizinde veya hatta ilgili dizinlerde olması gerekmez. Herhangi bir yerde Bulunan Dired Files öğesi olarak Dir menü çubuğu menüsünde yer alanC-x D F (command diredp-dired-for-files) komutuna bakın . Bu tür rastgele dosyaları bir Dired buffer'dan herhangi bir dizine işaretleyip yapıştırabilirsiniz.


Güncelleme 2019-04-22:

Ayrıca , (mutlak) isimlerini kill halkasına kopyaladığınız dosyaları geçerli (veya başka bir) dizine taşıma ( ekleme değil) özelliğini ekledim . Bu, C-wDired'de bağlıdır.

diredp-move-files-named-in-kill-ringiçinde etkileşimli bir Lisp işlevidir dired+.el.

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

Mutlak adlarını kopyaladığınız dosyaları geçerli dizine taşıyın.

Negatif olmayan bir önek argümanıyla, bunun yerine hedef dizini girmeniz istenir.

Pozitif olmayan bir önek argümanı ile lyapıştırma işlemini onaylamanız istendiğinde vurursanız dosyalar hakkındaki ayrıntıları görebilirsiniz . Aksi takdirde yalnızca dosya adlarını görürsünüz. Gördüğünüz ayrıntılar seçenekle tanımlanır diredp-list-file-attributes.

Dosya adları listesini M-0 wveya kullanarak kill ring'e bir dize olarak kopyalamış olmalısınız M-x diredp-copy-abs-filenames-as-kill. Bu komutlar da değişkeni diredp-last-copied-filenamesaynı dizeye ayarlar . diredp-move-files-named-in-kill-ringşu anda öldürme halkasının başında ne varsa o değişkenin değerini kullanır.

Lisp'den çağrıldığında:

  • İsteğe bağlı arg NO-CONFIRM-P, taşınması için onay istemediğiniz anlamına gelir.
  • Opsiyonel arg DETAILSgeçirilir diredp-y-or-n-files-p.

Güzel çalıştı. Diredp C-wkopyalamak yerine dosyayı taşımak / yeniden adlandırmak zorunda mı? Teşekkürler
azzamsa

@azzamsa: Hayır, sanmıyorum. (Sanırım kill-ringDired'deki dosya adlarını kullanmak için Dired'e bu dosyaları bir yere taşımasını, örneğin nereye taşınacağını sormasını söylüyorsunuz.)
Drew

Elbette. Yani bu işlevi neden eklemiyorsunuz? harika olurdu :). Çünkü akım, sadece Cy destek. Yalnızca kopyalama, Taşıma / yeniden adlandırma değil.
azzamsa

Şimdi. Kullandığım dired-ranger hack için bu teşekkür.
azzamsa

FYI - Artık C-w, adlarını kopyaladığınız dosyaları taşımak için kullanabilirsiniz .
Drew

4

Vanilla Dired'de aşağıdakileri yapabilirsiniz (3. taraf kütüphaneye gerek yoktur):

  1. İlk önce hedef dizini listeleyen bir Dired buffer'a gidin .

  2. Hedef dizinin bir listesi için imleç dizin başlık satırındayken w(command dired-copy-filename-as-kill) komutunu kullanın . Bu, hedef dizinin mutlak adını kopyalar. (Bir dizin adını herhangi bir Dired listeleme alt dizin başlık satırından aynı şekilde kopyalayabilirsiniz.)

  3. Kopyalamak istediğiniz dosyaları listeleyen Dired buffer'a gidin . Bu dosyaları işaretleyin.

  4. İşaretli dosyaları kopyalamak içinC (komut dired-do-copy) tuşunu kullanın . İsteme kullanmak için hedef dizinin (mutlak) adını yapıştırın . Minibuffer'a eklenen varsayılan dizini kaldırmak için uğraşmadan yapıştırabilirsiniz. (Bu varsayılan dir adından sonra yapıştırmak varsayılan adı karartır - yok sayılır.)C-y

Bu, bence, açıkladığınız kadar basit ( C-wişaretli dosya adlarını ve ardından C-yhedef Dired listesinde kopyalamak için ), ancak sıra tersi : önce hedef dizin adını kopyalayıp C( dired-do-copy) komutuna yapıştırın .

( dired-do-copyhedef dizinde aynı ada sahip mevcut dosyaları kontrol eder vb.)


İpucu: ( Dired + kullanıyorsanız bu gerekli değildir - diğer cevabımı buradan görebilirsiniz.) Dosyaları birden çok dizinden aynı hedef dizine kopyalamak (veya taşımak) istiyorsanız ve kill-ring ile başka şeyler yapıyor olabilirsiniz aralarında, kopyalanan hedef dir adı artık kill-ring'de ilk sırada olmayabilir, ardından hedef dir adını seçmek için ikincil seçimi kullanın. İkincil seçim, bölgeye veya imlecin konumuna bağlı değildir - kill halkasındaki değişikliklerden bağımsız olarak, istediğiniz kadar yapıştırabilirsiniz. Fareyi kullanarak yapıştırabilirsiniz, ancak C-M-ykütüphaneden kullanmak daha kolaydır second-sel.el.


3

Fikriniz basit görünüyor, belki de kendiniz uygulamayı deneyebilirsiniz, isterseniz başlamak için aşağıdakileri de kullanabilirsiniz.

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

Çok teşekkür ederim. Bir öneri var: yapıştırdıktan sonra, kopyalanan yeni öğeleri görmek için dired arabelleği güncelleştirmek (yenileme).
İsim

Başka bir öneri: yapıştırdıktan sonra işaretli öğelerin işaretini kaldırmak.
İsim

@ İsim İyi öneriler. Kullanacak olan siz olduğunuz için bunları kendiniz uygulamanızı tavsiye ederim. İyi şanslar.
xuchunyang

2

Ranger dosya yöneticisi tanımladığınız şekilde çalışır, ancak vim'den ilham alır (böylece yapıştırmak için yykopyalamak / kopyalamak piçin vim keybings ). Emacs'ın da korucu uygulaması var. Deneyin, belki ihtiyacınıza uygun olacaktır.

Kendim için gece yarısı komutanına (mc) benzer emacs gündoğumu komutanı kullanıyorum, her ne zaman çift bölmeli dosyaları yönetmeye ihtiyacım olduğunu hissediyorum.

Upd: dired-ranger açıkladığınız kopyala / yapıştır'a sahiptir. En azından dokümanlarda.

;; 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.
;; ...

Orada dired-rangerve rangermevcut MELPA üzerinde. Hangisini kastediyorsun?
İsim

Peki, dired-ranger hakkında bilmiyordum ama açıklamadan istediğiniz gibi görünüyor.
Maxim Kim

1

Ben de kullanmanızı öneririm dired-ranger. Bu benim var 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 benim için gerçek çözümdü:

Açıkladığınız gibi, sadece bu basit yapılandırma ile (kullandığınız varsayılarak use-package) yaygın dosya gezgini davranışına ulaşabilirsiniz :

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.