2009-05-11 9 views
16

これは私が数回遭遇したシナリオです:Windows上のEmacsでクリップボードの内容を保持する方法は?

他のプログラムのテキストをコピーします。 Emacsに行って、テキストをペースト/ヤンクする前にいくつかの編集をしました。私はペーストすることを意図したテキストではありません...そして、私が物事を動かしている間、私はkill-その行と殺された行と言葉がキルリングを占領していた。しかし、M-yを入力しても元のコピーされたテキストが戻されるわけではないので、元のプログラムに戻ってテキストを再度コピーする必要があります。そして、最悪の場合でも、元のプログラムが閉じられていると、コピーしたテキストを完全に失ってしまいました。

キルラインなどは、基本的なコマンドです(削除キーを押すなど)。そのコマンドを使用してキラーリングが少し乱雑になっても構いませんが、元のテキストはkillリングのどこかにとどまるので、私は結局Myを数回入力することで見つけることができます。クリップボードの内容をオーバーライドする前に、現在のクリップボードの内容をkill-ringに自動的に保存するにはどうすればよいですか?

答えて

12

このコードは、Emacsでkillを実行するときにいつでも、(Emacsの外から)選択をkill-ringに自動的に置くべきです。これはLinux上でテストされていますが、Linuxに限定されるべきではありません。

(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate) 
    "Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring" 
    (let ((have-paste (and interprogram-paste-function 
         (funcall interprogram-paste-function)))) 
    (when have-paste (push have-paste kill-ring)))) 

あなた自身がこのロットをやって見つけた場合、(繰り返しM-yを入力するとは対照的に)あなたのkillリングの素晴らしい眺めを与える、パッケージbrowse-kill-ringを見てみることが有用であり得ます。まさにこのCFを行い

+0

シンプル、簡単、完璧。私は今日これを使いました。ブラウザからいくつかのテキストをコピーしてから、新しいファイルに貼り付けるためにemacsに入りました。気づかないうちに、新しいファイルを開くときに、ファイルパス名にいくつかのkillコマンドを使用しました。このスクリプトがなければ、クリップボードの内容はなくなります。しかし今回は期待どおりに動きました! – Cheeso

2

私は問題は、あなたがemacsの外でクリップボードからヤンクすると、あなたはキルリングに保存されていないことだと思います。

必要なのは、関数clipboard-yankを使用して領域を挿入し、それを何とか選択してkill-ring-saveのようにkillリングに保存することです。

さらに、clipboadをキルリングに保存してからそれをヤンクする関数clipboard-save-to-kill-ring-and-yankを作成することをお勧めします。

編集:コードを少し追跡すると、これはあなたが望むことを行います。それを鍵に接続することができます。 Windowsのクリップボードの内容をキルリングに保存します。

(defun clipboard-to-kill-ring() 
    "save the external clipboard contents to the kill ring" 
    (interactive) 
    (let ((clip (funcall interprogram-paste-function))) 
     (when clip 
     (kill-new clip))) 

(defadvice yank (before maybe-copy-windows-clipboard (arg)) 
    (clipboard-to-kill-ring)) 

(ad-activate 'yank) 
+0

これはいいですが、私は何か自動化が必要です。)私が何かを殺すたびに、クリップボード上の何かがkill-ringに保存されているかどうかを確認します。 – polyglot

+0

私の編集がうまくいくと思います。 before adviceは、yankコマンドがWindowsクリップボードをkillリングに自動的に保存するようにします。 – justinhj

+0

私はあなたのコードは、シナリオで動作するように失敗したと思う:非emacsのウィンドウで 選択したテキスト(「XYZ」と言う) 今のEmacsにテキストを殺す(「ABC」と言う) サイ マイ マイ ..最初のヤンクがキルリングにそれを加える前に、選択が最初のキルで失われていると、XYZは見つからない。 –

0

私はあなたが様々なキルをクリップボードにテキストを入れないようにコマンドをハックことができると思いますし、別のキーにバインドされ、その後しているクリップボード-ヤンク、それがうまくいく場合は知らないと思います。

0

私はemacsにコピーをしたり別のウィンドウズアプリケーションでカットした後にテキストをヤンクしてから再消去することでこれを回避します。

あなたが何かを殺すと、既存のクリップボードをキルリングの一番上のエントリと比較し、違う場合、クリップボードの内容をキルリングにプッシュするようにemacsをハックする方が良いでしょう。明示的に要求したものを殺す。

+0

私の解決策でキルリングの内容を確認する必要はありません。なぜなら、クリップボードをつかむとクリアされるので、それ以降のコールはゼロになり、キルリング。 – justinhj

3

変数を持っている最新のEmacsのCVS版注セーブ・プログラム間ペーストの前に - 殺す:etc/NEWSファイルから:

**場合は後者の前save-interprogram-paste-before-kill' is non-nil, emacs will not clobber the the interprogram paste when something is killed in it by saving the former in theキルリング」 。

+0

ああ甘い! (15文字) – polyglot

関連する問題