2010-07-09 4 views
29

У меня есть (cua-mode t) в моем .emacs, так что Cc является копией, а Cv вставляется так же, как и большинство других программ на моем рабочем столе (Ubuntu, Gnome, Linux) , Тем не менее, Emacs, похоже, не разделяет буфер буфера обмена/копирования с другими программами.Интеграция Emacs копия/вставка с системной копией/вставкой

Например, если я C-c в Firefox, я могу использовать S-C-v для вставки в терминал или C-v для вставки в gedit. Однако, если я C-v (или C-y) в emacs, я не получаю то, что я скопировал из Firefox.

Есть ли способ сделать эту работу? Есть ли другая команда, которую я могу использовать для доступа к буферу копирования-вставки системы?

+0

Он действительно использует буфер обмена с системой, но только выбор мыши (то есть то, что вы можете вставить с помощью среднего щелчка в другом месте). – doublep

+0

Разве это не должно быть на superuser.com? –

+1

Вопросы Vim и Emacs обычно считаются одобренными для SO, поскольку они являются инструментами программиста. См. Различные обсуждения, которые уже произошли об этом по мета. – jamessan

ответ

8

Это работает на моей машине:

;; CUA OS copypasta even in ncurses mode 
(case system-type 
    ('darwin (unless window-system 
      (setq interprogram-cut-function 
        (lambda (text &optional push) 
        (let* ((process-connection-type nil) 
          (pbproxy (start-process "pbcopy" "pbcopy" "/usr/bin/pbcopy"))) 
         (process-send-string pbproxy text) 
         (process-send-eof pbproxy)))))) 
    ('gnu/linux (progn 
       (setq x-select-enable-clipboard t) 
       (defun xsel-cut-function (text &optional push) 
        (with-temp-buffer 
        (insert text) 
        (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input"))) 
       (defun xsel-paste-function() 

        (let ((xsel-output (shell-command-to-string "xsel --clipboard --output"))) 
        (unless (string= (car kill-ring) xsel-output) 
         xsel-output))) 
       (setq interprogram-cut-function 'xsel-cut-function) 
       (setq interprogram-paste-function 'xsel-paste-function)))) 
+0

Ницца! Это работает для C-c/C-x/C-v, но теперь средний клик не делится с системой. Значит ли средний клик для вас? – sligocki

+0

Это работает только в режиме окна emacs, а не в режиме терминала (-nw), верно? – galactica

+0

на mac это работает для меня в режиме терминала – mwag

15

См. clipboard-yank и clipboard-kill-region в разделе clipboard раздела руководства.

+0

+1 за то, что он был первым. – danlei

+1

Отлично, это именно то, что я искал. Я добавил (x-select-enable-clipboard t) в файл .emacs, и все работает так, как я ожидал. Спасибо. – sligocki

+0

Хм, на самом деле, это не совсем так. Это будет вставляться из X11. Но это намного лучше, чем было. – sligocki

4

Может быть, это EmacsWiki страница поможет, особенно раздел, где clipboard-kill-region, clipboard-kill-ring-save и clipboard-yank упоминаются.

+0

Спасибо @danlei, у wiki был полезный совет. – sligocki

+0

Добро пожаловать. EmacsWiki - отличный источник всего, что касается Emacs. – danlei

27

У меня была та же проблема. Я добавил это в моем .emacs файл:

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

Теперь Ctrl-C и Ctrl-V между Emacs и других приложений работают хорошо. Источник: Ubuntu Forums

+0

А, еще лучше. У меня была только первая команда. Но вторая помогает решить проблему, когда выбор текста и средний щелчок в emacs не копировались правильно. Благодаря! – sligocki

+0

Я новичок. Я создал ~/.emacs в первый раз. Я добавил ваш код в ~/.emacs, и он работает. Благодарю. –

+1

Это, похоже, не работает для Mac OSX; Получение этой ошибки. 'current-kill: определение функции символа void: x-cut-buffer-or-selection-value' – cevaris

0

Я решить эту проблему с autocutsel, который работает с emacs и остальной моей системы Ubuntu тоже.

autocutsel - keep the X clipboard and the cutbuffer in sync 

Я использую следующие команды (выполняются один раз, как правило, вызывается механизмом моего окна менеджера "Автозагрузка", или ~/.xsession):

autocutsel -fork 
autocutsel -fork -selection PRIMARY 

Первый экземпляр autocutsel выполняет следующий :

autocutsel отслеживает изменения в cutbuffer сервера [X11] и в буфере обмена выбор. Когда буфер обмена изменен, он обновляет бубнер. Когда cutbuffer изменен, ему принадлежит выбор буфера обмена. Выбор нужного буфера и буфера обмена всегда синхронизирован.

Однако обычно есть третий буфер, называемый PRIMARY, что второй экземпляр autocutsel используется для синхронизации с двумя другими.

Преимущества этого в том, что три основных буфера обмена унифицированы, так что вставка текущего выделения с помощью скопирования/вставки в стиле CUA с помощью CTRL-C и CTRL-V работает вместе.

Главным недостатком этого подхода является то, что любое автоматическое выделение текста (например, двойное нажатие, чтобы выделить слово в emacs или щелчок по значку BlockQuote в поле редактирования StackOverflow) мгновенно уничтожит ваш буфер копирования.Чтобы обойти это, я использую регистратор истории буфера обмена, такой как glipper, который также удобно записывает все содержимое буфера обмена и позволяет мне извлекать потерянное содержимое буфера обмена в таких обстоятельствах. Это может немного потренироваться и хорошо работать для меня. В качестве альтернативы вы можете поэкспериментировать с опцией -pause, которая ждет некоторого периода времени, прежде чем принимать выделение, которое может быть достаточно длинным, чтобы отменить выбор или удалить любой выделенный текст. Тем не менее, я не смог получить результаты, которые были достаточно хороши для меня.

Обратите внимание, что это решение не требует специальной конфигурации emacs, которую я использую с включенным режимом cua-mode.

Смежные вопросы