Index | Thread | Search

From:
Walter Alejandro Iglesias <wai@roquesor.com>
Subject:
Re: Fix for vi editing mode in sftp(1) (PING)
To:
Damien Miller <djm@mindrot.org>
Cc:
tech@openbsd.org
Date:
Tue, 20 Jan 2026 10:44:38 +0100

Download raw body.

Thread
Hello Damien,

On Tue, Jan 20, 2026 at 01:44:58PM +1100, Damien Miller wrote:
> On Mon, 19 Jan 2026, Walter Alejandro Iglesias wrote:
> 
> > On Sun, Dec 21, 2025 at 11:49:36AM +0100, Walter Alejandro Iglesias wrote:
> > > 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
> 
> how does it support vi editing with this patch if EL_EDITOR is still
> unconditionally set to "emacs"? Does editrc override this?

If you comment out the following line, your ~/.editrc is not read:

	el_source(el, NULL);

The diff below is just a test.  Once applied you'll verify that whatever
you put in ~/.editrc, sftp will use what you hard code in the "editor"
variable, vi mode in this case.


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	20 Jan 2026 09:25:39 -0000
@@ -2204,6 +2204,7 @@ interactive_loop(struct sftp_conn *conn,
 	char *remote_path;
 	char *dir = NULL, *startdir = NULL;
 	char cmd[2048];
+	const char *editor = "vi";
 	int err, interactive;
 	EditLine *el = NULL;
 	History *hl = NULL;
@@ -2220,10 +2221,10 @@ interactive_loop(struct sftp_conn *conn,
 		el_set(el, EL_HIST, history, hl);
 
 		el_set(el, EL_PROMPT, prompt);
-		el_set(el, EL_EDITOR, "emacs");
+		el_set(el, EL_EDITOR, editor);
 		el_set(el, EL_TERMINAL, NULL);
 		el_set(el, EL_SIGNAL, 1);
-		el_source(el, NULL);
+		//el_source(el, NULL);
 
 		/* Tab Completion */
 		el_set(el, EL_ADDFN, "ftp-complete",
@@ -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)


> 
> -d

-- 
Walter