複数カーソルのすべてのカーソルで選択された領域を強制終了し、すべてを新しい空のバッファにヤンクするとします。複数のカーソルでそれをどのように行いますか?
(ここで報告されているように)最初のカーソルから領域をヤンクするだけなので、新しいバッファ上のテキストの単純なコピーと貼り付けは機能しないことに注意してください。
注:この質問は、「カーソルのある行のみを複数のカーソルで保持する」に示されている回答と問題によって動機付けられています。
複数カーソルのすべてのカーソルで選択された領域を強制終了し、すべてを新しい空のバッファにヤンクするとします。複数のカーソルでそれをどのように行いますか?
(ここで報告されているように)最初のカーソルから領域をヤンクするだけなので、新しいバッファ上のテキストの単純なコピーと貼り付けは機能しないことに注意してください。
注:この質問は、「カーソルのある行のみを複数のカーソルで保持する」に示されている回答と問題によって動機付けられています。
回答:
テキストが削除されたら、マルチカーソル(enter
)を終了し、新しいバッファヒット中にC-x r y
(通常、削除されたテキストは長方形のkill-ringにあります)
これを試して。複数のカーソルを使用してテキストを選択し、Ccを押すだけです。最近の他の通常のエディターと同じように。
(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))))
ライブラリへの依存関係が存在することに注意してください。また、このコードはCUAモードの使用を想定しています。そうでない場合は、下部でアドバイス定義をカスタマイズする必要があります。
C-x r y
作業を行うには複数のカーソルを終了しなければならないことに気づきました。:(