iadded -s option - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 173b8e981c29a274af7398f08c76b9e07562e6de /scm/iomenu/commit/173b8e981c29a274af7398f08c76b9e07562e6de.gph bitreich.org 70 1parent f85d89ea704e25328a41b5c4ba3d115d1c997131 /scm/iomenu/commit/f85d89ea704e25328a41b5c4ba3d115d1c997131.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Tue, 11 Apr 2017 23:51:22 +0200 Err bitreich.org 70 i Err bitreich.org 70 iadded -s option Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.1 | 47 +++++++++++++++++++++++++++++-- Err bitreich.org 70 i M iomenu.c | 65 +++++++++++++++++++++++++------ Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 99 insertions(+), 13 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/iomenu.1 b/iomenu.1 /scm/iomenu/file/iomenu.1.gph bitreich.org 70 i@@ -2,24 +2,33 @@ Err bitreich.org 70 i .Dt IOMENU 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm iomenu Err bitreich.org 70 i .Nd interactive selection menu Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm Err bitreich.org 70 i .Op Fl l Ar lines Err bitreich.org 70 i .Op Fl p Ar prompt Err bitreich.org 70 i .Op Fl b Err bitreich.org 70 i+.Op Fl s Err bitreich.org 70 i .Op Fl t Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm Err bitreich.org 70 i is an interactive filtering and selection tool for the terminal. Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i It reads lines from standard input, and prompt for a selection. Err bitreich.org 70 i The selected line(s) is(are) printed to standard output. Err bitreich.org 70 i .Bl -tag -width XXXXXXXXXXXXXXXX Err bitreich.org 70 i@@ -39,8 +48,16 @@ lines. Err bitreich.org 70 i Set the prompt to display at the beginning of the input to Err bitreich.org 70 i .Ar prompt . Err bitreich.org 70 i . Err bitreich.org 70 i+.It Fl t Err bitreich.org 70 i+If a line starts with Err bitreich.org 70 i+.Li # , Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+will interprete it as a header, which always matches, and can not be Err bitreich.org 70 i+printed. Err bitreich.org 70 i+. Err bitreich.org 70 i .It Fl t / Fl b Err bitreich.org 70 i-Print the menu at the top / bottom rather than at current cursor position. Err bitreich.org 70 i+Print the menu at the top / bottom rather than at current cursor Err bitreich.org 70 i+position. Err bitreich.org 70 i Reset the cursor postition afterward. Err bitreich.org 70 i .El Err bitreich.org 70 i . Err bitreich.org 70 i@@ -82,56 +99,82 @@ Remove the whole input string. Err bitreich.org 70 i Fill the input with current selection. Err bitreich.org 70 i .El Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh EXIT STATUS Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Ex -std Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh EXAMPLES Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i Open a bookmark from a list in a text file: Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i iomenu < bookmarks-urls.txt | xargs firefox Err bitreich.org 70 i .Ed Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i Go to a subdirectory: Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i cd "$(find . -type d | iomenu)" Err bitreich.org 70 i .Ed Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i Edit a file located in Err bitreich.org 70 i .Ev HOME : Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i EDITOR "$(find "$HOME" -type f | iomenu -l 255)" Err bitreich.org 70 i .Ed Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i Play an audio file: Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i mplayer "$(find ~/Music | iomenu)" Err bitreich.org 70 i .Ed Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i Select a background job to attach to: Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i fg "%$(jobs | iomenu | cut -c 2)" Err bitreich.org 70 i .Ed Err bitreich.org 70 i+. Err bitreich.org 70 i .Pp Err bitreich.org 70 i+. Err bitreich.org 70 i Filter "ps" output and print a process ID Err bitreich.org 70 i+. Err bitreich.org 70 i .Bd -literal -offset XX Err bitreich.org 70 i-ps ax | tail -n +2 | iomenu -l 255 | sed -r 's/ *([0-9]*).*/\1/' Err bitreich.org 70 i+{ printf '# '; ps ax; } | iomenu -l 255 -s | sed -r 's/ *([0-9]*).*/\1/' Err bitreich.org 70 i .Ed Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh SEE ALSO Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Xr dmenu 1 , Err bitreich.org 70 i .Xr slmenu 1 , Err bitreich.org 70 i .Xr vis-menu 1 Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh BUGS Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm Err bitreich.org 70 i currently only support ASCII characters. Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh AUTORS Err bitreich.org 70 i . Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm Err bitreich.org 70 i was written from scratch by Err bitreich.org 70 i .An Josuah Demangeon Aq Mt mail@josuah.net Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -17,7 +17,6 @@ Err bitreich.org 70 i #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) Err bitreich.org 70 i #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static struct winsize ws; Err bitreich.org 70 i static struct termios termios; Err bitreich.org 70 i int tty_fd; Err bitreich.org 70 i@@ -27,7 +26,7 @@ static int linec = 0, matchc = 0; Err bitreich.org 70 i static char **linev = NULL, **matchv = NULL; Err bitreich.org 70 i static char input[BUFSIZ], formatted[BUFSIZ * 8]; Err bitreich.org 70 i static int opt_l = 0, opt_tb = 0; Err bitreich.org 70 i-static char *opt_p = ""; Err bitreich.org 70 i+static char *opt_p = "", opt_s = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -130,7 +129,7 @@ read_lines(void) Err bitreich.org 70 i die("realloc"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- linev[linec] = matchv[matchc] = malloc(len); Err bitreich.org 70 i+ linev[linec] = matchv[matchc] = malloc(len + 1); Err bitreich.org 70 i if (linev[linec] == NULL) Err bitreich.org 70 i die("malloc"); Err bitreich.org 70 i Err bitreich.org 70 i@@ -165,8 +164,12 @@ format(char *str, int cols) Err bitreich.org 70 i if (str[i] == '\t') { Err bitreich.org 70 i for (int t = (j + 7) % 8 + 1; t > 0 && j < cols; t--) Err bitreich.org 70 i formatted[j++] = ' '; Err bitreich.org 70 i- } else { Err bitreich.org 70 i+ Err bitreich.org 70 i+ } else if (isprint(str[i])) { Err bitreich.org 70 i formatted[j++] = str[i]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ formatted[j++] = '?'; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -177,10 +180,17 @@ format(char *str, int cols) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i-print_string(char *str, int current) Err bitreich.org 70 i+print_string(char *str, int iscurrent) Err bitreich.org 70 i { Err bitreich.org 70 i- fputs(current ? "\033[30;47m" : "", stderr); Err bitreich.org 70 i+ extern int opt_l; Err bitreich.org 70 i+ extern char opt_s; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs(iscurrent ? "\033[30;47m" : "", stderr); Err bitreich.org 70 i fputs(opt_l ? "\033[K " : " ", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (opt_s && str[0] == '#') Err bitreich.org 70 i+ fputs("\033[1;30m", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i fputs(format(str, ws.ws_col - 2), stderr); Err bitreich.org 70 i fputs(" \033[m", stderr); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -289,6 +299,9 @@ print_screen(void) Err bitreich.org 70 i static int Err bitreich.org 70 i match_line(char *line, char **tokv, int tokc) Err bitreich.org 70 i { Err bitreich.org 70 i+ if (opt_s && line[0] == opt_s) Err bitreich.org 70 i+ return 2; Err bitreich.org 70 i+ Err bitreich.org 70 i for (int i = 0; i < tokc; i++) Err bitreich.org 70 i if (strstr(line, tokv[i]) == NULL) Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -298,6 +311,21 @@ match_line(char *line, char **tokv, int tokc) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i+move_line(signed int count) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ extern int current; Err bitreich.org 70 i+ extern char **matchv; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (int i = current + count; 0 <= i && i < matchc; i += count) { Err bitreich.org 70 i+ if (!opt_s || matchv[i][0] != opt_s) { Err bitreich.org 70 i+ current = i; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i filter_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i char **tokv = NULL, *s, buffer[sizeof (input)]; Err bitreich.org 70 i@@ -325,6 +353,9 @@ filter_lines(void) Err bitreich.org 70 i matchv[matchc++] = linev[i]; Err bitreich.org 70 i Err bitreich.org 70 i free(tokv); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (opt_s && matchv[current][0] == opt_s) Err bitreich.org 70 i+ move_line(+1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -361,9 +392,16 @@ add_character(char key) Err bitreich.org 70 i static void Err bitreich.org 70 i print_selection(void) Err bitreich.org 70 i { Err bitreich.org 70 i+ extern int current; Err bitreich.org 70 i+ extern char **matchv, input[BUFSIZ]; Err bitreich.org 70 i+ Err bitreich.org 70 i fputs("\r\033[K", stderr); Err bitreich.org 70 i- fputs(matchc > 0 ? matchv[current] : input, stdout); Err bitreich.org 70 i- fputc('\n', stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (matchc == 0 || (opt_s && matchv[current][0] == opt_s)) { Err bitreich.org 70 i+ puts(input); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ puts(matchv[current]); Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -393,11 +431,11 @@ input_key(void) Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('N'): Err bitreich.org 70 i- current += current < matchc - 1 ? 1 : 0; Err bitreich.org 70 i+ move_line(+1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('P'): Err bitreich.org 70 i- current -= current > 0 ? 1 : 0; Err bitreich.org 70 i+ move_line(-1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('I'): /* tab */ Err bitreich.org 70 i@@ -446,7 +484,7 @@ input_get(void) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fputs("usage: iomenu [-b] [-t] [-l lines] [-p prompt]\n", stderr); Err bitreich.org 70 i+ fputs("usage: iomenu [-b] [-t] [-s] [-l lines] [-p prompt]\n", stderr); Err bitreich.org 70 i Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -478,6 +516,10 @@ main(int argc, char *argv[]) Err bitreich.org 70 i opt_p = argv[i]; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i+ case 's': Err bitreich.org 70 i+ opt_s = '#'; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -485,6 +527,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i setlocale(LC_ALL, ""); Err bitreich.org 70 i read_lines(); Err bitreich.org 70 i+ filter_lines(); Err bitreich.org 70 i Err bitreich.org 70 i if (!freopen("/dev/tty", "r", stdin) || Err bitreich.org 70 i !freopen("/dev/tty", "w", stderr)) Err bitreich.org 70 .