Подтвердить что ты не робот

Как сохранить содержимое буфера обмена в Emacs в Windows?

Это сценарий, с которым я столкнулся несколько раз:

Я копирую текст из другой программы. Пойдите в Emacs и сделайте некоторое редактирование, прежде чем вставлять/вынимать текст. Cy to yank и voila... не текст, который я намеревался вставить. Затем я понимаю, что, пока я перемещаю вещи, я использовал команды, line и back-kill-word, а те убитые строки и слова теперь заняли kill-ring. Но набрав M-y, вы не вернете исходный скопированный текст, поэтому мне нужно вернуться к исходной программе, чтобы снова скопировать текст. И даже хуже, если исходная программа закрыта, я полностью потерял скопированный текст.

Kill-line и т.д. являются такими основными командами (например, удары по ключу delete почти), и хотя я не против, чтобы kill-ring немного захламлялся с помощью этой команды, я ожидаю, что мой оригинальный текст остается где-то в кольце убийства, чтобы я мог найти его, набрав "Мой" несколько раз. Как я могу заставить Emacs автоматически сохранять текущий контент буфера обмена в kill-ring, прежде чем переопределять содержимое буфера обмена?

4b9b3361

Ответ 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, чтобы когда вы что-то убьете, он сравнивает существующий буфер обмена с самой верхней записью в кольце убийства, а если отличается, то он подталкивает содержимое буфера обмена к кольцу убийства, прежде чем совершать убийство вы явно запросили.