From: Fredrik Flornes Ellertsen > Sent: 04 June 2024 09:24 > To: busybox@busybox.net > Subject: [PATCH] vi: add +LINE support > > Since v253 (commit 1ae886f), systemd assumes that $EDITOR understands the > +line > syntax to jump to a specific line when opening a file with 'systemctl edit' > (vim, ed, and nano all do). systemd's assumption of this won't go away [0], so > BusyBox vi might as well support it. > > [0] https://github.com/systemd/systemd/issues/33023#issuecomment-2145506204 > > Signed-off-by: Fredrik Flornes Ellertsen <felle...@fastmail.com> > --- > editors/vi.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/editors/vi.c b/editors/vi.c > index 3cc3d2a0b..964ca0132 100644 > --- a/editors/vi.c > +++ b/editors/vi.c > @@ -181,11 +181,12 @@ > //kbuild:lib-$(CONFIG_VI) += vi.o > > //usage:#define vi_trivial_usage > -//usage: IF_FEATURE_VI_COLON("[-c CMD] ")IF_FEATURE_VI_READONLY("[-R] > ")"[-H] [FILE]..." > +//usage: IF_FEATURE_VI_COLON("[-c CMD] ")IF_FEATURE_VI_READONLY("[-R] > ")"[-H] [+line] > [FILE]..." > //usage:#define vi_full_usage "\n\n" > //usage: "Edit FILE\n" > //usage: IF_FEATURE_VI_COLON( > //usage: "\n -c CMD Initial command to run ($EXINIT and ~/.exrc > also available)" > +//usage: "\n +LINE Open FILE with cursor at LINE" > //usage: ) > //usage: IF_FEATURE_VI_READONLY( > //usage: "\n -R Read-only" > @@ -349,6 +350,7 @@ struct globals { > int get_rowcol_error; > #endif > int crow, ccol; // cursor is on Crow x Ccol > + int open_at_line; // open file at line (default 0) > int offset; // chars scrolled off the screen to the left > int have_status_msg; // is default edit status needed? > // [don't make smallint!] > @@ -483,6 +485,7 @@ struct globals { > #define columns (G.columns ) > #define crow (G.crow ) > #define ccol (G.ccol ) > +#define open_at_line (G.open_at_line ) > #define offset (G.offset ) > #define status_buffer (G.status_buffer ) > #define have_status_msg (G.have_status_msg ) > @@ -4871,6 +4874,8 @@ static void edit_file(char *fn) > while (initial_cmds) > run_cmds((char *)llist_pop(&initial_cmds)); > #endif > + dot = find_line(open_at_line); > + dot_skip_over_ws(); > redraw(FALSE); // dont force every col re-draw > //------This is the main Vi cmd handling loop ----------------------- > while (editing > 0) { > @@ -5034,10 +5039,24 @@ int vi_main(int argc, char **argv) > } > } > #endif > + > + // 4: process optional +line argument > + optind = 0; > + open_at_line = 0; > + if (argv[optind]) { > + int pos; > + if (sscanf(argv[optind], "+%d%n", &open_at_line, &pos) == 1) { > + if (strlen(argv[optind]) == pos) {
if (!argv[optind][pos]) > + optind++; > + } else { > + // garbage in +line argument, assume it's a > filename > + open_at_line = 0; > + } > + } > + } > // "Save cursor, use alternate screen buffer, clear screen" > write1(ESC"[?1049h"); > // This is the main file handling loop > - optind = 0; > while (1) { > edit_file(argv[optind]); // might be NULL on 1st iteration > // NB: optind can be changed by ":next" and ":rewind" commands > -- > 2.45.0 > > _______________________________________________ > busybox mailing list > busybox@busybox.net > http://lists.busybox.net/mailman/listinfo/busybox - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox