zsh-users
 help / color / mirror / code / Atom feed
* Tip of the day: restoring an aborted command-line
@ 2015-07-01 22:12 Oliver Kiddle
  2015-07-02 21:29 ` zzapper
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Oliver Kiddle @ 2015-07-01 22:12 UTC (permalink / raw)
  To: zsh-users

When you abort a command-line with Ctrl-C or whatever, the Zsh line
editor sets $ZLE_LINE_ABORTED to the contents of the command-line before
it was aborted. Sometimes you might want to recover the aborted line
and you could bind a dedicated key to that purpose. The following trick
instead creates an undo event so that you can simply use an undo to get
back the aborted line:

  zle-line-init () {
    if [[ -n $ZLE_LINE_ABORTED ]]; then
      local savebuf="$BUFFER" savecur="$CURSOR"
      BUFFER="$ZLE_LINE_ABORTED" 
      CURSOR="$#BUFFER" 
      zle split-undo
      BUFFER="$savebuf" CURSOR="$savecur" 
    fi
  }
  zle -N zle-line-init

Undo is bound by default to ^_, ^X^U and ^Xu in emacs mode and u in vi
command mode but I find it useful to bind it in vi-insert mode.

Also note the push-input widget if you want to put the current command
line aside but later restore it.

Oliver


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-01 22:12 Tip of the day: restoring an aborted command-line Oliver Kiddle
@ 2015-07-02 21:29 ` zzapper
  2015-07-02 23:11   ` Philippe Troin
  2015-07-03  2:42   ` Bart Schaefer
  2015-07-03 15:49 ` Greg Klanderman
  2015-07-05 16:26 ` lilydjwg
  2 siblings, 2 replies; 9+ messages in thread
From: zzapper @ 2015-07-02 21:29 UTC (permalink / raw)
  To: zsh-users

Oliver Kiddle <okiddle@yahoo.co.uk> wrote in
news:30469.1435788779@thecus.kiddle.eu: 

> When you abort a command-line with Ctrl-C or whatever, the Zsh line
> editor sets $ZLE_LINE_ABORTED to the contents of the command-line
> before it was aborted. Sometimes you might want to recover the aborted
> line and you could bind a dedicated key to that purpose. The following

> 
>   zle-line-init () {
>     if [[ -n $ZLE_LINE_ABORTED ]]; then
>       local savebuf="$BUFFER" savecur="$CURSOR"
>       BUFFER="$ZLE_LINE_ABORTED" 
>       CURSOR="$#BUFFER" 
>       zle split-undo
>       BUFFER="$savebuf" CURSOR="$savecur" 
>     fi
>   }

> Oliver
is $ZLE_LINE_ABORTED dependent on any autoload? as i have it on cygwin
but not on centos (both 5.08) 



-- 
zzapper
https://twitter.com/dailyzshtip

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-02 21:29 ` zzapper
@ 2015-07-02 23:11   ` Philippe Troin
  2015-07-03  2:42   ` Bart Schaefer
  1 sibling, 0 replies; 9+ messages in thread
From: Philippe Troin @ 2015-07-02 23:11 UTC (permalink / raw)
  To: zzapper; +Cc: zsh-users

On Thu, 2015-07-02 at 21:29 +0000, zzapper wrote:
> Oliver Kiddle <okiddle@yahoo.co.uk> wrote in
> news:30469.1435788779@thecus.kiddle.eu: 
> 
> > When you abort a command-line with Ctrl-C or whatever, the Zsh line
> > editor sets $ZLE_LINE_ABORTED to the contents of the command-line
> > before it was aborted. Sometimes you might want to recover the aborted
> > line and you could bind a dedicated key to that purpose. The following
> 
> > 
> >   zle-line-init () {
> >     if [[ -n $ZLE_LINE_ABORTED ]]; then
> >       local savebuf="$BUFFER" savecur="$CURSOR"
> >       BUFFER="$ZLE_LINE_ABORTED" 
> >       CURSOR="$#BUFFER" 
> >       zle split-undo
> >       BUFFER="$savebuf" CURSOR="$savecur" 
> >     fi
> >   }
> 
> > Oliver
> is $ZLE_LINE_ABORTED dependent on any autoload? as i have it on cygwin
> but not on centos (both 5.08) 

It shouldn't.

I'd like to propose the following enhancement:

         zle-line-init () {
            if [[ -n $ZLE_LINE_ABORTED ]]; then
              _last_aborted_line=$ZLE_LINE_ABORTED    
            fi
            if [[ -n $_last_aborted_line ]]    
            then
              local savebuf="$BUFFER" savecur="$CURSOR"
              BUFFER="$_last_aborted_line"     
              CURSOR="$#BUFFER" 
              zle split-undo
              BUFFER="$savebuf" CURSOR="$savecur"
            fi
          }
        zle -N zle-line-init
        zle-line-finish() { 
           unset _last_aborted_line
        }
        zle -N zle-line-finish  

Now this handle the case when you press Ctrl-C multiple times in a row.
Eg:
        zsh% foo=^C
        zsh% ^C
        zsh% ^C
        zsh% <undo>
        zsh% foo=

Phil.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-02 21:29 ` zzapper
  2015-07-02 23:11   ` Philippe Troin
@ 2015-07-03  2:42   ` Bart Schaefer
  2015-07-03  8:56     ` zzapper
  1 sibling, 1 reply; 9+ messages in thread
From: Bart Schaefer @ 2015-07-03  2:42 UTC (permalink / raw)
  To: zsh-users

On Jul 2,  9:29pm, zzapper wrote:
}
} is $ZLE_LINE_ABORTED dependent on any autoload?

It should be set any time reading a keystroke from the keyboard fails
or the send-break widget is invoked.  The former should happen on a
keyboard interrupt.  However, it's not a special parameter, so it's
not present in any other circumstances.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-03  2:42   ` Bart Schaefer
@ 2015-07-03  8:56     ` zzapper
  0 siblings, 0 replies; 9+ messages in thread
From: zzapper @ 2015-07-03  8:56 UTC (permalink / raw)
  To: zsh-users

Bart Schaefer <schaefer@brasslantern.com> wrote in 
news:150702194250.ZM10791@torch.brasslantern.com:

> On Jul 2,  9:29pm, zzapper wrote:
> }
> } is $ZLE_LINE_ABORTED dependent on any autoload?
> 
Works 4 me everyehere now must have been finger trouble.

(but not for zsh 4.3.10 (x86_64-redhat-linux-gnu) which is the Centos max 
yum version)



-- 
zzapper
https://twitter.com/dailyzshtip

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-01 22:12 Tip of the day: restoring an aborted command-line Oliver Kiddle
  2015-07-02 21:29 ` zzapper
