首页 / 知识

如何将文本从Emacs复制到Linux上的另一个应用程序

2023-04-15 10:47:00

如何将文本从Emacs复制到Linux上的另一个应用程序

How to copy text from Emacs to another application on Linux

当我在Emacs 22.1.1中剪切(杀死)文本时(在X上自己的窗口中,在KDE中,在Kubuntu上),我无法将其粘贴(猛拉)到任何其他应用程序中。


让我们小心这里的定义

  • Emacs副本是命令kill-ring-save(通常绑定到M-w)。
  • 通常通过按C-c(或在应用程序窗口中选择"编辑"->"复制")获得系统副本。
  • X副本是用鼠标光标"物理地"突出显示文本。
  • Emacs粘贴是命令yank(通常绑定到C-y)。
  • 通常,通过按C-v(或在应用程序窗口中选择"编辑-粘贴")可以得到系统粘贴。
  • X粘贴是按下"鼠标中键"(通过同时按下左右鼠标键来模拟)。

就我而言(在GNOME上):

  • Emacs和系统复制通常都可以使用X粘贴。
  • X复制通常与Emacs粘贴一起使用。
  • 要使系统复制与Emacs粘贴一起工作,并且使Emacs复制与系统粘贴一起工作,您需要在.emacs中添加(setq x-select-enable-clipboard t)。或尝试

    1
    META-X set-variable RET x-select-enable-clipboard RET t

我认为这是相当标准的现代Unix行为。

同样重要的是要注意(尽管您说您在单独的窗口中使用Emacs),当Emacs在控制台中运行时,它与系统和X剪贴板完全分离:在这种情况下,剪切和粘贴是由终端介导的。例如,终端窗口中的"编辑->粘贴"应该完全像将剪贴板中的文本输入到Emacs缓冲区中一样。


将以下内容插入您的.emacs文件:

1
(setq x-select-enable-clipboard t)

我把这个贴在我的.emacs中:

1
2
(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

随后,我基本上没有问题,可以从Emacs中的任何内容剪切和来回粘贴到任何其他X11或Gnome应用程序。

奖励:要使这些事情在Emacs中发生而不必重新加载整个.emacs,只需在.emacs缓冲区中每个表达式的关闭括号之后用光标执行C-x C-e。

祝好运!


在Emacs中复制和粘贴的困难在于,您希望它独立于内部kill / yank运行,并且希望它同时在终端和gui中运行。现有针对终端或??GUI的强大解决方案,但不能同时针对两者。安装xsel(例如sudo apt-get install xsel)之后,我将复制并粘贴以合并它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(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是指X下的Emacs(即不在终端窗口内)。

有两种方法:

  • (仅适用于Unix OS)
    用您的文字突出显示所需文本
    鼠标(将其复制到X
    剪贴板),然后单击鼠标中键
    糊。
  • 突出显示所需文本,然后突出显示" M-x剪贴板-kill-ring-保存"
    (请注意,您可以将此绑定到一个更简单的
    键)。然后只需在"编辑->粘贴"中
    您最喜欢的应用。
  • 剪贴板操作可用:

    • 剪贴板-杀死环-保存-复制
      从Emacs到剪贴板的选择
    • 剪贴板杀人区域-切
      从Emacs到剪贴板的选择
    • 剪贴板粘贴-从粘贴
      Emacs的剪贴板

    EmacsWiki上有一篇文章,解释了在X下复制和粘贴的一些问题以及如何配置它以使其工作。


    在Mac OSX上与M-w一起使用。只需添加到您的.emacs文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (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)

    来源https://gist.github.com/the-kenny/267162


    根据其他答案,我使用以下内容使C-x C-wC-x C-y在Mac和Linux上都可以复制并粘贴(如果有人知道Windows的版本可以随意添加)。请注意,在Linux上,您将必须使用软件包管理器安装xsel和xclip。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ;; 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)))

    下面的代码受@RussellStewart上面答案的启发,增加了对x-PRIMARY和x-SECONDARY的支持,用use-region-p替换了region-active-p以覆盖空白区域,如果未安装xsel,它不会默默返回(返回错误消息),并包括"剪切"功能(emacs Cy,Windows Cx)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    (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)

    您可能要指定使用的平台。它在Linux,Unix,MacOSX,Windows,MS-DOS上吗?

    我相信对于Windows,它应该可以工作。对于MacOSX,它将添加到x-windows剪贴板中,与macosx剪贴板不同。对于Linux,这取决于您的窗口管理器风格,但是我相信x-windows在大多数窗口中都可以很好地处理它。

    因此,请指定。


    我一直使用快速粘贴-在emacs中拖动选择,在目标窗口中单击鼠标中键。

    (从参考资料到kate,我认为您使用的是Linux或类似操作系统,并且可能以一种或另一种方式在X中使用emacs。)


    嗯,您使用的是什么平台和哪个版本的emacs?使用Windows Vista上的GNU Emacs 22.1.1,对我来说很好用。

    如果您有机会通过RealVNC查看器从Windows到Linux进行此操作,请确保首先在Linux机器上运行" vncconfig -iconic"。


    我要做的是使用内置复制功能的优质终端工具(Windows上为PuTTY,Linux上为Konsole或Terminal)。

    在PuTTY中,用鼠标突出显示所需的文本,然后将其粘贴到其他位置。在PuTTY窗口中单击鼠标右键将粘贴Windows复制/粘贴缓冲区的内容。

    在Linux上的Konsole或Terminal中,突出显示所需内容,然后按Shift + Ctrl + C进行复制,并按Shift + Ctrl + V进行粘贴。

    在emacs的win32编译中,大多数情况下,拖拽文本会将其放置在复制/粘贴缓冲区中。

    在Mac OS X上,Apple键快捷键可以正常工作,因为Terminal会捕获它们。

    在命令行上没有直接的方法,因为shell不会为每个应用程序维护一个复制/粘贴缓冲区。 bash确实会为其自身保留一个复制/粘贴缓冲区,并且默认情况下,emacs ^ k / ^ y快捷方式有效。


    文本应用程序副本自己的

    最新内容

    相关内容

    猜你喜欢