Як скопіювати текст з Emacs в інший додаток в Linux


113

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


Я пропоную вам прочитати це: CopyAndPaste-Emacs Wiki . Це дуже добре пояснює проблему туру.
El borito

Відповіді:


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.
Жил "ТАК - перестань бути злим"

Дякую ... схоже, змінна була перейменована з моменту написання. META-X set-variable RET select-enable-clipboard RET tабо(setq select-enable-clipboard t)
Девід Маккоррі

95

Вставте у свій .emacsфайл:

(setq x-select-enable-clipboard t)

3
Не слово, говорить вам, що вам потрібно знати. Відмінна відповідь.
JasonFruit

Працює чудово, я використовую Ubuntu 12.04. Дякую
zhihong

7
Приємно і просто, але це не працює в терміналі. Немає жодної причини, коли одна і така ж комбінація не повинна працювати як у терміналі, так і у вільному вікні, а деякі відповіді нижче наведені обидва одночасно.
RussellStewart

1
Під час запуску emacs -nwя використовую власні ярлики терміналу; Shift-Ctrl-X для вирізання (вбивства) тексту та Shift-Ctrl-C для копіювання.
memius

4
Це не спрацює, якщо ви запустите emacs -nwвсередині горизонтально розділених tmux windows.
Шрідхар Ратнакумар

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.

Удачі!


3
Це рішення працює для Emacs в якості X Window , тобто Emacs працює всередині вікна , якщо ви працюєте в Emacs в командному рядку , що вам потрібно , це: stackoverflow.com/questions/5288213 / ...
elviejo79

Symbol’s function definition is void: x-cut-buffer-or-selection-value
альпер

10

Складність копіювання та вставки в Emacs полягає в тому, що ви хочете, щоб вона працювала незалежно від внутрішнього kill / yank, і ви хочете, щоб вона працювала і в терміналі, і в gui. Існують надійні рішення для терміналу або gui, але не для обох. Після установки 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 ()" to "(defun copy-from-ubuntu (text & optional push)". Це працює для мене: D
Ренато Кассіно

Це працює, але робота з вставкою досить повільна, чи можна її реалізувати в мережі?
альпер

7

Я припускаю, що під Emacs ви маєте на увазі Emacs під X (тобто не всередині вікна терміналу).

Є два способи:

  1. (Застосовується лише для Unix OS) Виділіть потрібний текст мишкою (вона копіює його в буфер обміну X), а потім клацніть середнім клавішею, щоб вставити.
  2. Виділіть потрібний текст, а потім "Mx clipboard-kill-ring-save" (зауважте, що ви можете прив'язати це до більш простої клавіші). Потім просто "Правка-> Вставити" в улюбленому додатку.

Доступні операції з буфера обміну:

  • clipboard-kill-ring-save - вибір копіювання з Emacs у буфер обміну
  • clipboard-kill-region - виріжте вибір з Emacs у буфер обміну
  • clipboard-yank - вставити з буфера обміну в Emacs

7

Є стаття EmacsWiki, в якій пояснюються деякі проблеми з копіюванням та вставкою під X та як налаштувати його на роботу.


Існує запис у вікі для 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


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)

Чи є причини, щоб не перезаписати стандартні вкладки?
Пол Бродерсен

@Paul: "Стандартні прив'язки клавіш" призначені для "внутрішнього буфера обміну emacs", який відрізняється від буфера обміну X. Я цитував термін "внутрішній буфер обміну emacs", оскільки термінологія emacs відрізняється - зверніться до відмінного пояснення Кріса Конвея вище.
користувач1404316

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

1
Власне, ви можете використовувати і xclipдля вставки вмісту буфера обміну, а також за допомогою xclip -o. Це може бути корисно для людей, у яких вже є xclipі не хочуть встановлювати іншу програму, щоб робити як копіювання, так і вставлення.
Амін NAIRI

0

Хм, яку платформу та яку версію emacs ви використовуєте? Що стосується GNU Emacs 22.1.1 на Windows Vista, мені це добре працює.

Якщо ви, випадково, робите це з Windows до Linux через переглядач RealVNC, переконайтеся, що ви спочатку запускаєте "vncconfig -iconic" на вікні linux .....


0

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

(З посилань на kate, я вважаю, що ви знаходитесь на Linux або подібному і, ймовірно, використовуєте emacs в X так чи інакше.)


0

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

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

Отже, вкажіть, будь ласка.


-1

Що я роблю, - це використовувати хороший термінальний інструмент (PuTTY для Windows, Konsole або Terminal в Linux), який має вбудовані засоби копіювання.

У PuTTY ви виділяєте потрібний текст мишкою, а потім вставляєте його в інше місце. Клацання правою кнопкою миші у вікні PuTTY вставляє вміст буфера копіювання / вставки Windows.

У Konsole або Terminal в Linux ви виділите те, що ви хочете, потім натисніть Shift + Ctrl + C для копіювання та Shift + Ctrl + V для вставки.

У компіляції win32 emacs текст yanking ставить його на буфер копіювання / вставлення .. більшу частину часу.

У Mac OS X чіткові клавіші Apple працюють чудово, оскільки Термінал захоплює їх.

Немає прямого способу зробити це в командному рядку, оскільки оболонка не підтримує буфер копіювання / вставки для кожної програми. Баш робить зберегти копію / вставити буфер для себе, і, за замовчуванням, EMACS ^ к / ^ у ярликів роботи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.