Greetings and felicitations!
Two things about auto-completion annoyed me in ksh for almost 4 years:
( `|' shows the position of cursor after auto-completion)
1) tilde bug:
$ ls ~/nonexist<TAB>
$ ls ~/nonexist\* |
(i.e. it expands to something insensible, instead of doing nothing like
in /home/<your_user_name>/nonexist case)
2) square bracket bug:
$ touch 'so[me]_file'
$ ls so\[<TAB>
$ ls so\[|
(i.e. nothing happens)
behavior after the patch:
1)
$ ls ~/nonexist<TAB>
$ ls ~/nonexist|
2)
$ ls so[<TAB>
$ ls so\[me\]_file |
(it should work for all kinds of auto-completions, and both
in vi and emacs mode)
While I was testing to see if I broke something by fixing these two,
I also discovered that auto-completions now work in much more sensible
and useful way for strings with variables:
before patch:
$ ls -d tmp
$ tmp
$ ls $HOME/tm<TAB>
$ ls /home/s/tm |
after patch:
$ ls $HOME/tm<TAB>
$ ls /home/s/tmp/|
make test -- shows no errors.
Patch:
Index: edit.c
===================================================================
RCS file: /OpenBSD/src/bin/ksh/edit.c,v
retrieving revision 1.33
diff -r1.33 edit.c
414c414
< expand(yylval.cp, &w, DOGLOB|DOTILDE|DOMARKDIRS);
---
487c487
< pat = evalstr(toglob, DOPAT|DOTILDE);
---
650c650
< /* Given a string, copy it and possibly add a '*' to the end. The
---
657,658d656
< char *s;
< bool saw_slash = false;
663,684c661,663
< toglob = str_nsave(str, slen + 1, ATEMP); /* + 1 for "*" */
< toglob[slen] = '\0';
<
< /*
< * If the pathname contains a wildcard (an unquoted '*',
< * '?', or '[') or parameter expansion ('$'), or a ~username
< * with no trailing slash, then it is globbed based on that
< * value (i.e., without the appended '*').
< */
< for (s = toglob; *s; s++) {
< if (*s == '\\' && s[1])
< s++;
< else if (*s == '*' || *s == '[' || *s == '?' || *s == '$'
< || (s[1] == '(' /*)*/ && strchr("*+?@!", *s)))
< break;
< else if (*s == '/')
< saw_slash = true;
< }
< if (!*s && (*toglob != '~' || saw_slash)) {
< toglob[slen] = '*';
< toglob[slen + 1] = '\0';
< }
---
Index: eval.c
===================================================================
RCS file: /OpenBSD/src/bin/ksh/eval.c,v
retrieving revision 1.34
diff -r1.34 eval.c
557c557
< glob(p, wp, f & DOMARKDIRS);
---
599c599
< if (f & (DOPAT | DOGLOB)) {
---
606d605
< case '*':
607a607,610
617,620c620,624
< if ((f & DOBRACE_) && (c == OBRACE ||
< (fdo & DOBRACE_))) {
< fdo |= DOBRACE_|DOMAGIC_;
< *dp++ = MAGIC;
---
936c940
< glob(char *cp, XPtrV *wp, int markdirs)
---
940,942c944,947
< if (glob_str(cp, wp, markdirs) == 0)
< XPput(*wp, debunk(cp, cp, strlen(cp) + 1));
< else
---
1144,1145c1149,1150
< return dp;
< memcpy(dp, sp, s - sp);
---
Index: tree.h
===================================================================
RCS file: /OpenBSD/src/bin/ksh/tree.h,v
retrieving revision 1.10
diff -r1.10 tree.h
128a129
Previous message: [thread] [date] [author] Next message: [thread] [date] [author]
Messages in current thread:
[patch] fix a few ksh auto-completion bugs, Sviatoslav Chagaev, (Thu Mar 4, 1:00 am)