LinuxでEmacsから別のアプリケーションにテキストをコピーする方法


113

Emacs 22.1.1(X上の独自のウィンドウ、KDE、Kubuntu)でテキストをカット(kill)すると、他のアプリケーションに貼り付ける(ヤンクする)ことができません。


これを読むことをお勧めします:CopyAndPaste-Emacs Wiki。これは非常によくツアーの問題を説明します。
El borito

回答:


122

ここでの定義に注意しましょう

  • Emacsのコピーはコマンドですkill-ring-save(通常に結合していますM-w)。
  • システムコピーは、あなたが一般的に押すことから得るものですC-c(またはアプリケーションウィンドウの「編集- >コピー」を選択します)。
  • アンXコピー「物理的に」マウスカーソルでテキストをハイライト表示されます。
  • Emacsのペーストは、コマンドでyank通常にバインドされました(C-y)。
  • システムペーストを使用すると、一般的に押すことから得るものですC-v(またはアプリケーションウィンドウで「編集-貼り付け」を選択します)。
  • Xペーストは、(一緒に左と右のマウスボタンを押すことによってシミュレートされた)「中央マウスボタン」を押しています。

私の場合(GNOME上):

  • 通常、EmacsとシステムコピーはどちらもXペーストで機能します。
  • 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バッファにテキストを入力した場合とまったく同じように機能します。


7
これは紛らわしい用語です。「Xコピー/貼り付け」と呼んでいるものの、標準でわかりやすい名前は、Xの主要な選択です。「システムコピー/貼り付け」とは、Xクリップボードです。
Gilles「SO-邪悪なことをやめなさい」2014

おかげで...これが書かれてから変数の名前が変更されたようです。META-X set-variable RET select-enable-clipboard RET tまたは(setq select-enable-clipboard t)
David McCorrie

95

以下を.emacsファイルに挿入します。

(setq x-select-enable-clipboard t)

3
言い回しではなく、知っておくべきことを説明します。すばらしい答えです。
JasonFruit

私はUbuntu 12.04を使用しています。ありがとう
zhihong

7
素晴らしくシンプルですが、これはターミナルでは機能しません。同じショートカットがターミナルとフリーウィンドウの両方で機能しない理由はありません。以下の回答のいくつかは、同時に両方に対応しています。
RussellStewart 2014年

1
を実行するときemacs -nwは、ターミナル自体のショートカットを使用します。Shift-Ctrl-Xでテキストをカット(キル)し、Shift-Ctrl-Cでコピーします。
メミウス

4
emacs -nw水平に分割されたtmuxウィンドウ内で実行する場合、これは機能しません。
Sridhar Ratnakumar

11

私はこれを私の.emacsに貼り付けます:

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

その後、基本的に、Emacsのあらゆるものから他のX11またはGnomeアプリケーションに切り貼りする問題はありません。

おまけ:.emacs全体をリロードせずにEmacsでこれらのことを実行するには、.emacsバッファー内の各式の閉じかっこの直後にカーソルでCx Ceを実行します。

幸運を!


3
このソリューションは、Xウィンドウのemacsで機能します。つまり、コマンドラインでemacsを実行している場合、emacsはウィンドウ内で実行されています。必要なのは、stackoverflow.com
questions / 5288213 /…

Symbol’s function definition is void: x-cut-buffer-or-selection-value
アルパー

10

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)

