読者です 読者をやめる 読者になる 読者になる

Macのscreen + pbcopy

CVS版のscreenはウィンドウを縦分割できる。(4.0.3にパッチ当ててやる方法もあるみたい)
ただ縦分割するとターミナルからバッファの内容を選択して複数行コピー( Cmd + c ) しようとすると隣のウィンドウの内容まで拾って嫌な感じだった。

ので、screenのコピーモードでコピった内容をOSXのコピーバッファに渡す(pbcopyをpopenするだけ)のパッチ書いてみた。

とりあえず動いたけど、細かいところでバグってる。以前のバッファの内容と混ざったりしてたり....
あとCは幼稚園レベルなので日本語の扱い方がよく分からずASCIIオンリーなヘタレ仕様。

# ソースはこっから
$ cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/screen co screen
diff -ur screen/src/mark.c screen_with_pbcopy/src/mark.c
--- screen/src/mark.c	2005-12-17 03:48:09.000000000 +0900
+++ screen_with_pbcopy/src/mark.c	2009-03-04 23:41:10.000000000 +0900
@@ -53,6 +53,8 @@
 static void MarkRedisplayLine __P((int, int, int, int));
 static int  MarkRewrite __P((int, int, int, struct mchar *, int));
 
+void pbcopy(const char *strings);
+
 extern struct layer *flayer;
 extern struct display *display, *displays;
 extern struct win *fore;
@@ -428,6 +430,17 @@
 
 /**********************************************************************/
 
+void pbcopy(const char *strings)
+{
+    FILE *pipe;
+    pipe = popen("/usr/bin/pbcopy", "w");
+    if(pipe == NULL){
+        LMsg(0, "pbcopy failed :%", strerror(errno));
+        return;
+    }
+    fprintf(pipe, strings);
+    pclose(pipe);
+} 
 
 void
 MarkRoutine()
@@ -928,6 +941,8 @@
 		    newcopylen);
 	      else
 		LMsg(0, "Copied %d characters into buffer", md_user->u_plop.len);
+
+              pbcopy(md_user->u_plop.buf);
 	      if (write_buffer)
 		WriteFile(md_user, (char *)0, DUMP_EXCHANGE);
 	      in_mark = 0;
diff -ur screen/src/pty.c screen_with_pbcopy/src/pty.c
--- screen/src/pty.c	2005-12-17 03:48:09.000000000 +0900
+++ screen_with_pbcopy/src/pty.c	2009-03-04 23:36:55.000000000 +0900
@@ -35,7 +35,7 @@
 
 /* for solaris 2.1, Unixware (SVR4.2) and possibly others */
 #ifdef HAVE_SVR4_PTYS
-# include <sys/stropts.h>
+//# include <sys/stropts.h>
 #endif
 
 #if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)