Додати буфер обміну операційної системи, щоб убити кільце


25

Часто мені трапляється копіювати фрагмент коду в буфер обміну моєї операційної системи з Інтернету. Потім я вживаю наступних простих кроків:

  1. Перехід до мого вікна Emacs
  2. Знайдіть місце, де я хочу вставити код
  3. Використовуйте C-y( yank), щоб вставити скопійований текст.

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

Чи є спосіб переконатися, що скопійований текст з інших додатків завжди перетворює його в кільце для вбивства?

Я працюю в Linux найчастіше, але також регулярно використовую Emacs в Windows та Mac OS X, тому перевагу ОС-агностика краще.


Чи можу я запропонувати це посилання ? переглядаючи всю сторінку, ви побачите багато різних способів копіювання / вставки з / у буфер обміну
Nsukami _

@Nsukami_ Дякую Я спробую це переварити, але пов’язана сторінка - це прекрасний приклад того, чому я втомився шукати відповіді на EmacsWiki. Багато хто з хакерів elisp, здається, вважають, що код elisp є самодокументованим та не потребує коментарів та пояснень щодо функції чи використання. Зазвичай я не встигаю переробити інженерний код, щоб вирішити, чи він робить те, що я хочу, чи ні.
nispio

ха-ха, я розумію;)
Nsukami _

Відповіді:


31

Вам потрібно налаштувати save-interprogram-paste-before-killв t. Це підштовхне ваш буфер обміну до вбивства, якщо ви щось вб'єте в emacs перед тим, як вставити буфер обміну. Пов'язане налаштування - це те, yank-pop-change-selectionщо штовхає ваш поточний ривок у emacs на буфер обміну. Щоб обидва вони працювали, вам потрібно x-select-enable-clipboard(замінено на gui-select-enable-clipboardemacs 25.1), tяким за замовчуванням.

Причина, яку це вимкнено за замовчуванням, полягає в тому, щоб запобігти ненавмисному натисканню великої кількості даних на вбивство, яке зберігається через сеанс, на відміну від буфера обміну, який легко замінюється.


1
Навіть чистіше і легше, ніж я очікував. save-interprogram-paste-before-killздається, роблю саме те, що хочу!
nispio

Я на Emacs 26, і gui-select-enable-clipboardназивається просто select-enable-clipboard.
Руна Каагаард

3

інше рішення - просто використовувати інструмент cli, якщо можливо,

  • pbcopy / pbpaste на Mac

  • getclip / putclip на Cygwin

  • xsel в Linux
  • x-буфер обміну в GUI 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)
    ))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.