Ответы:
Будьте осторожны с нашими определениями здесь
kill-ring-save
( как правило , связаны с M-w).yank
(обычно привязанная к C-y).В моем случае (в GNOME):
Чтобы системное копирование работало с пастой 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.
META-X set-variable RET select-enable-clipboard RET t
или(setq select-enable-clipboard t)
Вставьте в свой .emacs
файл следующее:
(setq x-select-enable-clipboard t)
emacs -nw
, я использую собственные ярлыки терминала; Shift-Ctrl-X для вырезания (уничтожения) текста и Shift-Ctrl-C для копирования.
emacs -nw
окно tmux, разделенное по горизонтали.
Я вставляю это в свой .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.
Удачи!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
Сложность копирования и вставки в 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 вы имеете в виду Emacs под X (т.е. не внутри окна терминала).
Есть два способа:
Доступны операции с буфером обмена:
Есть статья 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)
В приведенном ниже коде, вдохновленном ответом @ 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)
Я использую следующее, основанное на других ответах здесь, для создания 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)))
xclip
для вставки содержимого буфера обмена с помощью xclip -o
. Это может быть полезно для людей, которые уже установили xclip
и не хотят устанавливать другую программу для копирования и вставки.
Вы можете указать, какую платформу вы используете. Это на linux, unix, macosx, windows, ms-dos?
Я считаю, что для окон это должно работать. Для MacOSX он будет добавлен в буфер обмена x-windows, что не то же самое, что буфер обмена macosx. Для Linux это зависит от вашего вкуса оконного менеджера, но я считаю, что x-windows прекрасно справляется с этим в большинстве из них.
Итак, уточните.
Что я делаю, так это использую хороший терминал (PuTTY в Windows, Konsole или Terminal в Linux), который имеет встроенные средства копирования.
В PuTTY вы выделяете нужный текст с помощью мыши, а затем вставляете его в другое место. Щелчок правой кнопкой мыши в окне PuTTY вставляет содержимое буфера копирования / вставки Windows.
В Konsole или терминале в Linux вы выделяете то, что хотите, затем нажимаете Shift + Ctrl + C для копирования и Shift + Ctrl + V для вставки.
В Win32-компиляции emacs, дергающий текст помещает его в буфер копирования / вставки .. большую часть времени.
В Mac OS X комбинации клавиш Apple работают нормально, потому что Терминал их перехватывает.
Прямого способа сделать это из командной строки нет, поскольку оболочка не поддерживает буфер копирования / вставки для каждого приложения. Баш делает сохранить копию / вставить буфер для себя, и, по умолчанию, EMACS ^ к / ^ у ярлыков работы.