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

StackOverflow https://stackoverflow.com/questions/64360

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение 2

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

(setq x-select-enable-clipboard t)

Другие советы

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

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

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

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

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

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

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

Сложность с копированием и вставкой в 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)

Я вставляю это в свой файл .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.

Удачи вам!

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

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

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

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

  • буфер обмена-уничтожить-кольцо-сохранить - скопировать выделение из Emacs в буфер обмена
  • буфер обмена-уничтожить-область -- вырезать выделение из Emacs в буфер обмена
  • буфер обмена-выдернуть -- вставить из буфера обмена в Emacs

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

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

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

(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)

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

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

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

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

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

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

Итак, пожалуйста, уточните.

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

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

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

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

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

Прямого способа сделать это в командной строке нет, потому что оболочка не поддерживает буфер копирования / вставки для каждого приложения.удар делает поддерживайте буфер копирования / вставки для себя, и, по умолчанию, работают ярлыки emacs ^ k / ^ y.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top