パラメータがないため、エラーが発生します。最初の行「(defun copy-to-clipboard()」を「(defun copy-from-ubuntu(text&optional push)」に変更する必要があります。これは私にとっては機能します:D
Renato Cassino

動作しますが、貼り付け操作はかなり遅いです、それはネットワークに実現できますか?
アルパー

7

私はemacsによって、Xの下で(つまり、ターミナルウィンドウ内ではなく)Emacsを意味していると思います。

2つの方法があります。

  1. (UNIX OSのみに適用)目的のテキストをマウスで強調表示し(これはXクリップボードにコピーされます)、中央ボタンをクリックして貼り付けます。
  2. 目的のテキストを強調表示してから、「Mx clipboard-kill-ring-save」を強調表示します(これをより簡単なキーにバインドできることに注意してください)。次に、お気に入りのアプリで「編集」→「貼り付け」を選択します。

利用可能なクリップボード操作:

  • clipboard-kill-ring-save-選択範囲をEmacsからクリップボードにコピーする
  • clipboard-kill-region-Emacsからクリップボードに選択範囲を切り取ります
  • clipboard-yank-クリップボードからEmacsに貼り付け

7

Xでのコピーと貼り付けに関するいくつかの問題と、Xが動作するように構成する方法を説明するEmacsWikiの記事があります。


コピーして貼り付けるemacs wikiエントリがあります。それはそれがいかに悪いかです。
ニコラ

4

これM-wはMac OSXで動作します。.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)

ソースhttps://gist.github.com/the-kenny/267162


1

以下のコードは、上記の@RussellStewartの回答に触発されて、x-PRIMARYとx-SECONDARYのサポートを追加し、空の領域のケースをカバーするように置き換えregion-active-puse-region-pxselがインストールされていない場合にエラーを返さず、エラーメッセージを返します。 「カット」機能が含まれています(emacs Cy、windows Cx)。

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

標準のキーバインドを上書きしない理由はありますか?
Paul Brodersen 2017

@Paul:「標準キーバインド」は「emacs内部クリップボード」用であり、Xクリップボードとは異なります。emacsの用語が異なるため、「emacs内部クリップボード」という用語を引用しました。上記のChris Conwayの優れた説明を参照してください。
user1404316 2017

1

私は作るために、ここでは他の回答に基づいて、以下のように使用C-x C-wしてC-x C-yもコピーをとMacとLinux(誰かがWindowsのバージョンを知っていれば、それを追加して自由に感じる)の両方の上に貼り付けます。Linuxでは、パッケージマネージャとともにxselおよびxclipをインストールする必要があることに注意してください。

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

1
実際には、を使用xclipして、クリップボードの内容を貼り付けることもできますxclip -o。これはxclip、コピーと貼り付けの両方を実行する別のプログラムを既にインストールしていて、インストールしたくない人にとって便利です。
アミンNAIRI

0

うーん、使用しているプラ​​ットフォームとEmacsのバージョンは何ですか?Windows Vista上のGNU Emacs 22.1.1では、私には問題なく動作します。

万が一、RealVNCビューアを使用してこれをWindowsからLinuxに行っている場合は、最初にLinuxボックスで「vncconfig -iconic」を実行していることを確認してください。


0

私は常にクイックペーストを使用します。emacsで選択範囲をドラッグし、ターゲットウィンドウでマウスの中央ボタンを押します。

(ケイトへの参照から、私はあなたがLinuxまたは同様のものであり、おそらく何らかの方法でXでemacsを使用していると思います)


0

使用しているプラ​​ットフォームを指定したい場合があります。Linux、unix、macosx、windows、ms-dosにありますか?

私は窓のためにそれが働くべきであると信じています。MacOSXの場合、x-windowsクリップボードに追加されます。これは、macosxクリップボードとは異なります。Linuxの場合、ウィンドウマネージャーの種類によって異なりますが、x-windowsはほとんどのウィンドウマネージャーで適切に処理できると思います。

そのため、具体的にご記入ください。


-1

私がしていることは、コピー機能が組み込まれている優れた端末ツール(WindowsのPuTTY、KonsoleまたはLinuxの端末)を使用することです。

PuTTYでは、必要なテキストをマウスで強調表示してから、別の場所に貼り付けます。PuTTYウィンドウを右クリックすると、Windowsのコピー/貼り付けバッファーの内容が貼り付けられます。

LinuxのKonsoleまたはターミナルで、必要なものを強調表示してから、Shift + Ctrl + Cを押してコピーし、Shift + Ctrl + Vを押して貼り付けます。

emacsのwin32コンパイルでは、テキストをヤンクすると、ほとんどの場合、コピー/貼り付けバッファーに配置されます。

Mac OS Xでは、ターミナルがトラップするため、Appleキーのショートカットが正常に機能します。

シェルは各アプリケーションのコピー/貼り付けバッファーを維持しないため、コマンドラインで直接実行する方法はありません。bash それ自体のコピー/貼り付けバッファーを維持します。デフォルトでは、emacs ^ k / ^ yショートカットが機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.