C-v M-v - iomenu - interactive terminal-based selection menu
 (HTM) git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3d78cd3640a7bdbf23a67ff4566a8fa43ddeee33
 (DIR) parent cd0632ced34f04b758489ce6c273b9a4e30abeca
 (HTM) Author: Josuah Demangeon <mail@josuah.net>
       Date:   Sun, 30 Apr 2017 18:47:15 +0200
       
       C-v M-v
       
       Diffstat:
         M iomenu.c                            |      27 ++++++++++++++++++++++-----
       
       1 file changed, 22 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/iomenu.c b/iomenu.c
       @@ -13,6 +13,7 @@
        #define CONTINUE  2   /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */
        
        #define  CONTROL(char) (char ^ 0x40)
       +#define  ALT(char) (char + 0x80)
        #define  MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
        
        
       @@ -178,7 +179,7 @@ print_lines(int count)
                while (printed < count && i < matchc) {
                        char *s = format(matchv[i], ws.ws_col - 1);
        
       -                if (opt_s && matchv[i][0] == '#') {
       +                if (opt_s && matchv[i][0] == opt_s) {
                                fprintf(stderr, "\n\033[1m\033[K %s\033[m", s);
                        } else if (i == current) {
                                fprintf(stderr, "\n\033[30;47m\033[K %s\033[m", s);
       @@ -244,14 +245,14 @@ match_line(char *line, char **tokv, int tokc)
        
        
        static void
       -move_line(signed int count)
       +move_line(signed int n)
        {
                extern int    current;
                extern char **matchv;
        
                int i;
        
       -        for (i = current + count; 0 <= i && i < matchc; i += count) {
       +        for (i = current + n; 0 <= i && i < matchc; i += n) {
                        if (!opt_s || matchv[i][0] != opt_s) {
                                current = i;
                                break;
       @@ -358,8 +359,9 @@ print_selection(void)
        static int
        input_key(void)
        {
       -        char key = fgetc(stdin);
       +        int key = fgetc(stdin);
        
       +top:
                switch (key) {
        
                case CONTROL('C'):
       @@ -388,6 +390,14 @@ input_key(void)
                        move_line(-1);
                        break;
        
       +        case CONTROL('V'):
       +                move_line(ws.ws_row - 1);
       +                break;
       +
       +        case ALT('v'):
       +                move_line(-ws.ws_row + 1);
       +                break;
       +
                case CONTROL('I'):  /* tab */
                        if (linec > 0)
                                strcpy(input, matchv[current]);
       @@ -399,8 +409,15 @@ input_key(void)
                        print_selection();
                        return EXIT_SUCCESS;
        
       +        case 033: /* escape / alt */
       +                if (fgetc(stdin) == 'v') {
       +                        key = ALT('v');
       +                        goto top;
       +                }
       +                break;
       +
                default:
       -                add_character(key);
       +                add_character((char) key);
                }
        
                return CONTINUE;