Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: localtraps



On Apr 26,  5:12pm, Vincent Stemen wrote:
}
} One thing I tried was to set a flag indicating that the signal had
} already hit once so that when it re-calls the sig handler it would
} know it was the second time.  That did not work though for the same
} reason.  I cannot reset the flag before exiting the function because
} it always completes the function before processing the next signal and
} re-calling it.  So on the next signal, the flag is always back unset.

This should work with a sufficiently recent version of zsh to have the
"always" construct:

    inner () {
	if ((trips++))
	then
	  {
	    print "Do the multiple-trip thing ..."
	  } always {
	    ((--trips))
	  }
	fi
    }

    outer () {
      {
	setopt localoptions nolocaltraps
	integer -g trips=1
	trap inner INT
	print "Doing something useful now ..."
	sleep 2
      } always {
	unset trips
	trap outer INT
      }
    }
    trap outer INT

With that, even if I press ^C and hold it down, it alternates between
"Doing something useful now ..." and "Do the multiple-trip thing ..."
and ends up with "trips" unset.  Of course, this is on Linux; if you
are right about the NetBSD signal behavior, you'll need something more
subtle.



Messages sorted by: Reverse Date, Date, Thread, Author