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

如何将文本从Emacs复制到Linux上的另一个应用程序,emacs,copy-paste,Emacs,Copy Paste,当我剪切(杀死)Emacs 22.1.1中的文本时(在X、KDE、Kubuntu上的它自己的窗口中),我不能将其粘贴(yank)到任何其他应用程序中。Hmm,您使用的是什么平台和Emacs的哪个版本?Windows Vista上的GNU Emacs 22.1.1对我来说很好 如果您通过RealVNC查看器从windows到linux执行此操作,请确保首先在linux设备上运行“vnconfig-icogal”…我要做的是使用一个内置复制功能的优秀终端工具(windows上的PuTTY、Konso

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

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


如果您通过RealVNC查看器从windows到linux执行此操作,请确保首先在linux设备上运行“vnconfig-icogal”…

我要做的是使用一个内置复制功能的优秀终端工具(windows上的PuTTY、Konsole或linux上的terminal)

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

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

在emacs的win32编译中,yanking text确实将其放在复制/粘贴缓冲区中。。大多数时候

在MacOSX上,Apple按键chortcuts工作正常,因为终端会捕获它们

在命令行上没有直接的方法,因为shell没有为每个应用程序维护复制/粘贴缓冲区。bash确实为自己维护了一个复制/粘贴缓冲区,默认情况下,emacs ^k/^y快捷方式可以工作。

我总是使用快速粘贴--在emacs中拖动所选内容,在目标窗口中单击鼠标中键


(从kate的参考资料来看,我认为您使用的是linux或类似系统,可能以某种方式使用emacs。)

您可能需要指定您使用的平台。它在linux、unix、macosx、windows和ms dos上运行吗

我相信对于windows来说,它应该可以工作。对于MacOSX,它将被添加到x-windows剪贴板,这与MacOSX剪贴板不同。对于Linux,这取决于您对窗口管理器的喜好,但我相信x-windows在大多数情况下都能很好地处理它


因此,请具体说明。

这解释了X下复制和粘贴的一些问题以及如何将其配置为工作。

我认为emacs指的是X下的emacs(即不在终端窗口内)

有两种方法:

  • (仅适用于unix操作系统) 用鼠标突出显示所需的文本 鼠标(这会将其复制到X 剪贴板),然后中键单击以 粘贴
  • 突出显示所需文本,然后“保存M-x剪贴板” (注意,您可以将其绑定到更简单的 键)。然后只需在中“编辑->粘贴” 你最喜欢的应用
  • 剪贴板操作可用:

    • 剪贴板杀死环保存--复制 从Emacs到剪贴板的选择
    • 剪贴板终止区域--剪切 从Emacs到剪贴板的选择
    • 剪贴板猛拉--从中粘贴 剪贴板到Emacs

    .emacs
    文件中插入以下内容:

    (setq x-select-enable-clipboard t)
    

    让我们在这里小心定义

    • Emacs副本是命令
      kill ring save
      (通常绑定到M-w)
    • 系统副本通常是通过按C-C键(或在应用程序窗口中选择“编辑->复制”)获得的
    • X副本是用鼠标光标“物理”突出显示文本
    • Emacs粘贴是命令
      yank
      (通常绑定到C-y)
    • 系统粘贴通常是通过按C-v键(或在应用程序窗口中选择“编辑粘贴”)获得的
    • X粘贴按下“鼠标中键”(通过同时按下鼠标左键和右键模拟)
    就我而言(在GNOME上):

    • Emacs和system copy通常都使用X paste
    • X拷贝通常与Emacs粘贴一起使用
    • 要使系统复制与Emacs粘贴一起工作,并使Emacs复制与系统粘贴一起工作,您需要将
      (setq x-select-enable-clipboard t)
      添加到
      .Emacs
      中。或尝试

      META-X set-variable RET x-select-enable-clipboard RET t
      
    我认为这是相当标准的现代Unix行为


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

    我将其粘贴在.emacs中:

    (setq x-select-enable-clipboard t)
    (setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
    
    随后,我基本上没有问题从Emacs中的任何东西来回剪切和粘贴到任何其他X11或Gnome应用程序

    额外好处:为了让这些事情在Emacs中发生,而不必重新加载整个.Emacs,请在.Emacs缓冲区中的每个表达式关闭paren之后使用光标执行C-x C-e


    祝你好运

    在Emacs中复制和粘贴的困难在于您希望它独立于内部kill/yank工作,并且您希望它在终端和gui中工作。现有的健壮解决方案可以用于终端或gui,但不能同时用于两者。在安装xsel(例如,
    sudo apt get install xsel
    )之后,我要做的是复制和粘贴以将它们结合起来:

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

    这适用于Mac OSX上的
    M-w
    。只需添加到.emacs文件

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

    Source

    下面的代码受上面@RussellStewart答案的启发,增加了对x-PRIMARY和x-SECONDARY的支持,将
    region-active-p
    替换为
    use-region-p
    ,以覆盖空区域的情况,如果没有安装xsel,则不会自动返回(返回错误消息),并包含一个“cut”函数(emacs C-y、windows C-x)


    基于这里的其他答案,我使用以下方法在Mac和Linux上复制并粘贴
    C-xc-w
    C-xc-y
    (如果有人知道Windows版本,请随意添加)。请注意,在Linux上,您必须使用软件包管理器安装xsel和xclip

    ;;与剪贴板交互的命令
    (卸载osx副本(结束)
    (交互式“r”)
    (呼叫过程)
    
    (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)