Copiando texto selecionado por vários cursores para um novo buffer

9

Digamos que queremos matar a região selecionada por todos os cursores em vários cursores e puxar tudo para um novo buffer vazio. Como você faz isso com vários cursores?

Observe que uma cópia e colagem simples do texto no novo buffer não funciona, pois apenas puxa a região do primeiro cursor (conforme relatado aqui ).

Nota: Esta pergunta é motivada pela resposta e pelo problema apresentados em: Manter apenas as linhas com os cursores em cursores múltiplos

Amelio Vazquez-Reina
fonte

Respostas:

9

Depois que o texto for finalizado, saia do cursor múltiplo ( enter) e enquanto estiver no novo hit do buffer C-x r y(normalmente o texto finalizado está no anel de retângulo)

Lompik
fonte
3
Depois de milhares de vezes falhando em arrancar todas as coisas mortas, fico frustrado ao descobrir que DEVE sair do cursor múltiplo para fazer o C-x r ytrabalho. :(
stackunderflow
O texto morto pela primeira vez persiste de alguma forma, existe algo como um "cache" que eu preciso limpar? Obrigado!
benjaminz
11
Considero esta solução um truque feio.
dev1223 06/07/19
0

Tente isso. Basta selecionar o texto usando vários cursores e pressionar Cc. Assim como em qualquer outro editor normal hoje em dia.

(setq *cutom/bulk-clipboard* nil)

(mc/load-lists)
(push 'custom/copy-across-cursors
      mc/cmds-to-run-once)
(push 'cua-copy-region
      mc/cmds-to-run-once)


(defun custom/copy-across-cursors ()
  (interactive)
  (mc/save-excursion
   (mc/save-window-scroll
    (mc/for-each-fake-cursor
     (save-excursion
       (custom/copy-across-cursor cursor)))))
  (mc--reset-read-prompts)
  (push (buffer-substring
         (caar (region-bounds))
         (cdar (region-bounds)))
        *cutom/bulk-clipboard*)
  (kill-new (s-chomp (loop for x in *cutom/bulk-clipboard*
                           concat (concat x "\n"))))
  (setq *cutom/bulk-clipboard* nil))

(defun custom/copy-across-cursor (cursor)
  (let ((mc--executing-command-for-fake-cursor t)
        (id (overlay-get cursor 'mc-id))
        (annoying-arrows-mode nil)
        (smooth-scroll-margin 0))
    (mc/add-fake-cursor-to-undo-list
     (mc/pop-state-from-overlay cursor)
     (ignore-errors
       (custom/cursor-handle-copy)
       (mc/create-fake-cursor-at-point id)))))

(defun custom/cursor-handle-copy ()
  (when (region-active-p)
    (push (buffer-substring
           (caar (region-bounds))
           (cdar (region-bounds)))
          *cutom/bulk-clipboard*))
  (when deactivate-mark (deactivate-mark)))


(advice-add #'cua-copy-region
            :around (lambda (oldfn &rest args)
                      (if (> (mc/num-cursors) 1)
                          (custom/copy-across-cursors)
                        (apply oldfn args))))

Por favor, observe que a dependência da biblioteca s está presente. Além disso, este código espera que você use o modo CUA. Caso contrário, você deve personalizar a definição de aviso na parte inferior.

dev1223
fonte