Как сохранить содержимое буфера обмена в Emacs на Windows? - PullRequest
16 голосов
/ 11 мая 2009

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

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

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

Ответы [ 5 ]

12 голосов
/ 12 мая 2009

Этот код должен автоматически помещать выделение (вне Emacs) в список уничтожений каждый раз, когда вы выполняете уничтожение в 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).

3 голосов
/ 10 сентября 2009

Обратите внимание, что в последней версии Emacs CVS есть переменная save-interprogram-paste-before-kill, которая выполняет именно этот код: из файла 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 'перед последним.

2 голосов
/ 11 мая 2009

Я думаю, что проблема в том, что когда вы дергаете из буфера обмена вне emacs, вы не сохраняете в список уничтожений.

Вам нужно использовать функцию clipboard-yank, чтобы вставить регион, затем каким-то образом выделить его и сохранить в списке уничтожений, как это делает функция kill-ring-save.

Или даже лучше написать функцию clipboard-save-to-kill-ring-and-yank, которая сохраняет буфер обмена в список уничтожений и затем восстанавливает его.

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)
0 голосов
/ 11 мая 2009

Я обхожу это вокруг, просто дергая текст, а затем снова убивая его, когда я захожу в emacs после того, как сделал копию или вырезал в другом приложении Windows.

Лучшим подходом было бы взломать emacs так, чтобы при уничтожении он сравнивал существующий буфер обмена с самой верхней записью в списке уничтожений, и, если он отличается, он помещал содержимое буфера обмена в список уничтожений перед выполнением уничтожения. Вы явно просили.

0 голосов
/ 11 мая 2009

Я думаю, вы могли бы взломать различные команды уничтожения, чтобы не помещать текст в буфер обмена, а затем привязать буфер обмена к другой клавише, не знаю, сработает ли это.

...