zsh-workers
 help / color / mirror / code / Atom feed
* KEYBOARD_HACK breaks with escaped quotes
@ 2021-03-07 10:23 Linus Kardell
  2021-03-29 12:30 ` Daniel Shahaf
  0 siblings, 1 reply; 2+ messages in thread
From: Linus Kardell @ 2021-03-07 10:23 UTC (permalink / raw)
  To: zsh-workers


[-- Attachment #1.1.1: Type: text/plain, Size: 759 bytes --]

So, zsh has the KEYBOARD_HACK option as an anti-annoyance feature, which 
removes a trailing quote character in case you accidentally hit it along 
with enter. However, this naively looks at whether there is an odd 
number of quotes at the command line, which causes it to invert when you 
have (and odd number of) escaped quotes, removing the trailing quote 
when it shouldn't and vice versa. For example, if you write 
'test'\''test' or 'test'"'"'test'' with this enabled, zsh will 
inapropriately remove the trailing quotes, whereas if you write echo 
'test'\''test'' it will not remove the trailing quote. Instead, zsh 
needs to more smartly check whether the quoting is unbalanced and if 
removing the trailing quote would make it balanced.


[-- Attachment #1.1.2: OpenPGP_0xE0EDF4F5F115F537.asc --]
[-- Type: application/pgp-keys, Size: 9115 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

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

* Re: KEYBOARD_HACK breaks with escaped quotes
  2021-03-07 10:23 KEYBOARD_HACK breaks with escaped quotes Linus Kardell
@ 2021-03-29 12:30 ` Daniel Shahaf
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Shahaf @ 2021-03-29 12:30 UTC (permalink / raw)
  To: Linus Kardell; +Cc: zsh-workers

Linus Kardell wrote on Sun, Mar 07, 2021 at 11:23:40 +0100:
> So, zsh has the KEYBOARD_HACK option as an anti-annoyance feature, which
> removes a trailing quote character in case you accidentally hit it along
> with enter. However, this naively looks at whether there is an odd number of
> quotes at the command line, which causes it to invert when you have (and odd
> number of) escaped quotes, removing the trailing quote when it shouldn't and
> vice versa. For example, if you write 'test'\''test' or 'test'"'"'test''
> with this enabled, zsh will inapropriately remove the trailing quotes,
> whereas if you write echo 'test'\''test'' it will not remove the trailing
> quote. Instead, zsh needs to more smartly check whether the quoting is
> unbalanced and if removing the trailing quote would make it balanced.

In the general case, determining whether the end of the line is outside
quotes requires knowing the previous lines (because quoted strings can
contain literal newlines).

SUN_KEYBOARD_HACK is implemented in inputline(); it is not part of the
lexer but a black box the lexer uses.  Therefore, I suspect that
function can't easily answer the above question.

Even answering that question for a single line would essentially require
lexing the line — whether using lex.c, using get_comp_string()/addx(),
or using bufferwords().  That's not impossible, but it'll be a lot
easier to unset SUN_KEYBOARD_HACK and reimplement it as a zle widget,
perhaps using ${(z)} and the concept of addx():

accept-line() {
  BUFFER+=' x'
  {
    local buf=$PREBUFFER$BUFFER
    if [[ -o INTERACTIVE_COMMENTS ]]; then
      local -a split=( ${(zZ+C+)buf} )
    else
      local -a split=( ${(z)buf} )
    fi
  } always {
    BUFFER=${BUFFER% x}
  }
  if [[ ${split[-1]} == x ]]; then
    …
  fi
  zle .$WIDGET -- "$@"
}

You might want to use LBUFFER rather than BUFFER.

Incidentally, we might want to invent a syntax that applies Z+C+ iff
INTERACTIVE_COMMENTS is set — say, ${(zZ+CC+)} could mean that, to avoid
using up a fourth option letter in the Z+…+ context ;-)

Sorry for the late answer.

Daniel


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

end of thread, other threads:[~2021-03-29 12:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-07 10:23 KEYBOARD_HACK breaks with escaped quotes Linus Kardell
2021-03-29 12:30 ` Daniel Shahaf

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