Maneiras simples de copiar / colar arquivos e diretórios entre buffers direcionados

10

Existe uma M-w C-yabordagem simples para copiar e colar arquivos e diretórios entre dois buffers direcionados?

Quero dizer, marcar alguns itens (arquivos e buffer) mcopiando-os por M-w(ou outro atalho) e depois indo para outro buffer direcionado (que não está necessariamente em uma janela lado a lado pela janela do (s) buffer (s) direcionado (s) anterior (s) ), então yankingtodo o arquivo copiado por C-y(ou outro atalho) lá? Essa é uma tarefa simples que muitos exploradores de arquivos em diferentes sistemas operacionais podem fazer.

O problema com a opção de cópia clássica C em dired é que, assim que é pressionado, ele solicita o destino. Se o caminho do buffer de destino for muito longo ou houver muitos buffers direcionados abertos, essa abordagem será complicada.

Estou procurando uma solução para copiar primeiro os itens e colá-los em um buffer direcionado apropriado.

Existe uma pergunta relacionada Como copiar / mover arquivos rapidamente no Emacs Dired? que utiliza a abordagem clássica de prensagem C quando duas janelas Dired separados verticalmente usando a opção (setq dired-dwim-target t).

Quais são as maneiras de conseguir isso?

Nome
fonte

Respostas:

5

Adicionei esse recurso agora ao Dired + .

Você pode usar C-y(comando diredp-yank-files) para colar arquivos, cujos nomes absolutos foram copiados para o anel de interrupção, no diretório atual. O "diretório atual" aqui é o que dired-current-directoryretorna: o subdiretório inserido onde o cursor está localizado ou o diretório principal Dired se o cursor não estiver em uma lista de subdiretórios.

Com um prefixo arg, C-ysolicita o diretório de destino para a pasta. Portanto, você não precisa estar em um buffer Dired para colar arquivos em um diretório.

Você deve ter copiado os nomes dos arquivos para o anel de morte usando M-0 wou M-x diredp-copy-abs-filenames-as-kill.

Em Dired +, esses comandos também definem variável diredp-last-copied-filenamespara a mesma sequência de nomes de arquivos. C-yusa o valor dessa variável, não o que está atualmente na cabeça do anel de morte. Isso significa que você não precisa colar imediatamente após copiar os nomes dos arquivos. E isso significa que você pode, em vez de copiar os nomes dos arquivos no ringue, apenas colocar os nomes nessa variável (por exemplo, programaticamente).

Quando você usa C-y, você é solicitado a confirmar ( you n). Você também pode pressionar l(para "lista") quando solicitado, para exibir a lista de arquivos que serão colados.


Você também pode copiar os arquivos marcados do buffer Dired atual e quaisquer arquivos marcados em seus subdiretórios marcados, definidos recursivamente . Para isso, use M-0 M-+ M-w(prefixo zero arg com comando diredp-copy-filename-as-kill-recursive) ou use M-x diredp-copy-abs-filenames-as-kill-recursive.


Observe que com o Dired + você também pode facilmente ter um buffer Dired que lista qualquer número de arquivos e diretórios, de qualquer lugar. Ou seja, as entradas listadas não precisam estar no mesmo diretório ou mesmo em diretórios relacionados. Consulte C-x D F(comando diredp-dired-for-files), que está no menu da barra de menus Dir como o item Arquivos Dired Localizados em Qualquer Lugar . Você pode marcar e colar (copiar) esses arquivos arbitrários de um buffer Dired para qualquer diretório.


Atualização 2019-04-22:

Também adicionei a capacidade de mover (não apenas colar) os arquivos cujos nomes (absolutos) você copiou para o anel de morte para o diretório atual (ou outro). Isso está vinculado C-wem Dired.

diredp-move-files-named-in-kill-ringé uma função interativa do Lisp no Windows dired+.el.

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

Mova os arquivos cujos nomes absolutos foram copiados para o diretório atual.

Com um prefixo não negativo arg, é solicitado o diretório de destino.

Com um prefixo não positivo arg, você pode ver detalhes sobre os arquivos se clicar lquando solicitado a confirmar a colagem. Caso contrário, você verá apenas os nomes dos arquivos. Os detalhes que você vê são definidos por opção diredp-list-file-attributes.

Você deveria ter copiado a lista de nomes de arquivos como uma string para o anel de morte usando M-0 wou M-x diredp-copy-abs-filenames-as-kill. Esses comandos também definem variável diredp-last-copied-filenamespara a mesma string. diredp-move-files-named-in-kill-ringusa o valor dessa variável, não o que está atualmente na cabeça do anel de morte.

Quando chamado do Lisp:

  • Arg opcional NO-CONFIRM-Psignifica que não solicite confirmação para mover.
  • Arg opcional DETAILSé passado para diredp-y-or-n-files-p.
Desenhou
fonte
Trabalhou bem. O diredp teve C-wque mover / renomear o arquivo em vez de copiar? Graças
azzamsa
@azzamsa: Não, acho que não. (Eu acho que você nomes de arquivos uso médios que estão no kill-ringpara contar Dired para mover esses arquivos em algum lugar, por exemplo, o que levou para onde movê-los.)
de Drew
Certo. Quero dizer, por que você não adiciona essa funcionalidade? Seria maravilhoso :). Porque o atual, apenas suporta Cy. Apenas copiar, Não mover / renomear.
Azzamsa 8/10
Agora. Eu uso o dired-ranger hack para esse obrigado.
azzamsa
FYI - Agora você pode usar C-wpara mover os arquivos cujos nomes você copiou.
Desenhou
4

Você pode fazer o seguinte no Vanilla Dired (não é necessária uma biblioteca de terceiros):

  1. Vá primeiro para um buffer direcionado que lista o diretório de destino .

  2. Com o cursor na linha de cabeçalho do diretório para obter uma lista do diretório de destino, use w(comando dired-copy-filename-as-kill). Isso copia o nome absoluto desse diretório de destino. (Você pode copiar um nome de diretório de qualquer linha de cabeçalho de subdiretação de listagem Dired da mesma maneira.)

  3. Vá para o buffer Dired que lista os arquivos que você deseja copiar . Marque esses arquivos.

  4. Use C(comando dired-do-copy) para copiar os arquivos marcados . No prompt, use C-ypara colar o nome (absoluto) do diretório de destino . Você pode simplesmente colá-lo, sem se preocupar em remover o diretório padrão inserido no minibuffer. (Colá-lo após esse nome de diretório padrão escurece esse nome padrão - ele é ignorado.)

Acho que é tão simples quanto o que você descreve ( C-wpara copiar nomes de arquivos marcados seguidos C-yna listagem Dired de destino), mas a ordem é oposta : você copia primeiro o nome do diretório de destino e, em seguida, cola-o no comando C( dired-do-copy) .

( dired-do-copyverifica se há arquivos com o mesmo nome no diretório de destino etc.)


Dica: (Isso não é necessário se você usar Dired + - veja minha outra resposta aqui.) Se você pretende copiar (ou mover) arquivos de vários diretórios para o mesmo diretório de destino, e pode estar fazendo outras coisas com o kill-ring no meio, para que o nome do diretório de destino copiado não seja mais o primeiro no anel de interrupção, use a seleção secundária para selecionar o nome do diretório de destino. A seleção secundária não depende da região ou da posição do cursor - você pode colá-la quantas vezes quiser, independentemente das alterações no kill-ring. Você pode colá-lo usando o mouse, mas é mais prático usar C-M-yna biblioteca second-sel.el.

Desenhou
fonte
2

Sua ideia parece direta; talvez você possa tentar implementá-la por conta própria; também pode usar o seguinte para começar, se quiser.

(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
fonte
Muito obrigado. Tenho uma sugestão: após colar, atualize (atualize) o buffer direcionado para ver os novos itens copiados.
Name
Outra sugestão: para desmarcar os itens marcados após colar.
Nome
@Name Boas sugestões. Eu recomendo que você os implemente sozinho, já que você é quem o utilizará. Boa sorte.
xuchunyang
2

O gerenciador de arquivos Ranger funciona da maneira que você descreve, mas é inspirado no vim (assim, as combinações yyde teclas do vim para puxar / copiar ppara colar etc). O Emacs também possui implementação de ranger. Experimente, talvez atenda às suas necessidades.

Eu, por mim mesmo, uso o emacs sunrise-commander, que é semelhante ao Midnight Commander (mc), sempre que sinto que preciso de um gerenciamento de arquivos com painéis duplos.

Upd: dired-ranger possui a cópia / colagem que você descreveu. Pelo menos nos documentos.

;; 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
fonte
Existem dired-rangere estão rangerdisponíveis no MELPA. Você quer dizer qual?
Nome
bem, eu não sabia sobre dir-ranger, mas a partir da descrição, parece que você quer.
Maxim Kim
1

Eu também sugeriria usar dired-ranger. Isto é o que eu tenho no meu 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
fonte
0

O ranger dirigido era a verdadeira solução para mim:

Você pode obter um comportamento comum do explorador de arquivos conforme descrito, apenas com esta configuração simples (supondo que você use use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
azzamsa
fonte