質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.52%

  • Emacs

    123questions

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

  • Spacemacs

    3questions

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 170

 前提・実現したいこと

私のコンピュータ操作は 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

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

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

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

    (defun last-copy-to-clipboard ()
      "set last copy to x-clipboard."
      (interactive)
      (let (bufferAt (buffer-name))

          (switch-to-buffer "__tmp")
          (insert (car kill-ring-yank-pointer))
          (write-file "~/__tmp")
          (sit-for 0.1)
          (shell-command           "xsel -ib < ~/__tmp")
          (spacemacs/kill-this-buffer)
          (switch-to-buffer bufferAt)
      )
    )
~~~

xsel コマンドのの option が --clipboard だけでは足りないらしく標準入力も指定しなければならないのが誤動作の原因のようです。 terminal ではデフォルトで標準入力になっているようです。

ただし、このコードだと buffer が別のところに変わってしまいます。下の (switch-to-buffer ...) で元の buffer に戻しているつもりですが、予想外のバッファになってしまいます。

 elsep
(let (bufferAt (buffer-name))
snipped
(switch-to-buffer bufferAt)

```

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Emacs

    123questions

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

  • Spacemacs

    3questions