summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-22 18:45:30 -0500
committerJune McEnroe <june@causal.agency>2020-12-22 19:28:22 -0500
commit3fc932f1b29190095ddb557e8504902a395154f3 (patch)
treec76d13ac648a66fb3a69d6b67621cd61161a90e8
parentBuild with libedit by default (diff)
downloadsrc-3fc932f1b29190095ddb557e8504902a395154f3.tar.gz
src-3fc932f1b29190095ddb557e8504902a395154f3.zip
Bind libedit's secret filename completion function
Check if the FreeBSD (and by extension macOS) _el_fn_sh_complete version
of the function exists, which does shell escaping of completed filenames
before _el_fn_complete learned to.

Tab is bound after calling el_set() and el_source() since the default
bindings set tab to something else, and it should always be filename
completion in the shell.
-rw-r--r--bin/dash/configure.ac1
-rw-r--r--bin/dash/src/histedit.c8
2 files changed, 9 insertions, 0 deletions
diff --git a/bin/dash/configure.ac b/bin/dash/configure.ac
index 43e71efd..1edc45b8 100644
--- a/bin/dash/configure.ac
+++ b/bin/dash/configure.ac
@@ -183,6 +183,7 @@ if test "$use_libedit" != "yes"; then
 	AC_DEFINE([SMALL], 1, [Define if you build with -DSMALL])
 else
 	export LIBS="$LIBS -ledit"
+	AC_CHECK_FUNCS(_el_fn_sh_complete)
 fi
 AC_ARG_ENABLE(lineno, AS_HELP_STRING(--disable-lineno, \
 				     [Disable LINENO support]))
diff --git a/bin/dash/src/histedit.c b/bin/dash/src/histedit.c
index f5c90aba..3525e028 100644
--- a/bin/dash/src/histedit.c
+++ b/bin/dash/src/histedit.c
@@ -116,6 +116,13 @@ histedit(void)
 				if (hist)
 					el_set(el, EL_HIST, history, hist);
 				el_set(el, EL_PROMPT, getprompt);
+#ifdef HAVE__EL_FN_SH_COMPLETE
+				el_set(el, EL_ADDFN, "sh-complete", "Filename completion",
+					_el_fn_sh_complete);
+#else
+				el_set(el, EL_ADDFN, "sh-complete", "Filename completion",
+					_el_fn_complete);
+#endif
 			} else {
 bad:
 				out2str("sh: can't initialize editing\n");
@@ -133,6 +140,7 @@ bad:
 			else if (Eflag)
 				el_set(el, EL_EDITOR, "emacs");
 			el_source(el, NULL);
+			el_set(el, EL_BIND, "^I", "sh-complete", NULL);
 		}
 	} else {
 		INTOFF;