zsh-workers
 help / color / mirror / code / Atom feed
From: Oliver Kiddle <okiddle@yahoo.co.uk>
To: zsh-workers@zsh.org
Subject: Re: bracketed paste mode in xterm and urxvt
Date: Wed, 03 Jun 2015 17:31:31 +0200	[thread overview]
Message-ID: <27004.1433345491@thecus.kiddle.eu> (raw)
In-Reply-To: <mk9dc0$p0$1@ger.gmane.org>

[ moved to -workers ]

Yuri D'Elia wrote:
> On 05/28/2015 10:30 PM, Daniel Hahler wrote:
> > Apart from that I think that this (bracketed paste mode) should be
> > included in Zsh's and get maintained this way.  Then it could also be
> > adjusted for vi-mode.
> 
> I do agree that mainlining this would make a lot of sense, even as a
> setopt. Or at least provide the keymap/functions needed to enable it.

I've been using bracketed paste for a while now and would also agree.
The question is in what form to provide it? Note that I posted an
alternative mechanism in workers/29898. The patch below is a port of
that to C.

This doesn't use a keymap which I don't think is any loss as such?
Quoting is enabled with a numeric argument. I like the idea of using a
Ctrl-X prefix to enable quoting but a small wrapper function can provide
for that.

With the patch as it stands, which is not meant to be final, users must
still manually enable the mode for their terminal with zle-line-init
etc (I actually append the strings to PS1/PS2/POSTEDIT). It'd certainly
possible to add a setopt option to zsh to automatically output the
enable/disable strings for bracketed paste. Testing a few ancient
terminals (xterm and dtterm on Solaris 10), they seem to have no ill
effect. Perhaps it'd be better to apply some sort of heuristics based on
terminfo, however. Any thoughts on this?

What behaviour would you want in vi-mode? What about with the region
active? Replacing the region might make sense but isn't really what
emacs or vim do.

Oliver

diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index b41661a..6a07212 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -28,6 +28,7 @@
 "beginning-of-history", beginningofhistory, 0
 "beginning-of-line", beginningofline, 0
 "beginning-of-line-hist", beginningoflinehist, 0
+"bracketed-paste", bracketedpaste, ZLE_MENUCMP | ZLE_KEEPSUFFIX
 "capitalize-word", capitalizeword, 0
 "clear-screen", clearscreen, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_NOTCOMMAND
 "complete-word", completeword, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_ISCOMP
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index c6fae25..6da31f3 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1400,6 +1400,10 @@ default_bindings(void)
     bindkey(emap, "\30\30", refthingy(t_exchangepointandmark), NULL);
     bindkey(emap, "\30=",   refthingy(t_whatcursorposition), NULL);
 
+    /* bracketed paste applicable to all keymaps */
+    bindkey(emap, "\33[200~", refthingy(t_bracketedpaste), NULL);
+    bindkey(vmap, "\33[200~", refthingy(t_bracketedpaste), NULL);
+
     /* emacs mode: ESC sequences, all taken from the meta binding table */
     buf[0] = '\33';
     buf[2] = 0;
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index 4669ef2..2eec8fa 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -737,6 +737,42 @@ yankpop(UNUSED(char **args))
 
 /**/
 int
+bracketedpaste(UNUSED(char **args))
+{
+    static const char endesc[] = "\e[201~";
+    int endpos = 0;
+    size_t psize = 64;
+    char *buf, *pbuf = zalloc(psize);
+    size_t current = 0;
+    int n, next, timeout;
+    ZLE_STRING_T wpaste;
+
+    while (endesc[endpos]) {
+	if ((next = getbyte(1L, &timeout)) == EOF)
+	    break;
+	if (!endpos || next != endesc[endpos++])
+	    endpos = (next == *endesc);
+	if (current + 1 >= psize)
+	    pbuf = zrealloc(pbuf, psize *= 2);
+	if (imeta(next)) {
+	    pbuf[current++] = Meta;
+	    pbuf[current++] = next ^ 32;
+	} else if (next == '\r')
+	    pbuf[current++] = '\n';
+	else
+	    pbuf[current++] = next;
+    }
+    pbuf[current-sizeof(endesc)+1] = '\0';
+    buf = zmult == 1 ? pbuf : quotestring(pbuf, NULL, QT_BACKSLASH);
+    zmult = 1;
+    wpaste = stringaszleline(buf, 0, &n, NULL, NULL);
+    doinsert(wpaste, n);
+    free(pbuf); free(wpaste);
+    return 0;
+}
+
+/**/
+int
 overwritemode(UNUSED(char **args))
 {
     insmode ^= 1;


  parent reply	other threads:[~2015-06-03 15:37 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <BANLkTikh_-+L2W5=Yfu7h7iAe5CcpP6fxw@mail.gmail.com>
     [not found] ` <CAFOazAOfk=Sq-smkMGzJKO4b7jMb_1_m4vXXn8twoVA2wV55YA@mail.gmail.com>
     [not found]   ` <55677AF5.50709@thequod.de>
     [not found]     ` <mk9dc0$p0$1@ger.gmane.org>
     [not found]       ` <CABZhJg_5p8BLbq82s_wVtsPdD5hVtk-cPg6fNxzbSs4Vg00SOw@mail.gmail.com>
     [not found]         ` <mkmjfu$3h0$1@ger.gmane.org>
     [not found]           ` <CAHYJk3T3dVdN5qDMecPAH_ALLBYNntW0QVdPMh50Lo_ULeWP6w__21110.9288772152$1433333265$gmane$org@mail.gmail.com>
2015-06-03 12:43             ` Stephane Chazelas
2015-06-03 15:31       ` Oliver Kiddle [this message]
2015-06-03 20:42         ` Stephane Chazelas
2015-06-03 23:48           ` Oliver Kiddle
2015-06-04  7:15             ` Stephane Chazelas
2015-06-05 10:49         ` Yuri D'Elia
2015-06-05 13:40           ` Oliver Kiddle
2015-06-05 14:35             ` Yuri D'Elia
2015-06-10  0:28               ` Oliver Kiddle
2015-06-10  4:38                 ` Bart Schaefer
2015-06-15 22:11                   ` Oliver Kiddle
2015-06-15 23:09                     ` Mikael Magnusson
2015-06-16  0:20                     ` Bart Schaefer
2015-06-16 17:12                       ` Oliver Kiddle
2015-06-16 20:26                         ` Bart Schaefer
2015-06-17 10:45                           ` Oliver Kiddle
2015-06-17 15:04                             ` Bart Schaefer
2015-06-10  9:44                 ` Yuri D'Elia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=27004.1433345491@thecus.kiddle.eu \
    --to=okiddle@yahoo.co.uk \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).