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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs