From: Walter Alejandro Iglesias Subject: Re: Fix for vi editing mode in sftp(1) (PING) To: Damien Miller Cc: tech@openbsd.org Date: Tue, 20 Jan 2026 10:44:38 +0100 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