Как скопировать текст из Emacs в другое приложение в Linux - PullRequest
102 голосов
/ 15 сентября 2008

Когда я вырезал (убил) текст в Emacs 22.1.1 (в его собственном окне на X, в KDE, на Kubuntu), я не могу вставить (восстановить) его в любом другом приложении.

Ответы [ 12 ]

118 голосов
/ 15 сентября 2008

Давайте будем осторожны с нашими определениями здесь

  • Emacs copy - это команда kill-ring-save (обычно связанная с M-w ).
  • A системная копия - это то, что вы обычно получаете, нажав C-c (или выбрав «Редактировать-> Копировать» в окне приложения).
  • Копия X"физически" выделяет текст курсором мыши.
  • Emacs paste - это команда yank (обычно связана с C-y ).
  • A системная вставка - это то, что вы обычно получаете, нажимая C-v (или выбирая «Edit-Paste» в окне приложения).
  • X paste нажимает "центральную кнопку мыши" (имитирует одновременное нажатие левой и правой кнопок мыши).

В моем случае (в GNOME):

  • Как Emacs, так и системное копирование обычно работают с X paste.
  • X-копия обычно работает с Emacs-пастой.
  • Чтобы системная копия работала с Emacs-вставкой, а Emacs-копия работала с системной вставкой, вам нужно добавить (setq x-select-enable-clipboard t) в .emacs. Или попробуйте

    META-X set-variable RET x-select-enable-clipboard RET t
    

Я думаю, что это довольно стандартное современное поведение Unix.

Также важно отметить (хотя вы говорите, что используете Emacs в отдельном окне), что когда Emacs работает в консоли, он полностью отделен от системного и X-буфера обмена: в этом случае опосредовано вырезание и вставка возле терминала. Например, «Edit-> Paste» в вашем терминальном окне должно действовать точно так же, как если бы вы вводили текст из буфера обмена в буфер Emacs.

88 голосов
/ 15 сентября 2008

Вставьте в файл .emacs следующее:

(setq x-select-enable-clipboard t)
10 голосов
/ 28 октября 2013

Сложность копирования и вставки в Emacs заключается в том, что вы хотите, чтобы он работал независимо от внутреннего kill / yank, и чтобы он работал и в терминале, и в графическом интерфейсе. Существуют надежные решения для терминала или графического интерфейса, но не для обоих. После установки xsel (например, sudo apt-get install xsel) вот что я делаю для копирования и вставки, чтобы объединить их:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)
10 голосов
/ 16 сентября 2008

Воткну это в мой .emacs:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

У меня впоследствии практически не возникает проблем с вырезанием и вставкой чего-либо из Emacs в любое другое приложение X11 или Gnome.

Бонус: чтобы все это происходило в Emacs без перезагрузки всего вашего .emacs, сделайте C-x C-e с курсором сразу после закрывающей части каждого из этих выражений в буфере .emacs.

Удачи!

7 голосов
/ 15 сентября 2008

Я предполагаю, что под emacs вы подразумеваете Emacs под X (то есть не внутри окна терминала).

Есть два способа:

  1. (относится только к ОС Unix) Выделите нужный текст с вашим мышь (это копирует его в X буфер обмена), а затем средний щелчок к вставить.
  2. Выделите нужный текст и затем «M-x clipboard-kill-ring-save» (обратите внимание, вы можете связать это с более простым ключ). Затем просто "Правка-> Вставить" в ваше любимое приложение.

Доступные операции с буфером обмена:

  • clipboard-kill-ring-save - копировать выбор из Emacs в буфер обмена
  • clipboard-kill-region - cut выбор из Emacs в буфер обмена
  • буфер обмена - вставка из буфер обмена в Emacs
6 голосов
/ 15 сентября 2008

Есть статья EmacsWiki , которая объясняет некоторые проблемы с копированием и вставкой в ​​X и как настроить его для работы.

4 голосов
/ 06 марта 2015

Это работает с M-w на Mac OSX. Просто добавьте в ваш файл .emacs .

(defun copy-from-osx ()
   (shell-command-to-string "pbpaste"))
(defun paste-to-osx (text &optional push)
   (let ((process-connection-type nil))
      (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
         (process-send-string proc text)
         (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

Источник https://gist.github.com/the-kenny/267162

1 голос
/ 31 июля 2017

Приведенный ниже код, вдохновленный ответом @ RussellStewart выше, добавляет поддержку x-PRIMARY и x-SECONDARY, заменяет region-active-p на use-region-p, чтобы охватить случай пустой области, не возвращает молча, если xsel не имеет был установлен (возвращает сообщение об ошибке) и включает функцию «вырезать» (emacs Cy, windows Cx).

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)
0 голосов
/ 15 сентября 2008

Возможно, вы захотите указать, какую платформу вы используете. Это на Linux, Unix, Macosx, Windows, MS-DOS?

Я считаю, что для окон это должно работать. Для MacOSX он будет добавлен в буфер обмена x-windows, который отличается от буфера обмена macosx. Для Linux это зависит от вашего вкуса оконного менеджера, но я полагаю, что x-windows хорошо с ним справляется на большинстве из них.

Итак, уточните.

0 голосов
/ 15 сентября 2008

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

(Исходя из ссылки на Кейт, я так понимаю, вы работаете в linux или подобном и, возможно, так или иначе используете emacs в X.)

...