Как сохранить содержимое буфера обмена в Emacs в Windows?
Это сценарий, с которым я столкнулся несколько раз:
Я копирую текст из другой программы. Пойдите в Emacs и сделайте некоторое редактирование, прежде чем вставлять/вынимать текст. Cy to yank и voila... не текст, который я намеревался вставить. Затем я понимаю, что, пока я перемещаю вещи, я использовал команды, line и back-kill-word, а те убитые строки и слова теперь заняли kill-ring. Но набрав M-y, вы не вернете исходный скопированный текст, поэтому мне нужно вернуться к исходной программе, чтобы снова скопировать текст. И даже хуже, если исходная программа закрыта, я полностью потерял скопированный текст.
Kill-line и т.д. являются такими основными командами (например, удары по ключу delete почти), и хотя я не против, чтобы kill-ring немного захламлялся с помощью этой команды, я ожидаю, что мой оригинальный текст остается где-то в кольце убийства, чтобы я мог найти его, набрав "Мой" несколько раз. Как я могу заставить Emacs автоматически сохранять текущий контент буфера обмена в kill-ring, прежде чем переопределять содержимое буфера обмена?
Ответы
Ответ 1
Этот код должен автоматически помещать выделение (извне Emacs) на kill-ring в любое время, когда вы делаете укол в Emacs. Он был протестирован на Linux, но не должен ограничиваться Linux.
(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate)
"Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring"
(let ((have-paste (and interprogram-paste-function
(funcall interprogram-paste-function))))
(when have-paste (push have-paste kill-ring))))
Если вы обнаружите, что делаете это много, может быть полезно взглянуть на пакет browse-kill-ring, который дает вам прекрасный вид на кольцо убийства (в отличие от многократного ввода M-y
).
Ответ 2
Обратите внимание, что в последней версии версии Emacs CVS есть переменная save-interprogram-paste-before-kill, которая выполняет именно это cf: из etc/NEWS файл:
** Когда save-interprogram-paste-before-kill'
is non-nil, emacs will not clobber the
the interprogram paste when something
is killed in it by saving the former
in the
kill-ring 'перед последним.
Ответ 3
Я думаю, проблема в том, что когда вы дергаетесь из буфера обмена за пределами emacs, вы не сохраняете кольцо убийства.
Вам понадобится использовать функцию clipboard-yank для вставки области, затем как-то ее выбрать и сохранить в кольцо kill, как это делает функция kill-ring-save.
Или даже лучше написать функцию clipboard-save-to-kill-ring-and-yank, которая сохраняет клипбод в кольцо kill и затем дергает его.
edit: немного отслеживая код, это делает то, что вы хотите; вы можете подключить его к ключу. Он сохраняет содержимое буфера обмена Windows в кольце уничтожения.
(defun clipboard-to-kill-ring()
"save the external clipboard contents to the kill ring"
(interactive)
(let ((clip (funcall interprogram-paste-function)))
(when clip
(kill-new clip)))
(defadvice yank (before maybe-copy-windows-clipboard (arg))
(clipboard-to-kill-ring))
(ad-activate 'yank)
Ответ 4
Я бы предположил, что вы можете взломать различные команды kill, чтобы не вставлять текст в буфер обмена, а затем привязать буфер обмена к другому ключу, а не если это будет работать.
Ответ 5
Я работаю над этим, просто выдергивая текст, а затем повторно убивая его, когда я появляюсь в emacs после того, как сделал копию или вырезал в другом приложении Windows.
Лучшим подходом было бы взломать emacs, чтобы когда вы что-то убьете, он сравнивает существующий буфер обмена с самой верхней записью в кольце убийства, а если отличается, то он подталкивает содержимое буфера обмена к кольцу убийства, прежде чем совершать убийство вы явно запросили.