Skip to content

Commit

Permalink
Sync OpenBSD patchset 1037:
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Tiago Cunha committed Mar 7, 2012
1 parent 9d79a56 commit 3275e9b
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 8 deletions.
23 changes: 16 additions & 7 deletions cmd-paste-buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -52,6 +52,7 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
const char *sepstr;
char *cause;
int buffer;
int pflag;

if (cmd_find_pane(ctx, args_get(args, 't'), &s, &wp) == NULL)
return (-1);
Expand Down Expand Up @@ -85,7 +86,9 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
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. */
Expand All @@ -101,13 +104,16 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)

/* 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)
Expand All @@ -118,4 +124,7 @@ cmd_paste_buffer_filter(

if (end != data)
bufferevent_write(wp->event, data, end - data);

if (bracket)
bufferevent_write(wp->event, "\033[201~", 6);
}
6 changes: 6 additions & 0 deletions input.c
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,9 @@ input_csi_dispatch(struct input_ctx *ictx)
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;
Expand Down Expand Up @@ -1264,6 +1267,9 @@ input_csi_dispatch(struct input_ctx *ictx)
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;
Expand Down
12 changes: 12 additions & 0 deletions screen-write.c
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,18 @@ screen_write_mousemode_on(struct screen_write_ctx *ctx, int mode)
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)
Expand Down
6 changes: 5 additions & 1 deletion tmux.1
Original file line number Diff line number Diff line change
Expand Up @@ -3088,7 +3088,7 @@ List the global buffers.
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
Expand All @@ -3107,6 +3107,10 @@ flag.
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
Expand Down
2 changes: 2 additions & 0 deletions tmux.h
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,7 @@ struct mode_key_table {
#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)

Expand Down Expand Up @@ -1879,6 +1880,7 @@ void screen_write_cell(struct screen_write_ctx *,
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);
Expand Down
6 changes: 6 additions & 0 deletions tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,12 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
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;
}

Expand Down

0 comments on commit 3275e9b

Please sign in to comment.