前提・実現したいこと
私のコンピュータ操作は 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) )
試したこと
- ~/__tmp ファイルには、予定どおり最後にコピーした文字列が入っています。
- (shell-command "xsel --clipboard < ~/__tmp") 単独を scratch で eval-defun すれば min-buffer に 0 が返ります。でも x-window 側のクリップ・ボードにはコピーした文字列は入っていません。
- "xsel --clipboard < ~/__tmp" を terminal で実行してやれば、コピーした文字列が clipboard に入ります。
- gui spacemacs で last-copy-to-clipboard() を実行すると spacemacs が xsel のところで hung-up します。(gui spacemacs で この関数を使う予定はありません。試してみただけです。)
補足情報
下の環境で試しています。
- OS ubuntuMate 16.04 LTS
- emacs --v GNU Emacs 24.5.1
- spacemacs version 0.200.13@24.5.1
私自身の elisp についての理解は低レベルです。 last-copy-to-clipboard() 関数ぐらいのものを、やっと 3つコーディングしたレベルです。人様の elisp code を copy and paste して少しづつ改変しながら試行錯誤中です。
- last-copy-to-clipbard() 関数が上手く動かない理由と対策についての情報
- このような process 間にまたがる elisp 関数のデバッグの仕方についての情報
について、ご意見をいただけますでしょうか
追加で試したこと add at time:15:38
下のように変更してみましたが、同じ結果でした。
elisp
1 (shell-command "xsel --clipboard < ~/__tmp") 2↓ 3 (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 )
何か拙い箇所があったら指摘してやってください。
あなたの回答
tips
プレビュー