mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix buggy completion of ~/some in vi mode (#41)
This commit fixes the bug reported in: https://github.com/att/ast/issues/682 The following sequence fails in vi mode because ksh looks in the wrong part of the 'virtual' buffer: $ touch ~/testfile $ ls ~/test<tab> The fix is to change 'virtual[i]' to 'virtual[last_virt]' in the bugged section of code. The other changes are to make sure listing files in a directory with something like 'ls /etc/<tab>' calls the code for Ctrl+L to preserve 'ls /etc/' rather than try (and fail) to complete the directory name, producing 'ls /etc\n/'. This bugfix was backported from ksh93v- 2013-10-10-alpha. src/cmd/ksh93/edit/vi.c - Backport the bugfix from ksh93v- 2013-10-10-alpha for this problem. src/cmd/ksh93/tests/pty.sh - Add a regression test for this issue using pty, adjusted slightly for a fake home directory in /tmp.
This commit is contained in:
parent
d41ec674c7
commit
4cecde1dd3
4 changed files with 30 additions and 4 deletions
|
@ -2391,6 +2391,7 @@ static int textmod(register Vi_t *vp,register int c, int mode)
|
|||
register genchar *p = vp->lastline;
|
||||
register int trepeat = vp->repeat;
|
||||
genchar *savep;
|
||||
int ch;
|
||||
|
||||
if(mode && (fold(vp->lastmotion)=='F' || fold(vp->lastmotion)=='T'))
|
||||
vp->lastmotion = ';';
|
||||
|
@ -2421,7 +2422,10 @@ addin:
|
|||
++last_virt;
|
||||
mode = cur_virt-1;
|
||||
virtual[last_virt] = 0;
|
||||
if(ed_expand(vp->ed,(char*)virtual, &cur_virt, &last_virt, c, vp->repeat_set?vp->repeat:-1)<0)
|
||||
ch = c;
|
||||
if(mode>=0 && c=='\\' && virtual[mode+1]=='/')
|
||||
c = '=';
|
||||
if(ed_expand(vp->ed,(char*)virtual, &cur_virt, &last_virt, ch, vp->repeat_set?vp->repeat:-1)<0)
|
||||
{
|
||||
if(vp->ed->e_tabcount)
|
||||
{
|
||||
|
@ -2433,9 +2437,8 @@ addin:
|
|||
last_virt = i;
|
||||
ed_ringbell();
|
||||
}
|
||||
else if((c=='=' || (c=='\\'&&virtual[i]=='/')) && !vp->repeat_set)
|
||||
else if((c=='=' || (c=='\\'&&virtual[last_virt]=='/')) && !vp->repeat_set)
|
||||
{
|
||||
last_virt = i;
|
||||
vp->nonewline++;
|
||||
ed_ungetchar(vp->ed,cntl('L'));
|
||||
return(GOOD);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue