Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: PATCH: keyboardhack to replace sunkeyboardhack
- X-seq: zsh-workers 27595
- From: Joakim Rosqvist <joakim.rosqvist@xxxxxxxxx>
- To: Peter Stephenson <pws@xxxxxxx>, zsh-workers@xxxxxxx
- Subject: Re: PATCH: keyboardhack to replace sunkeyboardhack
- Date: Tue, 12 Jan 2010 14:35:30 +0100
- 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=
- In-reply-to: <20100112100715.657e4a20@news01>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <2d3b879b1001111337q4078c68ep55fb1e788bd865d6@xxxxxxxxxxxxxx> <20100112100715.657e4a20@news01>
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 <pws@xxxxxxx> wrote:
> On Mon, 11 Jan 2010 22:37:27 +0100
> Joakim Rosqvist <joakim.rosqvist@xxxxxxxxx> 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 <pws@xxxxxxx> 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
>
Messages sorted by:
Reverse Date,
Date,
Thread,
Author