🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Spacemacs

Spacemacsは、テキストエディタであり、オープンソースコミュニティによるEmacsのディストリビューションです。

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

0回答

1569閲覧

linux terminal spacemacs で、最後にコピーした文字列を gui vim, browser などに paste したい。

lobosKobayashi

総合スコア6

Spacemacs

Spacemacsは、テキストエディタであり、オープンソースコミュニティによるEmacsのディストリビューションです。

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2018/07/06 04:32

編集2018/07/09 16:13

前提・実現したいこと

私のコンピュータ操作は keyboard home position によるものがメインです。マウスやカーソルキーなどによる操作は できるだけ避けます。

一番多く使っているのは vim で次に使うのが spacemacs です。 Firefox + vimperator が使えなくなったので、 spacemacs の eww と vivaldi+vimium+visual-mode を組み合わせて使っています。

ただし gui spacemacs の eww は、キーボードで素早く操作するとクリティカル・タイミングで hung uyp してくれます。 一日に 10回以上です。 でも terminal での spacemacs の eww ならば hung up はしないようです。 でも linux では terminal でコピーした文字列を gui vim や browser に paste するには xsel を利用した細工が必要です。

ここ にある、下の copy-to-clipboard() 関数を使えば、 terminal spacemacs → copy → xsel → gui vim/browser での paste が可能です。

(defun copy-to-clipboard () "Copies selection to x-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 --clipboard --input") (message "Yanked region to clipboard!") (deactivate-mark)) (message "No region active; can't yank to clipboard!"))) )

でも上の elisp 関数は囲まれたリージョンを copy paste するだけです。一方で terminal spacemacs での google 検索したアドレスは明示的に表示されていません。リージョンで囲むためには、yiw のキーボード操作で URL をコピーし scrach などに paste してから囲んでやってからしか copy-to-clipboard() 関数で copy and paste できません。でも こんな操作を一日に何十回も行うのは苦痛です。

該当のソースコード

そこで terminal spaecemacs の eww でリンクされているだけで表示されていない yiw でコピーした URL 文字列を xsel 経由で手早く copy and paste するために下のような last-copy-to-clipboard() 関数を作りました。 でも gui vim/browser に copy and paste できません。

(defun last-copy-to-clipboard () "set last copy to x-clipboard." (interactive) (switch-to-buffer "__tmp") (insert (car kill-ring-yank-pointer)) (write-file "~/__tmp") (sit-for 0.1) (shell-command "xsel --clipboard < ~/__tmp") (spacemacs/kill-this-buffer) )

試したこと

  1. ~/__tmp ファイルには、予定どおり最後にコピーした文字列が入っています。
  2. (shell-command "xsel --clipboard < ~/__tmp") 単独を scratch で eval-defun すれば min-buffer に 0 が返ります。でも x-window 側のクリップ・ボードにはコピーした文字列は入っていません。
  3. "xsel --clipboard < ~/__tmp" を terminal で実行してやれば、コピーした文字列が clipboard に入ります。
  4. gui spacemacs で last-copy-to-clipboard() を実行すると spacemacs が xsel のところで hung-up します。(gui spacemacs で この関数を使う予定はありません。試してみただけです。)

補足情報

下の環境で試しています。

  1. OS ubuntuMate 16.04 LTS
  2. emacs --v GNU Emacs 24.5.1
  3. spacemacs version 0.200.13@24.5.1

私自身の elisp についての理解は低レベルです。 last-copy-to-clipboard() 関数ぐらいのものを、やっと 3つコーディングしたレベルです。人様の elisp code を copy and paste して少しづつ改変しながら試行錯誤中です。

  1. last-copy-to-clipbard() 関数が上手く動かない理由と対策についての情報
  2. このような process 間にまたがる elisp 関数のデバッグの仕方についての情報

について、ご意見をいただけますでしょうか

追加で試したこと add at time:15:38

下のように変更してみましたが、同じ結果でした。

elisp

1 (shell-command "xsel --clipboard < ~/__tmp") 23 (shell-command-to-string "xsel --clipboard < ~/__tmp")

下のコードで、とりあえず last copy を clipboard にコピーできるようにできました。 add date:2018/07/10 (火) time:00:58

elsep

1 (defun last-copy-to-clipboard () 2 "set last copy to x-clipboard." 3 (interactive) 4 (let (bufferAt (buffer-name)) 5 6 (switch-to-buffer "__tmp") 7 (insert (car kill-ring-yank-pointer)) 8 (write-file "~/__tmp") 9 (sit-for 0.1) 10 (shell-command "xsel -ib < ~/__tmp") 11 (spacemacs/kill-this-buffer) 12 (switch-to-buffer bufferAt) 13 ) 14 ) 15~~~ 16 17xsel コマンドのの option が --clipboard だけでは足りないらしく標準入力も指定しなければならないのが誤動作の原因のようです。 terminal ではデフォルトで標準入力になっているようです。 18 19ただし、このコードだと buffer が別のところに変わってしまいます。下の (switch-to-buffer ...) で元の buffer に戻しているつもりですが、予想外のバッファになってしまいます。 20``` elsep 21 (let (bufferAt (buffer-name)) 22 snipped 23 (switch-to-buffer bufferAt) 24 )

何か拙い箇所があったら指摘してやってください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問