X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;ds=inline;f=selector.cc;h=7422fd6c2ac62b8db32e148b34b1cd4b6831ce72;hb=e4ebdbec894a0edf237c76737218a309db967794;hp=d36c8363c7e66348b122bb68f7945d7d9efeef9a;hpb=10836361b425af2fd602d4fe6adb12c8037f99d9;p=selector.git diff --git a/selector.cc b/selector.cc index d36c836..7422fd6 100644 --- a/selector.cc +++ b/selector.cc @@ -24,7 +24,7 @@ // To use it as a super-history-search for bash: // -// alias h='./selector -i -b -v -f <(history)' +// alias h='selector -d -i -b -v -f <(history)' // This software is highly Linux-specific, but I would be glad to get // patches to make it work on other OS @@ -114,13 +114,17 @@ int test_and_add(char *new_string, int new_index, code = code % hash_table_size; while(hash_table[code] >= 0) { - if(strcmp(new_string, strings[hash_table[code]]) == 0) return 1; + if(strcmp(new_string, strings[hash_table[code]]) == 0) { + int result = hash_table[code]; + hash_table[code] = new_index; + return result; + } code = (code + 1) % hash_table_size; } hash_table[code] = new_index; - return 0; + return -1; } ////////////////////////////////////////////////////////////////////// @@ -207,12 +211,12 @@ int next_visible(int current_line, int nb_lines, char **lines, matcher_t *matche void update_screen(int *current_line, int *temporary_line, int motion, int nb_lines, char **lines, - char *pattern_list) { + char *pattern) { char buffer[buffer_size]; matcher_t matcher; - initialize_matcher(use_regexp, &matcher, pattern_list); + initialize_matcher(use_regexp, &matcher, pattern); // We now take care of printing the lines per se @@ -358,7 +362,7 @@ void update_screen(int *current_line, int *temporary_line, int motion, sprintf(buffer, "%d/%d pattern: %s%s", nb_printed_lines, nb_lines, - pattern_list, + pattern, use_regexp ? " [regexp]" : ""); for(int k = strlen(buffer); k < console_width; k++) buffer[k] = ' '; @@ -438,13 +442,13 @@ int main(int argc, char **argv) { i++; } - else if(strcmp(argv[i], "-z") == 0) { - zsh_history = 1; + else if(strcmp(argv[i], "-b") == 0) { + bash_history = 1; i++; } - else if(strcmp(argv[i], "-b") == 0) { - bash_history = 1; + else if(strcmp(argv[i], "-z") == 0) { + zsh_history = 1; i++; } @@ -487,7 +491,8 @@ int main(int argc, char **argv) { if(show_help || error) { cerr << "Selector version " << VERSION << "-R" << REVISION_NUMBER << endl - << "Written by Francois Fleuret " + << "Written by Francois Fleuret ." + << endl << endl << argv[0] << " [-h]" @@ -495,6 +500,7 @@ int main(int argc, char **argv) { << " [-m]" << " [-d]" << " [-e]" + << " [-b]" << " [-z]" << " [-i]" << " [-c ]" @@ -544,16 +550,36 @@ int main(int argc, char **argv) { while(*s == ' ' || (*s >= '0' && *s <= '9')) s++; } - if(!hash_table || !test_and_add(s, nb_lines, lines, hash_table, hash_table_size)) { + int dup; + + if(hash_table) { + dup = test_and_add(s, nb_lines, lines, hash_table, hash_table_size); + } else { + dup = -1; + } + + if(dup < 0) { lines[nb_lines] = new char[strlen(s) + 1]; strcpy(lines[nb_lines], s); - nb_lines++; + } else { + lines[nb_lines] = lines[dup]; + lines[dup] = 0; } + + nb_lines++; } } delete[] hash_table; + int n = 0; + for(int k = 0; k < nb_lines; k++) { + if(lines[k]) { + lines[n++] = lines[k]; + } + } + nb_lines = n; + if(inverse_order) { for(int i = 0; i < nb_lines/2; i++) { char *s = lines[nb_lines - 1 - i]; @@ -562,10 +588,10 @@ int main(int argc, char **argv) { } } - char patterns[buffer_size]; - patterns[0] = '\0'; - int patterns_point; - patterns_point = 0; + char pattern[buffer_size]; + pattern[0] = '\0'; + int pattern_point; + pattern_point = 0; initscr(); @@ -596,7 +622,7 @@ int main(int argc, char **argv) { int key; int current_line = 0, temporary_line = 0; - update_screen(¤t_line, &temporary_line, 0, nb_lines, lines, patterns); + update_screen(¤t_line, &temporary_line, 0, nb_lines, lines, pattern); do { @@ -605,15 +631,15 @@ int main(int argc, char **argv) { int motion = 0; if(key >= ' ' && key <= '~') { - patterns[patterns_point++] = key; - patterns[patterns_point] = '\0'; + pattern[pattern_point++] = key; + pattern[pattern_point] = '\0'; } else if(key == KEY_BACKSPACE || key == '' || key == '' || key == KEY_DC || key == '') { - if(patterns_point > 0) { - patterns_point--; - patterns[patterns_point] = '\0'; + if(pattern_point > 0) { + pattern_point--; + pattern[pattern_point] = '\0'; } } @@ -633,6 +659,10 @@ int main(int argc, char **argv) { motion = -10; } + else if(key == KEY_DOWN || key == '') { + motion = 1; + } + else if(key == KEY_UP || key == '') { motion = -1; } @@ -642,16 +672,12 @@ int main(int argc, char **argv) { } else if(key == '') { - patterns_point = 0; - patterns[patterns_point] = '\0'; - } - - else if(key == KEY_DOWN || key == '') { - motion = 1; + pattern_point = 0; + pattern[pattern_point] = '\0'; } update_screen(¤t_line, &temporary_line, motion, - nb_lines, lines, patterns); + nb_lines, lines, pattern); } while(key != '\n' && key != KEY_ENTER && key != '');