From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11192 invoked by alias); 12 Jan 2010 13:35:43 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 27595 Received: (qmail 12571 invoked from network); 12 Jan 2010 13:35:39 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VERIFIED,HTML_MESSAGE autolearn=ham version=3.2.5 Received-SPF: pass (ns1.primenet.com.au: SPF record at _spf.google.com designates 209.85.219.220 as permitted sender) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type; bh=ySxDltq9KSfYM7UQpYZJySeJJIHnmsN9d4EeInhh/XA=; b=qAAlT7l+F2HzUdOv//8lFEm+rlPghhZ7Q/lsaH8DLKxAf94gHL6tytR049m/nN3nVW 8iLlpoOnbQj3ox/7tS0da2ZSMUWb6RTXVQHV+gtyST7MLzxaTzk8VcdxGYpfoS4smon7 6yVeXPcNiesYXcYTiJ4GXk39FvP2903FVGoNk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=YklCqZy8Vxy3GM6u8zTZfWuatCU+Gq1Y+ps310TJIjfXXxlhaWkpyKcLXD/mZbeH9R J/53b1KtBBMCVy3St2tfDVHEdRtWKb+O6gyKwgprPmb45bpwhtJL07p2uY3lnkOYZmpq 6ip5fMGBgxjZXETzF+QmuGXd6p6f35VMcHSXo= MIME-Version: 1.0 In-Reply-To: <20100112100715.657e4a20@news01> References: <2d3b879b1001111337q4078c68ep55fb1e788bd865d6@mail.gmail.com> <20100112100715.657e4a20@news01> Date: Tue, 12 Jan 2010 14:35:30 +0100 Message-ID: <2d3b879b1001120535n72dbb118ve779b4174c2a9e80@mail.gmail.com> Subject: Re: PATCH: keyboardhack to replace sunkeyboardhack From: Joakim Rosqvist To: Peter Stephenson , zsh-workers@zsh.org Content-Type: multipart/alternative; boundary=00148530ac654563db047cf7ba7c --00148530ac654563db047cf7ba7c Content-Type: text/plain; charset=ISO-8859-1 I never intended to remove the existing option, that's why my patch sets the char-to-be-removed to backquote when the sunkeyboardhack option is set. /Joakim Rosqvist On Tue, Jan 12, 2010 at 11:07, Peter Stephenson wrote: > On Mon, 11 Jan 2010 22:37:27 +0100 > Joakim Rosqvist wrote: > > On my keyboard, singlequote is too close to return and so often gets > pressed > > by mistake. > > So I've extended the sunkeyboardhack option (which removes an extraneous > > backquote > > at the end of the command line). Now, one can put e.g. > > > > KEYBOARD_HACK=\' > > > > in .zshrc to have singlequote (or any other ascii character) removed from > > the end of the > > commandline before it is parsed. > > Thanks. The pointer arithmetic for removing the character was wrong (try > it with a non-quote character), and in practice we're not going to remove > the existing option, so I've made a couple of local changes. > > Index: FEATURES > =================================================================== > RCS file: /cvsroot/zsh/zsh/FEATURES,v > retrieving revision 1.3 > diff -u -r1.3 FEATURES > --- FEATURES 10 Nov 2009 22:16:37 -0000 1.3 > +++ FEATURES 12 Jan 2010 10:03:10 -0000 > @@ -66,6 +66,7 @@ > input line to be brought up for editing instead of being executed > with sunkeyboardhack option, accidentally typed trailing ` characters > are removed from the input line (for those of you with Sun keyboards :-) > ) > +with KEYBOARD_HACK, any accidentally typed trailing ascii character can be > junked > "cd old new" replaces "old" with "new" in directory string > generalized argument completion, new system based on shell functions: > - highly context sensitive > Index: Doc/Zsh/options.yo > =================================================================== > RCS file: /cvsroot/zsh/zsh/Doc/Zsh/options.yo,v > retrieving revision 1.87 > diff -u -r1.87 options.yo > --- Doc/Zsh/options.yo 2 Dec 2009 09:56:42 -0000 1.87 > +++ Doc/Zsh/options.yo 12 Jan 2010 10:03:11 -0000 > @@ -1209,6 +1209,8 @@ > of backquotes on the line, ignore the trailing backquote. > This is useful on some keyboards where the return key is > too small, and the backquote key lies annoyingly close to it. > +As an alternative the variable tt(KEYBOARD_HACK) lets you choose the > +character to be removed. > ) > enditem() > > Index: Doc/Zsh/params.yo > =================================================================== > RCS file: /cvsroot/zsh/zsh/Doc/Zsh/params.yo,v > retrieving revision 1.56 > diff -u -r1.56 params.yo > --- Doc/Zsh/params.yo 20 May 2009 09:04:39 -0000 1.56 > +++ Doc/Zsh/params.yo 12 Jan 2010 10:03:11 -0000 > @@ -897,6 +897,16 @@ > If the parameter is unset, the default is used. Note this has > a different effect from setting the parameter to an empty string. > ) > +vindex(KEYBOARD_HACK) > +item(tt(KEYBOARD_HACK))( > +This variable defines a character to be removed from the end of the > +command line before interpreting it (interactive shells only). It is > +intended to fix the problem with keys placed annoyingly close to return > +and replaces the tt(SUNKEYBOARDHACK) option which did this for > +backquotes only. Should the chosen character be one of singlequote, > +doublequote or backquote, there must also be an odd number of them > +on the command line for the last one to be removed. > +) > vindex(KEYTIMEOUT) > item(tt(KEYTIMEOUT))( > The time the shell waits, in hundredths of seconds, for another key to > Index: Src/input.c > =================================================================== > RCS file: /cvsroot/zsh/zsh/Src/input.c,v > retrieving revision 1.18 > diff -u -r1.18 input.c > --- Src/input.c 16 Dec 2009 18:39:07 -0000 1.18 > +++ Src/input.c 12 Jan 2010 10:03:11 -0000 > @@ -291,20 +291,32 @@ > zputs(ingetcline, stderr); > fflush(stderr); > } > - if (*ingetcline && ingetcline[strlen(ingetcline) - 1] == '\n' && > - interact && isset(SUNKEYBOARDHACK) && isset(SHINSTDIN) && > - SHTTY != -1 && *ingetcline && ingetcline[1] && > - ingetcline[strlen(ingetcline) - 2] == '`') { > - /* Junk an unmatched "`" at the end of the line. */ > - int ct; > - char *ptr; > - > - for (ct = 0, ptr = ingetcline; *ptr; ptr++) > - if (*ptr == '`') > - ct++; > - if (ct & 1) { > - ptr[-2] = '\n'; > - ptr[-1] = '\0'; > + if (keyboardhackchar && *ingetcline && > + ingetcline[strlen(ingetcline) - 1] == '\n' && > + interact && isset(SHINSTDIN) && > + SHTTY != -1 && ingetcline[1]) > + { > + char *stripptr = ingetcline + strlen(ingetcline) - 2; > + if (*stripptr == keyboardhackchar) { > + /* Junk an unwanted character at the end of the line. > + (key too close to return key) */ > + int ct = 1; /* force odd */ > + char *ptr; > + > + if (keyboardhackchar == '\'' || keyboardhackchar == '"' || > + keyboardhackchar == '`') { > + /* > + * for the chars above, also require an odd count before > + * junking > + */ > + for (ct = 0, ptr = ingetcline; *ptr; ptr++) > + if (*ptr == keyboardhackchar) > + ct++; > + } > + if (ct & 1) { > + stripptr[0] = '\n'; > + stripptr[1] = '\0'; > + } > } > } > isfirstch = 1; > Index: Src/options.c > =================================================================== > RCS file: /cvsroot/zsh/zsh/Src/options.c,v > retrieving revision 1.51 > diff -u -r1.51 options.c > --- Src/options.c 19 Jul 2009 19:08:53 -0000 1.51 > +++ Src/options.c 12 Jan 2010 10:03:11 -0000 > @@ -748,6 +748,9 @@ > } else if ((optno == EMACSMODE || optno == VIMODE) && value) { > zleentry(ZLE_CMD_SET_KEYMAP, optno); > opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0; > + } else if (optno == SUNKEYBOARDHACK) { > + /* for backward compatibility */ > + keyboardhackchar = (value ? '`' : '\0'); > } > opts[optno] = value; > if (optno == BANGHIST || optno == SHINSTDIN) > Index: Src/params.c > =================================================================== > RCS file: /cvsroot/zsh/zsh/Src/params.c,v > retrieving revision 1.157 > diff -u -r1.157 params.c > --- Src/params.c 5 Sep 2009 19:49:20 -0000 1.157 > +++ Src/params.c 12 Jan 2010 10:03:11 -0000 > @@ -108,6 +108,9 @@ > mod_export unsigned char bangchar; > /**/ > unsigned char hatchar, hashchar; > + > +/**/ > +unsigned char keyboardhackchar = '\0'; > > /* $SECONDS = now.tv_sec - shtimer.tv_sec > * + (now.tv_usec - shtimer.tv_usec) / 1000000.0 > @@ -204,6 +207,8 @@ > { ifsgetfn, ifssetfn, stdunsetfn }; > static const struct gsu_scalar underscore_gsu = > { underscoregetfn, nullstrsetfn, stdunsetfn }; > +static const struct gsu_scalar keyboard_hack_gsu = > +{ keyboardhackgetfn, keyboardhacksetfn, stdunsetfn }; > #ifdef USE_LOCALE > static const struct gsu_scalar lc_blah_gsu = > { strgetfn, lcsetfn, stdunsetfn }; > @@ -273,6 +278,7 @@ > IPDEF2("WORDCHARS", wordchars_gsu, 0), > IPDEF2("IFS", ifs_gsu, PM_DONTIMPORT), > IPDEF2("_", underscore_gsu, PM_READONLY), > +IPDEF2("KEYBOARD_HACK", keyboard_hack_gsu, PM_DONTIMPORT), > > #ifdef USE_LOCALE > # define LCIPDEF(name) IPDEF2(name, lc_blah_gsu, PM_UNSET) > @@ -3834,6 +3840,46 @@ > return errno; > } > > +/* Function to get value for special parameter `KEYBOARD_HACK' */ > + > +/**/ > +char * > +keyboardhackgetfn(UNUSED(Param pm)) > +{ > + static char buf[2]; > + > + buf[0] = keyboardhackchar; > + buf[1] = '\0'; > + return buf; > +} > + > + > +/* Function to set value of special parameter `KEYBOARD_HACK' */ > + > +/**/ > +void > +keyboardhacksetfn(UNUSED(Param pm), char *x) > +{ > + if (x) { > + int len, i; > + > + unmetafy(x, &len); > + if (len > 1) { > + len = 1; > + zwarn("Only one KEYBOARD_HACK character can be defined"); /* > could be changed if needed */ > + } > + for (i = 0; i < len; i++) { > + if (!isascii(STOUC(x[i]))) { > + zwarn("KEYBOARD_HACK can only contain ASCII characters"); > + return; > + } > + } > + keyboardhackchar = len ? STOUC(x[0]) : '\0'; > + free(x); > + } else > + keyboardhackchar = '\0'; > +} > + > /* Function to get value for special parameter `histchar' */ > > /**/ > > > -- > Peter Stephenson Software Engineer > Tel: +44 (0)1223 692070 Cambridge Silicon Radio Limited > Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, > UK > > > Member of the CSR plc group of companies. CSR plc registered in England and > Wales, registered number 4187346, registered office Churchill House, > Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom > --00148530ac654563db047cf7ba7c--