zsh-workers
 help / color / mirror / code / Atom feed
  • * Re: bracketed paste mode in xterm and urxvt
           [not found]     ` <mk9dc0$p0$1@ger.gmane.org>
           [not found]       ` <CABZhJg_5p8BLbq82s_wVtsPdD5hVtk-cPg6fNxzbSs4Vg00SOw@mail.gmail.com>
    @ 2015-06-03 15:31       ` Oliver Kiddle
      2015-06-03 20:42         ` Stephane Chazelas
      2015-06-05 10:49         ` Yuri D'Elia
      1 sibling, 2 replies; 18+ messages in thread
    From: Oliver Kiddle @ 2015-06-03 15:31 UTC (permalink / raw)
      To: zsh-workers
    
    [ 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;
    
    
    ^ permalink raw reply	[flat|nested] 18+ messages in thread

  • end of thread, other threads:[~2015-06-17 15:04 UTC | newest]
    
    Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
    -- links below jump to the message on this page --
         [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             ` bracketed paste mode in xterm and urxvt Stephane Chazelas
    2015-06-03 15:31       ` Oliver Kiddle
    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
    

    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).