I send the email once again because missing tab space. I'm sorry that to send extra email.
Index: emacs.c =================================================================== RCS file: /cvs/src/bin/ksh/emacs.c,v retrieving revision 1.85 diff -u -p -r1.85 emacs.c --- emacs.c 18 Jun 2018 17:03:58 -0000 1.85 +++ emacs.c 10 Oct 2018 23:26:49 -0000 @@ -201,6 +201,7 @@ static int x_fold_lower(int); static int x_fold_upper(int); static int x_set_arg(int); static int x_comment(int); +static int x_expand_alias_sub(int); #ifdef DEBUG static int x_debug_info(int); #endif @@ -258,6 +259,7 @@ static const struct x_ftab x_ftab[] = { { x_fold_upper, "upcase-word", XF_ARG }, { x_set_arg, "set-arg", XF_NOBIND }, { x_comment, "comment", 0 }, + { x_expand_alias_sub, "expand-alias-substitute", 0 }, { 0, 0, 0 }, #ifdef DEBUG { x_debug_info, "debug-info", 0 }, @@ -1492,6 +1494,7 @@ x_init_emacs(void) kb_add(x_comp_file, CTRL('['), CTRL('X'), 0); kb_add(x_comp_list, CTRL('I'), 0); kb_add(x_comp_list, CTRL('['), '=', 0); + kb_add(x_expand_alias_sub, CTRL('['), CTRL('E'), 0); kb_add(x_del_back, CTRL('?'), 0); kb_add(x_del_back, CTRL('H'), 0); kb_add(x_del_char, CTRL('['), '[', '3', '~', 0); /* delete */ @@ -1982,6 +1985,73 @@ x_comment(int c) return KSTD; } +static int +x_expand_alias_sub(int c) +{ + struct tbl *tp; + const char *sep = " \t\n"; + char *cp; + char *word, *name; + char *buf, *tok, *state; + int skip = 0; + int size = 0; + size_t len = 0; + + if (xep == xbuf) + goto fail; + + cp = xbuf; + while (cp != xep && is_mfs(*cp)) + skip += x_size(*cp++); + + word = cp; + while (cp != xep && !is_mfs(*cp)) { + size += x_size(*cp++); + len++; + } + + if (len > 0) { + name = strndup(word, len); + if (!name) { + bi_errorf("unable to allocate memory"); + goto fail; + } + + tp = ktsearch(&aliases, name, hash(name)); + if (tp) { + buf = strdup(tp->val.s); + if (!buf) { + bi_errorf("unable to allocate memory"); + goto fail; + } + + tok = strtok_r(buf, sep, &state); + if (!tok) { + bi_errorf("strtok_r failed"); + goto fail; + } + + if (strcmp(name, tok)) { + x_goto(xbuf + skip); + x_delete(size, false); + x_ins(tp->val.s); + } + } + } + + size = x_size_str(xbuf); + buf = substitute(xbuf, 0); + + x_goto(xbuf); + x_delete(size, false); + x_ins(buf); + x_adjust(); + + return KSTD; +fail: + x_e_putc(BEL); + return KSTD; +} /* NAME: * x_prev_histword - recover word from prev command 2018年10月11日(木) 10:07 Hajime Edakawa <hajime.edak...@gmail.com>: > > Klemens Nanni wrote: > >Thanks for your work. > > I'm the one who should be thanking OpenBSD developers. > It's a real honor to hear that! > > >With `alias ls=ls\ -l' and successive expand-line invocations: will > >`ls' be expanded over and over again? > > Maybe I fixed the problems that you pointed out. > > $ type ls > ls is an alias for 'ls -CF' > $ alias ll='ls -l' > $ ll > $ ls -l > $ ls -l > ... > > >This looks nice. > > I added some more example. > > $ path=/foo/bar/file.txt > $ alias ll='ls -l' > $ ll "$(echo $$)" $(( 1 + 1 )) ${path##*/} hoge > $ ls -l "71788" 2 file.txt hoge > > >Did you test it in vi mode as well? > > Unfortunately, I've never use vi. I'm really sorry. > I'd like to study vi sometime. > > >Your diff does not apply to -CURRENT (written against 6.3) and lacks > >documentation updates to ksh(1). > > I've tried to add the diff of emacs.c and ksh.1 against -CURRENT. > The name changes from shell-expand-line to expand-alias-substitute. > And expand-alias-substitute code was modified. > > /* Excuse me if you not understand or you feel bad with my poor English */ > > Best regards, > Hajime Edakawa > > Index: ksh.1 > =================================================================== > RCS file: /cvs/src/bin/ksh/ksh.1,v > retrieving revision 1.201 > diff -u -p -r1.201 ksh.1 > --- ksh.1 18 Jun 2018 17:03:58 -0000 1.201 > +++ ksh.1 10 Oct 2018 23:26:57 -0000 > @@ -4819,6 +4819,10 @@ if alone on a line; otherwise acts as > Error (ring the bell). > .It exchange-point-and-mark: ^X^X > Places the cursor where the mark is and sets the mark to where the cursor > was. > +.It expand-alias-substitute: ^[^E > +Automatically expands a command alias and substitute parameter, > command, and arithmetic (see > +.Sx Substitution > +below). > .It expand-file: ^[* > Appends a > .Ql * > Index: emacs.c > =================================================================== > RCS file: /cvs/src/bin/ksh/emacs.c,v > retrieving revision 1.85 > diff -u -p -r1.85 emacs.c > --- emacs.c 18 Jun 2018 17:03:58 -0000 1.85 > +++ emacs.c 10 Oct 2018 23:26:49 -0000 > @@ -201,6 +201,7 @@ static int x_fold_lower(int); > static int x_fold_upper(int); > static int x_set_arg(int); > static int x_comment(int); > +static int x_expand_alias_sub(int); > #ifdef DEBUG > static int x_debug_info(int); > #endif > @@ -258,6 +259,7 @@ static const struct x_ftab x_ftab[] = { > { x_fold_upper, "upcase-word", XF_ARG }, > { x_set_arg, "set-arg", XF_NOBIND }, > { x_comment, "comment", 0 }, > + { x_expand_alias_sub, "expand-alias-substitute", 0 }, > { 0, 0, 0 }, > #ifdef DEBUG > { x_debug_info, "debug-info", 0 }, > @@ -1492,6 +1494,7 @@ x_init_emacs(void) > kb_add(x_comp_file, CTRL('['), CTRL('X'), 0); > kb_add(x_comp_list, CTRL('I'), 0); > kb_add(x_comp_list, CTRL('['), '=', 0); > + kb_add(x_expand_alias_sub, CTRL('['), CTRL('E'), 0); > kb_add(x_del_back, CTRL('?'), 0); > kb_add(x_del_back, CTRL('H'), 0); > kb_add(x_del_char, CTRL('['), '[', '3', '~', 0); /* delete */ > @@ -1982,6 +1985,73 @@ x_comment(int c) > return KSTD; > } > > +static int > +x_expand_alias_sub(int c) > +{ > + struct tbl *tp; > + const char *sep = " \t\n"; > + char *cp; > + char *word, *name; > + char *buf, *tok, *state; > + int skip = 0; > + int size = 0; > + size_t len = 0; > + > + if (xep == xbuf) > + goto fail; > + > + cp = xbuf; > + while (cp != xep && is_mfs(*cp)) > + skip += x_size(*cp++); > + > + word = cp; > + while (cp != xep && !is_mfs(*cp)) { > + size += x_size(*cp++); > + len++; > + } > + > + if (len > 0) { > + name = strndup(word, len); > + if (!name) { > + bi_errorf("unable to allocate memory"); > + goto fail; > + } > + > + tp = ktsearch(&aliases, name, hash(name)); > + if (tp) { > + buf = strdup(tp->val.s); > + if (!buf) { > + bi_errorf("unable to allocate memory"); > + goto fail; > + } > + > + tok = strtok_r(buf, sep, &state); > + if (!tok) { > + bi_errorf("strtok_r failed"); > + goto fail; > + } > + > + if (strcmp(name, tok)) { > + x_goto(xbuf + skip); > + x_delete(size, false); > + x_ins(tp->val.s); > + } > + } > + } > + > + size = x_size_str(xbuf); > + buf = substitute(xbuf, 0); > + > + x_goto(xbuf); > + x_delete(size, false); > + x_ins(buf); > + x_adjust(); > + > + return KSTD; > +fail: > + x_e_putc(BEL); > + return KSTD; > +} > > /* NAME: > * x_prev_histword - recover word from prev command > 2018年10月11日(木) 2:52 Klemens Nanni <k...@openbsd.org>: > > > > On Wed, Oct 10, 2018 at 08:58:43AM +0900, Hajime Edakawa wrote: > > > I have challenged to try to make shell_expand_line in ksh. > > > You can check it if you type M-C-e. > > Thanks for your work. > > > > > $ echo "$(echo a b)" > > > $ echo "a b" > > > > > > $ alias ll='ls -l' > > > $ ll $(echo a b) hoge "$(( 1 + 1 ))" ll bar > > > $ ls -l a b hoge "2" ll bar > > This looks nice. > > > > With `alias ls=ls\ -l' and successive expand-line invocations: will > > `ls' be expanded over and over again? > > > > Did you test it in vi mode as well? > > > > > To be honest, I'm not sure if this is correct. > > > I only like OpenBSD, That's why I'm so sorry if they're wrong > > Your diff does not apply to -CURRENT (written against 6.3) and lacks > > documentation updates to ksh(1).