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 <[email protected]>:
>
> 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 <[email protected]>:
> >
> > 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).