@ 2015-07-03 15:49 ` Greg Klanderman
  2015-07-05 16:26 ` lilydjwg
  2 siblings, 0 replies; 9+ messages in thread
From: Greg Klanderman @ 2015-07-03 15:49 UTC (permalink / raw)
  To: zsh-users


Alternately, you can add the aborted command to the kill buffer:

zle-line-init () {
  if [[ -n ${ZLE_LINE_ABORTED-} ]] ; then
    zle copy-region-as-kill "$ZLE_LINE_ABORTED"
    unset ZLE_LINE_ABORTED
  fi
}


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-01 22:12 Tip of the day: restoring an aborted command-line Oliver Kiddle
  2015-07-02 21:29 ` zzapper
  2015-07-03 15:49 ` Greg Klanderman
@ 2015-07-05 16:26 ` lilydjwg
  2015-07-05 18:43   ` Bart Schaefer
  2015-07-05 21:17   ` Mikael Magnusson
  2 siblings, 2 replies; 9+ messages in thread
From: lilydjwg @ 2015-07-05 16:26 UTC (permalink / raw)
  To: zsh-users

This is great, but it conflicts with the safe-paste (I learnt here a few
days ago), which also defines zle-line-init. Is there a way to make both
work without making them know the existence of each other?

-- 
Best regards,
lilydjwg


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-05 16:26 ` lilydjwg
@ 2015-07-05 18:43   ` Bart Schaefer
  2015-07-05 21:17   ` Mikael Magnusson
  1 sibling, 0 replies; 9+ messages in thread
From: Bart Schaefer @ 2015-07-05 18:43 UTC (permalink / raw)
  To: zsh-users

On Jul 6, 12:26am, lilydjwg wrote:
} Subject: Re: Tip of the day: restoring an aborted command-line
}
} This is great, but it conflicts with the safe-paste (I learnt here a few
} days ago), which also defines zle-line-init. Is there a way to make both
} work without making them know the existence of each other?

http://www.zsh.org/cgi-bin/mla/redirect?USERNUMBER=20235

Still a problem in that every user has to define their own widget names
and ordering.  There are now several plugins floating around that each
require special zle-line-init/finish handling.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Tip of the day: restoring an aborted command-line
  2015-07-05 16:26 ` lilydjwg
  2015-07-05 18:43   ` Bart Schaefer
@ 2015-07-05 21:17   ` Mikael Magnusson
  1 sibling, 0 replies; 9+ messages in thread
From: Mikael Magnusson @ 2015-07-05 21:17 UTC (permalink / raw)
  To: lilydjwg; +Cc: Zsh Users

On Sun, Jul 5, 2015 at 6:26 PM, lilydjwg <lilydjwg@gmail.com> wrote:
> This is great, but it conflicts with the safe-paste (I learnt here a few
> days ago), which also defines zle-line-init. Is there a way to make both
> work without making them know the existence of each other?

Theoretically, you have to manually merge the functions (just make one
function that does the things the two separate ones do). In practice,
the next release of zsh has bracketed pasting builtin so you don't
need to do anything for it anymore.

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-07-05 21:17 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-01 22:12 Tip of the day: restoring an aborted command-line Oliver Kiddle
2015-07-02 21:29 ` zzapper
2015-07-02 23:11   ` Philippe Troin
2015-07-03  2:42   ` Bart Schaefer
2015-07-03  8:56     ` zzapper
2015-07-03 15:49 ` Greg Klanderman
2015-07-05 16:26 ` lilydjwg
2015-07-05 18:43   ` Bart Schaefer
2015-07-05 21:17   ` Mikael Magnusson

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