mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
emacs: fix keys w/ repeat parameters repeating extra (re: 29b11bba
)
@JohnoKing writes:
> In emacs mode, using Alt+D or Alt+H with a repeat parameter
> results in the deletion of extra characters. Reproducer:
>
> $ set -o emacs
> $ foo bar delete add # <Ctrl+A> <ESC+3+Alt+D>
> $ d # Should be ' add'
>
> $ foo bar delete add # <ESC+3+Alt+H>
> $ f # Should be 'foo '
>
> [...] this bug also affects the Delete and Arrow keys [...].
> Reproducer:
>
> $ test_string <Ctrl+A> <ESC+3+Delete>
> # This will delete all of 'test', which is four characters
> $ test_string <Ctrl+A> <ESC+4+Right Arrow>
> # This should move the cursor to '_', not 's'
src/cmd/ksh93/edit/emacs.c: ed_emacsread():
- Revert part of 29b11bba
: once again set 'count' to
'vt220_save_repeat' instead of adding the value.
- do_escape: If the escape() function (which handles both ESC
repeat counts and commands like ESC d and ESC h) returns a repeat
count, do not use the saved repeat count for v220 sequences.
src/cmd/ksh93/tests/pty.sh:
- Test the four reproducers above.
Fixes: https://github.com/ksh93/ksh/issues/292
This commit is contained in:
parent
da4bf85f27
commit
143ff27a91
2 changed files with 23 additions and 1 deletions
|
@ -324,7 +324,7 @@ int ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
|
||||||
count = 1;
|
count = 1;
|
||||||
if(vt220_save_repeat>0)
|
if(vt220_save_repeat>0)
|
||||||
{
|
{
|
||||||
count += vt220_save_repeat;
|
count = vt220_save_repeat;
|
||||||
vt220_save_repeat = 0;
|
vt220_save_repeat = 0;
|
||||||
}
|
}
|
||||||
adjust = -1;
|
adjust = -1;
|
||||||
|
@ -623,6 +623,8 @@ update:
|
||||||
vt220_save_repeat = oadjust;
|
vt220_save_repeat = oadjust;
|
||||||
do_escape:
|
do_escape:
|
||||||
adjust = escape(ep,out,oadjust);
|
adjust = escape(ep,out,oadjust);
|
||||||
|
if(adjust > -1)
|
||||||
|
vt220_save_repeat = 0;
|
||||||
continue;
|
continue;
|
||||||
case cntl('R') :
|
case cntl('R') :
|
||||||
search(ep,out,count);
|
search(ep,out,count);
|
||||||
|
|
|
@ -872,5 +872,25 @@ w `echo true`\t
|
||||||
r ^:test-2: `echo true`\r\n$
|
r ^:test-2: `echo true`\r\n$
|
||||||
!
|
!
|
||||||
|
|
||||||
|
# err_exit #
|
||||||
|
((SHOPT_ESH)) && VISUAL=emacs tst $LINENO <<"!"
|
||||||
|
L emacs: keys with repeat parameters repeat extra steps
|
||||||
|
# https://github.com/ksh93/ksh/issues/292
|
||||||
|
|
||||||
|
d 15
|
||||||
|
p :test-1:
|
||||||
|
w : foo bar delete add\1\6\6\E3\Ed
|
||||||
|
r ^:test-1: : add\r\n$
|
||||||
|
p :test-2:
|
||||||
|
w : foo bar delete add\E3\Eh
|
||||||
|
r ^:test-2: : foo \r\n$
|
||||||
|
p :test-3:
|
||||||
|
w : test_string\1\6\6\E3\E[3~
|
||||||
|
r ^:test-3: : t_string\r\n$
|
||||||
|
p :test-4:
|
||||||
|
w : test_string\1\E6\E[C\4
|
||||||
|
r ^:test-4: : teststring\r\n$
|
||||||
|
!
|
||||||
|
|
||||||
# ======
|
# ======
|
||||||
exit $((Errors<125?Errors:125))
|
exit $((Errors<125?Errors:125))
|
||||||
|
|
Loading…
Reference in a new issue