Добавить буфер обмена операционной системы, чтобы убить кольцо

25

Часто я копирую фрагмент кода в буфер обмена моей операционной системы из Интернета. Затем я делаю следующие простые шаги:

  1. Переключиться в мое окно Emacs
  2. Найдите место, куда я хочу вставить код
  3. Используйте C-y( yank), чтобы вставить скопированный текст.

Однако иногда я обнаруживаю (к моему большому разочарованию), что я невольно использовал какую-либо форму команды уничтожения (например, kill-wordили kill-line), находясь на шаге 2. В таких случаях скопированный текст из «буфера обмена» никогда не превращается в уничтожение. кольцо.

Есть ли способ убедиться, что скопированный текст из других приложений всегда попадает в мой список уничтожений?

Я чаще всего работаю в Linux, но я также регулярно использую Emacs в Windows и Mac OS X, поэтому предпочтителен независимый от ОС ответ.

nispio
источник
Могу ли я предложить эту ссылку ? просматривая всю страницу, вы увидите множество различных способов копирования / вставки из / в буфер обмена
Nsukami _
@Nsukami_ Спасибо. Я попытаюсь переварить это, но связанная страница - яркий пример того, почему я устал искать ответы в EmacsWiki. Многие из хакеров elisp там, кажется, думают, что код elisp самодокументирован и не требует никаких комментариев и объяснений относительно функции или использования. У меня обычно нет времени, чтобы перепроектировать код, просто чтобы решить, делает ли он то, что я хочу, или нет.
Ниспио
хаха, я понимаю;)
Nsukami _

Ответы:

31

Вам нужно настроить save-interprogram-paste-before-killна t. Это подтолкнет ваш буфер обмена на killring на случай, если вы убьете что-нибудь в emacs перед вставкой в ​​буфер обмена. Связанная настройка заключается в том, yank-pop-change-selectionчто ваш текущий рывок в emacs помещается в буфер обмена. Чтобы оба они работали, вам нужно x-select-enable-clipboard(заменено на gui-select-enable-clipboardв emacs 25.1) значение по tумолчанию.

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

Vamsi
источник
1
Даже чище и проще, чем я ожидал. save-interprogram-paste-before-killкажется, делает именно то, что я хочу!
Ниспио
Я нахожусь на Emacs 26, и gui-select-enable-clipboardназывается просто select-enable-clipboard.
Руна Каагард
3

другое решение - просто использовать инструмент Cli, если это возможно,

  • pbcopy / pbpaste на Mac

  • getclip / putclip на Cygwin

  • xsel на Linux
  • x-clipboard в графическом интерфейсе Emacs (как уже упоминалось, вам нужно включить флаг x-select-enable-clipboard).

Преимущество этого решения в том, что буфер обмена можно использовать всегда (например, при удаленном ssh).

Мой ответ состоит из двух частей. В первой части представлены некоторые удобные инструменты для работы с буфером обмена. часть вторая ответит на ваш оригинальный вопрос (сохраните буфер обмена в список уничтожений).

ЧАСТЬ ПЕРВАЯ

Вставьте следующий код в ваш ~ / .emacs:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

ЧАСТЬ ВТОРАЯ

вставьте приведенный ниже код в ваш ~ / .emacs, и теперь используйте «Mx paste-from-clipboard-and-cc-kill-ring» для вставки:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
чен бен
источник