На Emacs для OSX, как разделить список уничтожений и буфер обмена?
В GNU Emacs для OSX, как я могу разделить список уничтожений и буфер обмена OSX? (Такой, что у меня есть два отдельных кольца убийства.)
При желаемом поведении это будет работать:
1. ⌘ C, чтобы скопировать текст из Интернета в буфер обмена OSX.
2. управляйте k, чтобы убить строку в Emacs.
3. управляйте y, чтобы вернуть уничтоженный текст из списка уничтожений Emacs в текущий буфер Emacs.
4. Вставьте оригинальный веб-текст из буфера обмена OSX в текущий буфер Emacs.
Это работает из коробки в Aquamacs. Как заставить работать в GNU Emacs?
Этот вопрос обсуждался здесь, поскольку он относится к Windows: Emacs: Как отделить список уничтожений от системного буфера обмена?
и здесь: http://lists.gnu.org/archive/html/help-emacs-windows/2010-02/msg00001.HTML
... но это решение не работает в OSX. Я хотел бы решение для Mac OSX.
6 ответов
Решение в Emacs: как отделить список уничтожений от системного буфера обмена? работает, хотя и не завершено. Вы можете позвонить pbcopy
себя, чтобы правильно вставить буфер обмена. Например, попробуйте следующее в вашем .emacs
, Обратите внимание, что s-v
для Cmd+V
в оконной системе OS X То же самое касается s-c
,
;;; Tested on:
;;; 1. GNU Emacs 24.3.1 (x86_64-apple-darwin13.0.0)
;;; of 2013-12-22 on tennine-slave.macports.org
;;; (MacPorts emacs@24.3_1)
;;;
;;; 2. GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
;;; of 2013-03-12 on bob.porkrind.org
;;; (Emacs For Mac OS X)
(defun isolate-kill-ring()
"Isolate Emacs kill ring from OS X system pasteboard.
This function is only necessary in window system."
(interactive)
(setq interprogram-cut-function nil)
(setq interprogram-paste-function nil))
(defun pasteboard-copy()
"Copy region to OS X system pasteboard."
(interactive)
(shell-command-on-region
(region-beginning) (region-end) "pbcopy"))
(defun pasteboard-paste()
"Paste from OS X system pasteboard via `pbpaste' to point."
(interactive)
(shell-command-on-region
(point) (if mark-active (mark) (point)) "pbpaste" nil t))
(defun pasteboard-cut()
"Cut region and put on OS X system pasteboard."
(interactive)
(pasteboard-copy)
(delete-region (region-beginning) (region-end)))
(if window-system
(progn
(isolate-kill-ring)
;; bind CMD+C to pasteboard-copy
(global-set-key (kbd "s-c") 'pasteboard-copy)
;; bind CMD+V to pasteboard-paste
(global-set-key (kbd "s-v") 'pasteboard-paste)
;; bind CMD+X to pasteboard-cut
(global-set-key (kbd "s-x") 'pasteboard-cut))
;; you might also want to assign some keybindings for non-window
;; system usage (i.e., in your text terminal, where the
;; command->super does not work)
)
Если вы когда-нибудь сталкивались с проблемами с UTF-8, рассмотрите следующее возможное решение:
;; handle emacs utf-8 input
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(setenv "LANG" "en_US.UTF-8")
ПРИМЕЧАНИЕ. Это черновое решение не предназначено для общесистемной модификации Emacs, разделяющей буферы обмена. Вместо этого это нестандартное решение, предназначенное для разделения буфера обмена на interactive
основа только при использовании этих пользовательских функций. Другие функции в Emacs, которые используют kill-ring
можно изменить с помощью аналогичного метода - переменные interprogram-cut-function
а также interprogram-paste-function
может быть сделано let-bound
к nil
значение для продолжительности конкретных функций (либо через advice
или изменение самого источника, или создание новых функций и / или использование defalias
). Однако последнее выходит за рамки этого ограниченного примера.
ИСТОРИЯ
Первый черновик (23 декабря 2014 г.): это первый черновик, основанный на идее, что к буферу обмена OSX можно получить доступ только при использовании C-u
перед вызовом функций копирования или вставки. Если C-u
сначала вызывается, затем используется буфер обмена OSX. Поскольку я использую функции чаще на ежедневной основе, у меня могут быть дополнительные изменения в этом коде, и я буду время от времени обновлять их:
РЕДАКТИРОВАТЬ (24 декабря 2014 г.): удалено *
из интерактивного оператора команды, чтобы lawlist-copy-selected-region
- это был read-only
проверка необходима для вставки, но не для копирования. Добавлено утверждение относительно общего характера этого примера.
РЕДАКТИРОВАТЬ (28 декабря 2014 г.). Пересмотрен код для лучшей обработки, когда пользователь забыл выбрать регион перед вызовом. lawlist-copy-selected-region
, Небольшие изменения, чтобы сделать код более кратким.
(defun lawlist-copy-selected-region (&optional arg)
(interactive "P")
(let* (
(interprogram-cut-function
(when (equal arg '(4)) interprogram-cut-function))
(interprogram-paste-function
(when (equal arg '(4)) interprogram-paste-function))
(region-active-p (region-active-p))
(beg (when region-active-p (region-beginning)))
(end (when region-active-p (region-end)))
(copied-string
(when region-active-p (buffer-substring-no-properties beg end))) )
(unless region-active-p
(let ((debug-on-quit nil))
(signal 'quit `("No region has been selected!"))))
(copy-region-as-kill beg end)
(when (not (active-minibuffer-window))
(message "%s"
(concat
(if (and interprogram-cut-function interprogram-paste-function)
"OSX+Emacs: "
"Emacs: ")
(truncate-string-to-width copied-string 40)
(when (> (length copied-string) 40)
" . . .")))) ))
(defun lawlist-yank (&optional arg)
(interactive "*P")
(unless arg (setq arg 1))
(setq yank-window-start (window-start))
(setq this-command t)
(push-mark (point))
(insert-for-yank
(lawlist-current-kill
(cond
((listp arg)
arg)
((eq arg '-)
-2)
(t
(1- arg) ))))
(if (consp arg)
(goto-char (prog1 (mark t)
(set-marker (mark-marker) (point) (current-buffer)))))
(if (eq this-command t)
(setq this-command 'yank))
(when (region-active-p)
(setq mark-active nil))
nil)
(defun lawlist-current-kill (n &optional do-not-move)
(let ((interprogram-paste
(and
(equal n '(4))
interprogram-paste-function
(funcall interprogram-paste-function))))
(cond
(interprogram-paste
(let ((interprogram-cut-function nil))
(if (listp interprogram-paste)
(mapc 'kill-new (nreverse interprogram-paste))
(kill-new interprogram-paste)))
(car kill-ring))
((and (equal n '(4)) (not interprogram-paste))
(car kill-ring))
(t
(or kill-ring
(let ((debug-on-quit nil))
(signal 'quit `("The kill-ring is empty."))))
(let (
(ARGth-kill-element
(nthcdr
(mod (- n (length kill-ring-yank-pointer)) (length kill-ring))
kill-ring)))
(unless do-not-move
(setq kill-ring-yank-pointer ARGth-kill-element)
(when
(and
yank-pop-change-selection
(> n 0)
interprogram-cut-function)
(funcall interprogram-cut-function (car ARGth-kill-element))))
(car ARGth-kill-element))))))
После долгих раздумий я почти уверен, что единственный способ заставить эту работу переопределить x-select-text
метод. Проверьте мой ответ здесь для всех деталей: /questions/14653891/predotvratit-emacs-ot-izmeneniya-bufera-obmena-os-x/14653899#14653899
(global-set-key (kbd "C-x M-y")
(lambda ()
(interactive)
(insert-string (ns-get-pasteboard))))
(global-set-key (kbd "C-x M-w")
(lambda ()
(interactive)
(when (region-active-p)
(ns-set-pasteboard
(buffer-substring (region-beginning)
(region-end))))))
простой клип может быть полезен -
Упрощенный доступ к системному буферу обмена в Emacs.
Режим simpleclip радикально упрощает работу с буфером обмена: системный буфер обмена и список уничтожений Emacs сделаны полностью независимыми и никогда не влияют друг на друга.
Привязки супер-клавиш удобны для OS X: супер обычно отображается на "командную" клавишу, т. Е. ⌘.
Протестировано на OS X, X11 и MS Windows
Помогает ли это:
(setq x-select-enable-clipboard nil)
Это разделит только два буфера обмена, и для того, чтобы Cmd+c и Cmd+v работали так, как указано выше, вам придется привязать их к clipboard-kill-ring-save
а также clipboard-yank
,
Я использую этот Emacs: https://github.com/railwaycat/emacs-mac-port