Carbon Emacsを使っている以上はどうしてもシェルとの2刀流で日々の生活を
送くらざるを得ない訳で、そうするとscreenのバッファにコピーした内容をなんとかクリップボード経由でも使えないのかという欲求は自然だと思います。
いやむしろ出来ない事でかなりのストレスを感じます。
ストレス社会の波はこんなところまで波及している訳ですね。
まずザックリとググってみたところココが見つかりました。
なるほど。screenのコピーコマンドに対するキーバインドを少し弄って、バッファコピーと同時にクリップボードへのコピーも一緒にやってしまおうという事のようです。
osx用に、まずは素直にxclipをpbcopyに置き換えようと思い.screenrcに以下を追加しました。
bindkey -m Y eval “stuff Y” “writebuf” “exec !!! pbcopy < /tmp/screen-exchange”
しかしこれが動きませんでした。ターミナルが固まってしまいます。他にも色々試したのですが、どうもリダイレクトやパイプをコマンドとして認識してくれないようです。
いつもならMLに質問投げようかなというところなのですが、
今日は何故かカッとなってしまい、自分でクリップボードコピーを実装する事にしました。
NSPasteboardというクラスを使うと、ほんの25行くらいで意外と簡単に出来ました。
ま、エラー処理とかしてないですけども。
#include "Foundation/NSArray.h" #include "Foundation/NSAutoreleasePool.h" #include "AppKit/NSPasteboard.h" #include "stdio.h" int main(int argc, char** argv) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; BOOL result = TRUE; // オブジェクト作成 NSPasteboard* pasteBoard = [NSPasteboard generalPasteboard]; [pasteBoard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:nil]; // クリップボードにコピーするテキスト取得 NSString* copyText = [ [NSString alloc] initWithContentsOfFile:@"/tmp/screen-exchange" encoding:NSUTF8StringEncoding error:nil ]; // クリップボードにコピー result = [pasteBoard setString:copyText forType:NSStringPboardType]; if (!result) { printf("@ Failed to copy screen buffer to clipboard @n"); } // 後始末 [pool release]; return 0; }
後はこのプログラムにパスを通して以下のようにすれば、ばっちり1ストロークで
screenのバッファをクリップボードにコピーできました。
bindkey -m Y eval “stuff Y” “writebuf” “exec !!! cpsb2cb”
リモートホストにログインしてても問題なく動作しています。嬉しいですね。
最終的には.screenrcには以下のようにY,W,^Mのbindkey設定を追加しました。
僕的には思ったように動作しているように思います。
bindkey -m Y eval “stuff Y” “writebuf” “exec !!! cpsb2cb”
bindkey -m ^M eval “stuff ^M” “writebuf” “exec !!! cpsb2cb”
bindkey -m W eval “stuff W” “writebuf” “exec !!! cpsb2cb”
makefileと一緒に固めてみました。良かったらどぞ。あんまりテストしてないですが。
追記
NSStringのinitWithContentsOfFileでエンコーディングを指定しないと
文字化けしてしまいます。UTF-8として修正しました。
関連する記事
タグ: screen osx

