Revision: 2712 http://tmux.svn.sourceforge.net/tmux/?rev=2712&view=rev Author: tcunha Date: 2012-03-07 13:36:19 +0000 (Wed, 07 Mar 2012) Log Message: ----------- Sync OpenBSD patchset 1037:
Support "bracketed paste" mode. This adds a -p flag to paste-buffer - if this is used and the application has requested bracketed pastes, then tmux surrounds the pasted text by \033[200~ and \033[201~. Applications like vim can (apparently) use this to avoid, for example, indenting the text. From Ailin Nemui. Modified Paths: -------------- trunk/cmd-paste-buffer.c trunk/input.c trunk/screen-write.c trunk/tmux.1 trunk/tmux.h trunk/tty.c Modified: trunk/cmd-paste-buffer.c =================================================================== --- trunk/cmd-paste-buffer.c 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/cmd-paste-buffer.c 2012-03-07 13:36:19 UTC (rev 2712) @@ -29,13 +29,13 @@ int cmd_paste_buffer_exec(struct cmd *, struct cmd_ctx *); -void cmd_paste_buffer_filter( - struct window_pane *, const char *, size_t, const char *); +void cmd_paste_buffer_filter(struct window_pane *, + const char *, size_t, const char *, int bracket); const struct cmd_entry cmd_paste_buffer_entry = { "paste-buffer", "pasteb", - "db:rs:t:", 0, 0, - "[-dr] [-s separator] [-b buffer-index] [-t target-pane]", + "db:prs:t:", 0, 0, + "[-dpr] [-s separator] [-b buffer-index] [-t target-pane]", 0, NULL, NULL, @@ -52,6 +52,7 @@ const char *sepstr; char *cause; int buffer; + int pflag; if (cmd_find_pane(ctx, args_get(args, 't'), &s, &wp) == NULL) return (-1); @@ -85,7 +86,9 @@ else sepstr = "\r"; } - cmd_paste_buffer_filter(wp, pb->data, pb->size, sepstr); + pflag = args_has(args, 'p') && + (wp->screen->mode & MODE_BRACKETPASTE); + cmd_paste_buffer_filter(wp, pb->data, pb->size, sepstr, pflag); } /* Delete the buffer if -d. */ @@ -101,13 +104,16 @@ /* Add bytes to a buffer and filter '\n' according to separator. */ void -cmd_paste_buffer_filter( - struct window_pane *wp, const char *data, size_t size, const char *sep) +cmd_paste_buffer_filter(struct window_pane *wp, + const char *data, size_t size, const char *sep, int bracket) { const char *end = data + size; const char *lf; size_t seplen; + if (bracket) + bufferevent_write(wp->event, "\033[200~", 6); + seplen = strlen(sep); while ((lf = memchr(data, '\n', end - data)) != NULL) { if (lf != data) @@ -118,4 +124,7 @@ if (end != data) bufferevent_write(wp->event, data, end - data); + + if (bracket) + bufferevent_write(wp->event, "\033[201~", 6); } Modified: trunk/input.c =================================================================== --- trunk/input.c 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/input.c 2012-03-07 13:36:19 UTC (rev 2712) @@ -1212,6 +1212,9 @@ case 1049: window_pane_alternate_off(wp, &ictx->cell); break; + case 2004: + screen_write_bracketpaste(&ictx->ctx, 0); + break; default: log_debug("%s: unknown '%c'", __func__, ictx->ch); break; @@ -1264,6 +1267,9 @@ case 1049: window_pane_alternate_on(wp, &ictx->cell); break; + case 2004: + screen_write_bracketpaste(&ictx->ctx, 1); + break; default: log_debug("%s: unknown '%c'", __func__, ictx->ch); break; Modified: trunk/screen-write.c =================================================================== --- trunk/screen-write.c 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/screen-write.c 2012-03-07 13:36:19 UTC (rev 2712) @@ -878,6 +878,18 @@ s->mode |= mode; } +/* Set bracketed paste mode. */ +void +screen_write_bracketpaste(struct screen_write_ctx *ctx, int state) +{ + struct screen *s = ctx->s; + + if (state) + s->mode |= MODE_BRACKETPASTE; + else + s->mode &= ~MODE_BRACKETPASTE; +} + /* Line feed. */ void screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped) Modified: trunk/tmux.1 =================================================================== --- trunk/tmux.1 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/tmux.1 2012-03-07 13:36:19 UTC (rev 2712) @@ -3088,7 +3088,7 @@ Load the contents of the specified paste buffer from .Ar path . .It Xo Ic paste-buffer -.Op Fl dr +.Op Fl dpr .Op Fl b Ar buffer-index .Op Fl s Ar separator .Op Fl t Ar target-pane @@ -3107,6 +3107,10 @@ The .Fl r flag means to do no replacement (equivalent to a separator of LF). +If +.Fl p +is specified, paste bracket control codes are inserted around the +buffer if the application has requested bracketed paste mode. .It Xo Ic save-buffer .Op Fl a .Op Fl b Ar buffer-index Modified: trunk/tmux.h =================================================================== --- trunk/tmux.h 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/tmux.h 2012-03-07 13:36:19 UTC (rev 2712) @@ -569,6 +569,7 @@ #define MODE_MOUSE_BUTTON 0x40 #define MODE_MOUSE_ANY 0x80 #define MODE_MOUSE_UTF8 0x100 +#define MODE_BRACKETPASTE 0x200 #define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY) @@ -1879,6 +1880,7 @@ const struct grid_cell *, const struct utf8_data *); void screen_write_setselection(struct screen_write_ctx *, u_char *, u_int); void screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int); +void screen_write_bracketpaste(struct screen_write_ctx *, int); /* screen-redraw.c */ void screen_redraw_screen(struct client *, int, int); Modified: trunk/tty.c =================================================================== --- trunk/tty.c 2012-03-07 13:35:03 UTC (rev 2711) +++ trunk/tty.c 2012-03-07 13:36:19 UTC (rev 2712) @@ -480,6 +480,12 @@ else tty_putcode(tty, TTYC_RMKX); } + if (changed & MODE_BRACKETPASTE) { + if (mode & MODE_BRACKETPASTE) + tty_puts(tty, "\033[?2004h"); + else + tty_puts(tty, "\033[?2004l"); + } tty->mode = mode; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ tmux-cvs mailing list tmux-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-cvs