2

В vim вы можете явно копировать / вставлять в / из буфера выбора X11 и буфера буфера обмена, используя "*y и "+y соответственно.

Мой emacs (очевидно, он не намеренный с моей стороны) настроен на использование буфера выбора для C-w , C-y и друзей.

Есть ли функции, которые я могу вызвать, аналогично kill-region и yank которые используют буфер буфера обмена?

Чтобы было понятно, я хочу выборочный доступ к обоим буферам одновременно. Основываясь на некоторых быстрых поисках в Интернете, похоже, что есть переменные конфигурации, которые я могу установить, которые глобально изменят yank для использования одного буфера или другого. Я хочу иметь возможность выбирать, как позволяют регистры vim * и + .

(Надеюсь, я правильно понял терминологию: когда я говорю "буфер выбора", я имею в виду буфер, в котором можно выделить текст с помощью мыши и щелчка средней кнопкой мыши для вставки. Когда я говорю "буфер буфера обмена", я имею в виду место, куда идет текст при копировании с помощью ctrl- c в приложениях, не являющихся emacs.)

Редактировать: ответ BZG действительно близко.

В gnome-terminal я выбираю ~/projects с помощью мыши, затем правой кнопкой мыши -> copy. Затем я выбираю / домой. Еще в гном-терминале, когда я делаю:

  • средняя мышь: /home
  • правая мышь -> вставить: ~ /projects

Когда я перехожу в Emacs и делаю:

  • средняя мышь: /home
  • Мой (янки): / домой
  • CSy (my-yank): ~ / projects

Большой! yank использует буфер выбора, а my-yank использует буфер обмена.

Теперь, все еще в Emacs, я делаю:

  • C-SPC Mf Mf Cw (сделать регион "обычным убийством" и убить его)

затем перейдите в gnome-терминал и выполните:

  • средняя мышь: "обычное убийство"
  • правая мышь -> вставить: ~/projects

Большой! Был изменен только буфер выбора, а не буфер обмена.

Затем, вернувшись в Emacs, я делаю:

  • C-SPC Mf Mf CSw (сделать регион "моим убить" и убить его)

затем перейдите в gnome-терминал и выполните:

  • средняя мышь: обычное убийство
  • правая мышь -> вставить: ~/projects

Это неправильно, буфер буфера обмена должен содержать "my kill".

Моя interprogram-cut-function x-select-text . Мой x-select-enable-clipboard равен nil .

3 ответа3

3

Этот код сопоставит CSy и CSw с настроенными версиями yank и kill-region , которые временно отключат использование буфера обмена:

(defun my-yank (&optional arg)
  (interactive "*P")
  (let ((x-select-enable-clipboard (not x-select-enable-clipboard)))
    (yank arg)))

(defun my-kill-region (beg end)
  (interactive "r")
  (let ((interprogram-cut-function
     (when (not (eq interprogram-cut-function 'x-select-text))
       'x-select-text)))
    (kill-region beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-S-y") 'my-yank)

Так что, если вы скопировали что-то в X и не хотите, чтобы его тянули в Emacs, используйте CSy. Если вы убиваете что-то в Emacs и не хотите этого в буфере обмена X, используйте CSw.

Все это при условии, что вы используете значения по умолчанию для x-select-enable-clipboard' and interprogram-cut-function', конечно.

1

Ответ bzg очень близок, но переключение interprogram-cut-function не совсем помогает - я полагаю, что оно заканчивается nil поскольку эта переменная имеет значение при запуске функции.

Этот пересмотренный набор функций делает именно то, что я хочу, явно устанавливая буфер обмена / первичные разрешения в каждой из них. Большая шляпа подсказка bzg для того, чтобы я был на правильном пути!

(defun my-yank (&optional arg)
  "Yank from the clipboard, not the primary selection."
  (interactive "*P")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (yank arg)))

(defun my-kill-region (beg end)
  "Kill to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-region beg end)))

(defun my-kill-ring-save (beg end)
  "Save to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-ring-save beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-M-S-w") 'my-kill-ring-save)
(define-key global-map (kbd "C-S-y") 'my-yank)
0

Emacs предоставляет некоторые полезные функции в menu-bar.el всех мест. Так что я:

 (global-set-key [(control shift ?w)] 'clipboard-kill-ring-save)
 (global-set-key [(control shift ?y)] 'clipboard-yank)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .