Скопируйте текст из Emacs в буфер обмена OS X

25

Когда я запускаю Emacs в текстовом терминале вместо обычного режима графического интерфейса, я могу скопировать в Emacs, активировав начало области с помощью C-SPC, а затем выбрать то, что я хочу, и затем сделать M-w.

Есть ли какой-нибудь способ получить регион, скопированный таким образом, который будет доступен в буфере обмена OSX, чтобы вставить его, скажем, на веб-страницу (очевидно, кроме запуска Emacs в режиме графического интерфейса)?

Я не заинтересован в создании другого ярлыка для этого, и в идеале для этого не нужно устанавливать какие-либо модули.

Я видел этот пост и попробовал принятый ответ, но он не работает, кажется, работает так, как я ожидал выше.

Есть еще идеи?

Галдер Замарреньо
источник
Чувак, этому вопросу почти 3 года, и на него дан ответ
Galder Zamarreño

Ответы:

33

Скопируйте из Emacs в буфер обмена OS X:

затем выберите регион M-| pbcopy RET

Вставить из буфера обмена OS X в Emacs:

C-u M-| pbpaste RET (заменяет текущий регион, если он существует)


Объяснение:

M-|run shell-command-on-region, который, как следует из названия, передает текущую область в команду оболочки. C-u M-|делает то же самое, но заменяет текущую область stdoutкомандой запуска.

pbcopyи pbpasteутилиты OS X для доступа к системному буферу обмена.

Андрей Симионеску
источник
1
Помимо ответа на вопрос, ваш ответ научил меня запускать команды оболочки из emacs, Amazing.
andreskwan
20

Следующее просто работает, скопировано отсюда

(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)
Галдер Замарреньо
источник
Словоблудие здесь кажется отсталым
Джордон Биондо,
1
С злым режимом это нарушает пустое поведение вставки
Феликс Д.
@FelixD .: xclip-modeстрадает от той же проблемы?
Стефан
Это похоже на ошибку в Emacs26 при копировании и вставке многобайтовых символов, как описано в emacs.stackexchange.com/questions/50485/…
silencej
9

Если вы используете Emacs «обычным способом» (то есть как приложение с графическим интерфейсом), то он должен сделать это по умолчанию. Если вы используете Emacs внутри эмулятора терминала, то он действительно не знает, как это сделать по умолчанию, но вы можете установить xclipпакет из GNU ELPA и затем включить тот, xclip-modeкоторый учит Emacs, как это делать как для GNU / Linux, так и для OSX.

Стефан
источник
Работает ли xclipс OSX? Из того, что я видел там, похоже, что он предназначен для работы с X11, см. Пост
Galder Zamarreño
1
xclip.elпакет был расширен для использования pbpaste.
Стефан,
Terminal Emacs в режиме сервера (не как обычный экземпляр) зависает, когда я по какой-то причине использую xclip под macOS.
rien333
Не могли бы вы сообщить об этом как об ошибке (либо напрямую мне, либо через M-x report-emacs-bug?
Стефан
3

Как сказал Стефан, графические приложения Emacs должны делать это по умолчанию.

В текстовом терминале другой вариант заключается в использовании таких функций:

(defun pbcopy ()
  (interactive)
  (let ((deactivate-mark t))
    (call-process-region (point) (mark) "pbcopy")))

(defun pbpaste ()
  (interactive)
  (call-process-region (point) (if mark-active (mark) (point)) "pbpaste" t t))

(defun pbcut ()
  (interactive)
  (pbcopy)
  (delete-region (region-beginning) (region-end)))
nisetama
источник
кроме случаев, когда это не так. 20 лет спустя, тот же ПБ в emacs .... Мне бы очень хотелось, чтобы была какая-то общая и вменяемая почва, заложенная где-то в камне
Николас
1

Вот простая функция elisp, которую вы можете поместить в свой файл .emacs, который копирует содержимое буфера, в котором вы находитесь, в буфер обмена. Вам не нужно ничего выбирать, он копирует все это. Код короткий и довольно понятный.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))
Jumar
источник
После загрузки или перезагрузки emacs вызывает его с помощью Mx xclip.
Джумар
ОП не просил скопировать весь буфер в буфер обмена, поэтому он не выполняет то, что просили. Что касается остальных, это, кажется, просто дублирует то, что уже сказали другие.
Стефан
Я извиняюсь, если это кажется не по теме. Я перешел на эту страницу из Google, где это был первый результат «копирования текста в буфер обмена emacs». Вопрос озаглавлен «Копировать текст из Emacs в буфер обмена OS X», поэтому легко увидеть, как вы можете получить здесь этот результат поиска. Я действительно думаю, что это применимо к тому, как опубликованная фраза их вопрос, это суперсет. Я уже посещал ответы StackExchange и был расстроен, когда простой ответ не был доступен, особенно когда я знал, что тысячи людей задают этот вопрос, поэтому я решил добавить свои для людей, которые могут получить выгоду.
Джумар
0

Проверьте clipboard-kill-regionи clipboard-yank. Они приходят из menu-bar.el.

Как только область выделена, вы можете использовать clipboard-kill-region для уничтожения области как в буфер вставки, так и в системный буфер обмена. clipboard-yank "вставляет" все, что в данный момент находится в системном буфере обмена.

bitops
источник
Пожалуйста, уточните свой ответ.
Дан
Я пытался скопировать что-то из emacs, используя эти команды, и не был доступен извне, чтобы скопировать это где-то за пределами Emacs.
Галдер Замарреньо,
@ GalderZamarreño это работает для меня в Emacs, а я на OSX.
bitops
0

Ответ Галдера Замарреньо велик, однако он нарушает putповедение, подобное злу, в режиме зла. Поэтому я адаптировал это немного ниже - я уверен, что это могло бы быть лучше, но это делает работу для меня. Не стесняйтесь предлагать улучшения:

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

----> Новый код

  (defun clipboard-on ()
    (interactive)
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
  (defun clipboard-off ()
    (interactive)
    (setq interprogram-cut-function 'gui-select-text)
    (setq interprogram-paste-function 'gui-selection-value))
  (global-set-key (kbd "C-c C-p") 'clipboard-on)
  (global-set-key (kbd "C-c C-y") 'clipboard-off))
tcelferact
источник