Index | Thread | Search

From:
Walter Alejandro Iglesias <wai@roquesor.com>
Subject:
Re: Adding vi command bindings to sftp(1) (explanation)
To:
tech@openbsd.org
Date:
Sun, 21 Dec 2025 11:49:33 +0100

Download raw body.

Thread
So that no one can use the excuse that I didn't explain the issue.  For
those who don't read misc@, this comes from this discussion:

  https://marc.info/?t=176606090600001&r=1&w=2

Currently vi editing mode doesn't work in sftp(1), only emacs.  Since
editline(3) support is already included in sftp, it doesn't hurt to make
it fully work, right?

To test it you need this:

  $ cat ~/.editrc
  sftp:bind -v


P.S.: My wish for this Christmas is that this patch is not completely
ignored like countless other patches I've posted on tech@ in recent
years. :-)



Index: sftp.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/sftp.c,v
diff -u -p -u -p -r1.247 sftp.c
--- sftp.c	13 Oct 2025 00:54:29 -0000	1.247
+++ sftp.c	19 Dec 2025 15:21:45 -0000
@@ -2210,6 +2210,7 @@ interactive_loop(struct sftp_conn *conn,
 	HistEvent hev;
 	extern char *__progname;
 	struct complete_ctx complete_ctx;
+	const char *editor;
 
 	if (!batchmode && isatty(STDIN_FILENO)) {
 		if ((el = el_init(__progname, stdin, stdout, stderr)) == NULL)
@@ -2239,6 +2240,11 @@ interactive_loop(struct sftp_conn *conn,
 		el_set(el, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL);
 		/* make ^w match ksh behaviour */
 		el_set(el, EL_BIND, "^w", "ed-delete-prev-word", NULL);
+
+		/* Vi command mode */
+		el_get(el, EL_EDITOR, &editor);
+		if (editor[0] == 'v')
+			el_set(el, EL_BIND, "^[", "vi-command-mode", NULL);
 	}
 
 	if ((remote_path = sftp_realpath(conn, ".")) == NULL)



-- 
Walter