zsh-workers
 help / color / mirror / code / Atom feed
* Re: PATCH: pws-25: _read_comp, again
@ 1999-07-08 12:43 Sven Wischnowsky
  0 siblings, 0 replies; 4+ messages in thread
From: Sven Wischnowsky @ 1999-07-08 12:43 UTC (permalink / raw)
  To: zsh-workers


Or was there another reason I've missed?

Bye
 Sven

diff -u oc/Commands/_read_comp Completion/Commands/_read_comp
--- oc/Commands/_read_comp	Thu Jul  8 14:42:16 1999
+++ Completion/Commands/_read_comp	Thu Jul  8 14:42:03 1999
@@ -26,8 +26,6 @@
 setopt extendedglob nobadpattern # xtrace promptsubst
 # local PS4='%N:%i:$((#key))> '
 
-trap 'zle -cR ""; return 1' INT
-
 # Took me ages to work this out.  If we're not on the first global
 # matcher specification, we mustn't do any I/O.
 if [[ compstate[matcher] -gt 1 && -z $_read_comp ]]; then

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


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

* Re: PATCH: pws-25: _read_comp, again
  1999-07-08 11:48 Sven Wischnowsky
@ 1999-07-08 11:59 ` Peter Stephenson
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Stephenson @ 1999-07-08 11:59 UTC (permalink / raw)
  To: zsh-workers

Sven Wischnowsky wrote:
> For me it correctly returns `1' as the return status. The problem is
> that the signal handler for SIGINT sets `breaks=loops' and since the
> second read is in a loop the then-clause will never be executed
> (because of the test of the while-loop in `execlist()').

You're right, I realised eventually it was doing something fishier, but I
didn't get as far as finding out what.

> Hm. What are we to do here -- should we reset some of the things
> changed by the signal handler in bin_read()? Do we always want that?

I don't think an ordinary read is affected, since that would leave errflag
as 1 and hence abort the whole function, which is correct in that case ---
though I think we can take it as a feature that reading a key via zle
doesn't abort the function on a keyboard interrupt.  The problem is the way
it does it: zleread() sets errflag only back to zero.  Presumably it
should also restore breaks as well when it does that.  Is it that simple?
The second chunk is for vared, which does the same thing --- chances are
any interrupt occurred in the read, so that restoring breaks is already
covered, but this is safer.

--- Src/Zle/zle_main.c.bks	Wed Jul  7 09:32:05 1999
+++ Src/Zle/zle_main.c	Thu Jul  8 13:44:22 1999
@@ -307,7 +307,7 @@
     unsigned int ret;
     long exp100ths;
     int die = 0, r, icnt = 0;
-    int old_errno = errno;
+    int old_errno = errno, obreaks = breaks;
 
 #ifdef HAVE_SELECT
     fd_set foofd;
@@ -397,6 +397,7 @@
 		if (!errflag && !retflag && !breaks)
 		    continue;
 		errflag = 0;
+		breaks = obreaks;
 		errno = old_errno;
 		return EOF;
 	    } else if (errno == EWOULDBLOCK) {
@@ -717,7 +718,7 @@
     Value v;
     Param pm = 0;
     int create = 0;
-    int type = PM_SCALAR;
+    int type = PM_SCALAR, obreaks = breaks;
     char *p1 = NULL, *p2 = NULL;
 
     if (zleactive) {
@@ -809,6 +810,7 @@
     if (!t || errflag) {
 	/* error in editing */
 	errflag = 0;
+	breaks = obreaks;
 	return 1;
     }
     /* strip off trailing newline, if any */

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


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

* Re: PATCH: pws-25: _read_comp, again
@ 1999-07-08 11:48 Sven Wischnowsky
  1999-07-08 11:59 ` Peter Stephenson
  0 siblings, 1 reply; 4+ messages in thread
From: Sven Wischnowsky @ 1999-07-08 11:48 UTC (permalink / raw)
  To: zsh-workers


Peter Stephenson wrote:

> and I had to trap SIGINT to return from the function because for
> some reason `read -k' wasn't returning the right status, just a 0 (which
> you can't tell from C-SPC):  strange, since it seems to work perfectly well
> in ordinary widgets.  I've left the commented-out debugging code in
> deliberately.  Sigh.

For me it correctly returns `1' as the return status. The problem is
that the signal handler for SIGINT sets `breaks=loops' and since the
second read is in a loop the then-clause will never be executed
(because of the test of the while-loop in `execlist()').

Hm. What are we to do here -- should we reset some of the things
changed by the signal handler in bin_read()? Do we always want that?

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


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

* PATCH: pws-25: _read_comp, again
@ 1999-07-07 10:03 Peter Stephenson
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Stephenson @ 1999-07-07 10:03 UTC (permalink / raw)
  To: Zsh hackers list

This modifies _read_comp to use Sven's zle -R rewrite to provide a
completion listing for the completion functions that can be completed to
run to get a completion.  (Alles klar?)  With autolist set and
alwayslastprompt set, it will list the possible functions after the first
character is typed.

There were some small problems: beeping added a newline, it was still
possible to get a completion on global matchers after the first if you
aborted, and I had to trap SIGINT to return from the function because for
some reason `read -k' wasn't returning the right status, just a 0 (which
you can't tell from C-SPC):  strange, since it seems to work perfectly well
in ordinary widgets.  I've left the commented-out debugging code in
deliberately.  Sigh.

--- Completion/Commands/_read_comp.c6	Mon Jul  5 16:21:32 1999
+++ Completion/Commands/_read_comp	Wed Jul  7 11:50:26 1999
@@ -23,7 +23,10 @@
 #  _read_comp         Last completion string read from user
 
 emulate -L zsh
-setopt extendedglob nobadpattern
+setopt extendedglob nobadpattern # xtrace promptsubst
+# local PS4='%N:%i:$((#key))> '
+
+trap 'zle -cR ""; return 1' INT
 
 # Took me ages to work this out.  If we're not on the first global
 # matcher specification, we mustn't do any I/O.
@@ -41,7 +44,9 @@
   return
 fi
 
-local key search str str2 newch funcs funcs2 exact msg
+_read_comp=
+
+local key search str str2 newch funcs funcs2 exact msg list
 integer pos
 
 msg="Completion: "
@@ -49,37 +54,48 @@
 zle -R $msg
 
 if ! read -k key; then
-  zle -R ''
+  zle -cR ''
   return 1
 fi
 
 while [[ '#key' -ne 10 && '#key' -ne 13 ]]; do
-  if [[ '#key' -eq 3 || '#key' -eq 7 ]]; then
-    zle -R ''
+  if [[ '#key' -eq 0 && '#key' -eq 3 || '#key' -eq 7 ]]; then
+    zle -cR ''
     return 1
   fi
   if [[ ( '#key' -eq 8 || '#key' -eq 127 ) && -n $str ]]; then
     # delete character
     str="$str[1,-2]"
     exact=
+    list=()
   elif [[ '#key' -eq 21 ]]; then
     # ^U: delete line
     str=
     exact=
+    list=()
+  elif [[ '#key' -eq 4 && $str = _[^\ ]# && $str != *' '* ]]; then
+    # ^D: list completions
+    list=(${$(whence -m "$str*" 2>/dev/null)%: function})
   elif [[ ( -n $exact && $key != ' ' ) || '#key & 127' -lt 32 ]]; then
     # If we've got an exact function, only allow a space after it.
     # Don't try to insert non-printing characters.
     if [[ -n $ZBEEP ]]; then
       print -nb $ZBEEP
     elif [[ -o beep ]]; then
-      print "\a"
+      print -n "\a"
     fi
+    list=()
   else
     str="$str$key"
     if [[ $str = _[^\ ]# ]]; then
       # Rudimentary completion for function names.
       # Allow arguments, i.e. don't do this after we've got a space.
       funcs=(${$(whence -m "$str*" 2>/dev/null)%: function})
+      if [[ -o autolist && $#str -gt 1 ]]; then
+	list=($funcs)
+      else
+	list=()
+      fi
       if (( $#funcs == 1 )); then
 	# Exact match; prompt the user for a newline to confirm
 	str=$funcs[1]
@@ -89,9 +105,10 @@
 	if [[ -n $ZBEEP ]]; then
 	  print -nb $ZBEEP
 	elif [[ -o beep ]]; then
-	  print "\a"
+	  print -n "\a"
 	fi
 	str="$str[1,-2]"
+	list=()
       else
 	# Add characters to the string until a name doesn't
 	# match any more, then backtrack one character to get
@@ -112,9 +129,13 @@
       exact=
     fi
   fi
-  zle -R "$msg$str$exact"
+  if (( $#list )); then
+    zle -R "$msg$str$exact" $list
+  else
+    zle -cR "$msg$str$exact"
+  fi
   if ! read -k key; then
-    zle -R ''
+    zle -cR ''
     return 1
   fi
 done
@@ -130,7 +151,7 @@
   _read_comp=$str
 fi
 
-zle -R ''
+zle -cR ''
 
 if [[ $str = _* ]]; then
   eval $str

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


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

end of thread, other threads:[~1999-07-08 12:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-07-08 12:43 PATCH: pws-25: _read_comp, again Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
1999-07-08 11:48 Sven Wischnowsky
1999-07-08 11:59 ` Peter Stephenson
1999-07-07 10:03 Peter Stephenson

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