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)