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

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

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

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


person polyglot    schedule 11.05.2009    source источник


Ответы (5)


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

person Trey Jackson    schedule 11.05.2009
comment
просто, легко, идеально. Я использовал это сегодня. Скопировал текст из браузера, а затем зашел в emacs, чтобы вставить его в новый файл. Не осознавая, я использовал несколько команд уничтожения для пути к файлу, когда открывал новый файл. Без этого скрипта содержимое буфера обмена исчезло бы. Но на этот раз все сработало, как и ожидалось! - person Cheeso; 12.05.2009

Обратите внимание, что последняя версия CVS Emacs имеет переменную 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 thekill-ring 'перед последним.

person Chmouel Boudjnah    schedule 10.09.2009

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

Что вам нужно, так это использовать функцию 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)
person justinhj    schedule 11.05.2009
comment
Это хорошо, но мне нужно что-то автоматическое (на случай, если я забуду!), Чтобы всякий раз, когда я что-то убиваю, все, что находится в буфере обмена, сохранялось в kill-ring, если его еще нет. - person polyglot; 11.05.2009
comment
Я думаю, что моя редакция работает. Рекомендация до заставляет команду yank автоматически сохранять буфер обмена Windows в список уничтожений. - person justinhj; 12.05.2009
comment
Я думаю, что ваш код не работает в сценарии: выберите текст в окне, отличном от emacs (скажем, XYZ), теперь убейте некоторый текст в emacs (скажем, ABC) Cy My My ... XYZ не может быть найден b / c выбор теряется при первом убийстве, прежде чем первый рывок сможет добавить его в список убийств. - person Trey Jackson; 12.05.2009

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

person shapr    schedule 11.05.2009

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

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

person Cheeso    schedule 11.05.2009
comment
Вам не нужно проверять, что находится в кольце уничтожения с моим решением, потому что, когда вы захватываете буфер обмена, он очищает его, поэтому последующие вызовы просто получают ноль, и они не добавляют это в кольцо уничтожения. - person justinhj; 12.05.2009