Как скопировать текст из Emacs в другое приложение в Linux

113

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

Memius
источник
Я предлагаю вам прочитать это: CopyAndPaste-Emacs Wiki . Это очень хорошо объясняет туристическую проблему.
Эль борито

Ответы:

122

Будьте осторожны с нашими определениями здесь

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

В моем случае (в 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-буфера обмена: вырезание и вставка в этом случае осуществляется через терминал . Например, «Правка-> Вставить» в окне вашего терминала должно действовать точно так же, как если бы вы ввели текст из буфера обмена в буфер Emacs.

Крис Конвей
источник
7
Это сбивающая с толку терминология . Стандартное и менее запутанное название того, что вы называете «копирование / вставка X», - это основной выбор X. То, что вы называете «системным копированием / вставкой», - это X-буфер обмена.
Жиль 'SO- перестань быть злом'
Спасибо ... похоже, переменная была переименована с тех пор, как это было написано. META-X set-variable RET select-enable-clipboard RET tили(setq select-enable-clipboard t)
Дэвид МакКорри
95

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

(setq x-select-enable-clipboard t)
Memius
источник
3
Не многословен, говорит то, что вам нужно знать. Отличный ответ.
JasonFruit 09
Работает отлично, использую Ubuntu 12.04. Спасибо
zhihong
7
Красиво и просто, но в терминале это не работает. Нет причин, по которым один и тот же ярлык не должен работать как в терминале, так и в свободном окне, и некоторые из ответов ниже относятся к обоим одновременно.
RussellStewart 09
1
Когда я бегу emacs -nw, я использую собственные ярлыки терминала; Shift-Ctrl-X для вырезания (уничтожения) текста и Shift-Ctrl-C для копирования.
memius
4
Это не сработает, если вы запустите emacs -nwокно tmux, разделенное по горизонтали.
Шридхар Ратнакумар
11

Я вставляю это в свой .emacs:

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

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

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

Удачи!

jfm3
источник
3
Это решение работает для emacs в X Window, т.е. emacs работает внутри окна, если вы запускаете emacs в командной строке, что вам нужно: stackoverflow.com/questions/5288213/…
elviejo79 02
Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper
10

Сложность копирования и вставки в 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)
РасселСтьюарт
источник
Поскольку я получаю сообщение об ошибке, потому что нет параметров. Мне нужно изменить первую строку "(defun copy-to-clipboard ()" на "(defun copy-from-ubuntu (text & optional push)". Это работает для меня: D
Ренато Кассино
Он работает, но операция вставки выполняется довольно медленно, может ли это быть реализовано в сети?
alper
7

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

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

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

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

  • clipboard-kill-ring-save - скопировать выделение из Emacs в буфер обмена
  • clipboard-kill-region - вырезать выделение из Emacs в буфер обмена
  • clipboard-yank - вставить из буфера обмена в Emacs
pdq
источник
7

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

cschol
источник
Есть запись в wiki emacs, которую можно скопировать и вставить. Вот как это плохо.
Николас
4

Это работает с M-wMac 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

Cevaris
источник
1

В приведенном ниже коде, вдохновленном ответом @ 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)
user1404316
источник
Есть какие-то причины не перезаписывать стандартные сочетания клавиш?
Пол Бродерсен
@Paul: «Стандартные сочетания клавиш» предназначены для «внутреннего буфера обмена emacs», который отличается от X-буфера обмена. Я процитировал термин «внутренний буфер обмена emacs», потому что терминология emacs отличается - см. Превосходное объяснение Криса Конвея выше.
user1404316 08
1

Я использую следующее, основанное на других ответах здесь, для создания C-x C-wи C-x C-yкопирования и вставки как на Mac, так и на Linux (если кто-то знает версию для Windows, не стесняйтесь добавлять ее). Обратите внимание, что в Linux вам нужно будет установить xsel и xclip с вашим менеджером пакетов.

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))
asmeurer
источник
1
Фактически, вы также можете использовать xclipдля вставки содержимого буфера обмена с помощью xclip -o. Это может быть полезно для людей, которые уже установили xclipи не хотят устанавливать другую программу для копирования и вставки.
Амин НАИРИ,
0

Хм, какую платформу и какую версию emacs вы используете? С GNU Emacs 22.1.1 в Windows Vista он отлично работает.

Если по какой-то причине вы делаете это из Windows в Linux через программу просмотра RealVNC, убедитесь, что вы сначала запускаете "vncconfig -iconic" в окне Linux ...

КФХ
источник
0

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

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

cannam
источник
0

Вы можете указать, какую платформу вы используете. Это на linux, unix, macosx, windows, ms-dos?

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

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

Матс Фредрикссон
источник
-1

Что я делаю, так это использую хороший терминал (PuTTY в Windows, Konsole или Terminal в Linux), который имеет встроенные средства копирования.

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

В Konsole или терминале в Linux вы выделяете то, что хотите, затем нажимаете Shift + Ctrl + C для копирования и Shift + Ctrl + V для вставки.

В Win32-компиляции emacs, дергающий текст помещает его в буфер копирования / вставки .. большую часть времени.

В Mac OS X комбинации клавиш Apple работают нормально, потому что Терминал их перехватывает.

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

кроличий садок
источник