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).

Reply via email to