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

Reply via email to