Скопіюйте текст із Emacs у буфер обміну OS X


25

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

Чи є якийсь спосіб, щоб скопійований таким чином регіон, був доступний у буфері обміну OSX, щоб вставити його, скажімо, на веб-сторінку (очевидно, крім запуску Emacs у режимі GUI, очевидно)?

Мені не цікаво створювати інший ярлик для цього, і в ідеалі він не повинен вимагати встановлення будь-яких модулів.

Я бачив цю публікацію і спробував прийняти відповідь, але, здається, це не працює так, як я очікував вище.

Будь-які інші ідеї?


Чувак, це питання майже 3 роки, і на нього відповіли
Гальдер Замарреньо

Відповіді:


33

Копія з буфера обміну OS X:

виберіть регіон тоді M-| pbcopy RET

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

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


Пояснення:

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

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


1
Окрім відповіді на запитання, ваша відповідь навчила мене запускати команди оболонки від emacs.
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/…
silentj

9

Якщо ви використовуєте Emacs "звичайним способом" (тобто як GUI-додаток), це вже повинно робити це за замовчуванням. Якщо ви використовуєте Emacs всередині емулятора терміналу, він дійсно не знає, як це зробити за замовчуванням, але ви можете встановити xclipпакет з GNU ELPA, а потім увімкнути те, xclip-modeщо вчить Emacs, як це робити як для GNU / Linux, так і для OSX.


Чи xclipпрацює з OSX? З того, що я бачив там, здається, він призначений для роботи з X11, дивіться пост
Галдер Замарреньо

1
xclip.elпакет був розширений для використання pbpaste.
Стефан

термінал 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)))

за винятком випадків, коли цього немає. 20 років потому, той самий pb в emacs .... Я дуже хотів би, щоб там був якийсь звичайний і здоровий грунт, встановлений в камені десь
Ніколас

1

Ось проста функція elisp, яку ви можете помістити у файл .emacs, який копіює вміст буфера, який ви знаходитесь, у буфер обміну. Не потрібно нічого вибирати, це копіює все. Код короткий і досить зрозумілий.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))

Після завантаження або перезавантаження emacs викликайте його за допомогою Mx xclip.
jumar

ОП не просила скопіювати весь буфер у буфер обміну, тому це не робить того, що було запропоновано. Щодо решти, це, здається, просто дублює те, що вже говорили інші.
Стефан

Прошу вибачення, якщо це здається поза темою. Я перейшов на цю сторінку від Google, де це був перший результат для "копіювання тексту в буфер обміну електронними повідомленнями". Питання має назву "Копіювати текст з буфера обміну Emacs до OS X", тому легко зрозуміти, як можна досягти цього результату пошуку. Я думаю, що це застосовно до того, як розміщена фраза їх запитання, супернабір. Я раніше відвідував відповіді StackExchange і був розчарований, коли простої відповіді було недоступно, особливо коли я знав, що тисячі людей задають питання, тому я подумав, що додав би моїх людям, які могли б отримати користь.
jumar

0

Перевірте clipboard-kill-regionі clipboard-yank. Ці походять menu-bar.el.

Після виділення регіону ви можете використовувати буфер обміну-kill-region для вбивства регіону як в буфер вставки, так і в буфер обміну системи. clipboard-yank "вставляє" все, що зараз є в буфер обміну системи.


Будь ласка, розгорніть свою відповідь.
День

Я намагався скопіювати щось із Emacs за допомогою цих команд, і не було доступно зовнішньо, щоб скопіювати це десь за межами Emacs.
Галдер Замарреньо

@ GalderZamarreño, це працює для мене в Emacs, і я перебуваю на OSX.
бітопс

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