X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=selector.cc;h=50a852b571b96a884e025fe60c076e8502898320;hb=b7e259513408fd65013e161e1d98f00d6b7edeb8;hp=b84bd794d424f2c7bd7a7cd2317fae13ea406aef;hpb=40e6ea9378f98eac922050a7fad1cc161fe291e5;p=selector.git diff --git a/selector.cc b/selector.cc index b84bd79..50a852b 100644 --- a/selector.cc +++ b/selector.cc @@ -210,6 +210,65 @@ void initialize_matcher(int use_regexp, int case_sensitive, } } +////////////////////////////////////////////////////////////////////// +// Buffer edition + +void delete_char(char *buffer, int *position) { + if(buffer[*position]) { + int c = *position; + while(c < buffer_size && buffer[c]) { + buffer[c] = buffer[c+1]; + c++; + } + } +} + +void backspace_char(char *buffer, int *position) { + if(*position > 0) { + if(buffer[*position]) { + int c = *position - 1; + while(buffer[c]) { + buffer[c] = buffer[c+1]; + c++; + } + } else { + buffer[*position - 1] = '\0'; + } + + (*position)--; + } +} + +void insert_char(char *buffer, int *position, char character) { + if(strlen(buffer) < buffer_size - 1) { + int c = *position; + char t = buffer[c], u; + while(t) { + c++; + u = buffer[c]; + buffer[c] = t; + t = u; + } + c++; + buffer[c] = '\0'; + buffer[(*position)++] = character; + } +} + +void kill_before_cursor(char *buffer, int *position) { + int s = 0; + while(buffer[*position + s]) { + buffer[s] = buffer[*position + s]; + s++; + } + buffer[s] = '\0'; + *position = 0; +} + +void kill_after_cursor(char *buffer, int *position) { + buffer[*position] = '\0'; +} + ////////////////////////////////////////////////////////////////////// int previous_visible(int current_line, int nb_lines, char **lines, matcher_t *matcher) { @@ -746,6 +805,17 @@ int main(int argc, char **argv) { update_screen(¤t_line, &temporary_line, 0, nb_lines, lines, cursor_position, pattern); + // ^@ \000 + // ^A \001 + // ... + // ^Z \032 + // ^[ \033 + // ^\ \034 + // ^] \035 + // ^^ \036 + // ^_ \037 + // ^? \177 + do { key = getch(); @@ -753,45 +823,15 @@ int main(int argc, char **argv) { int motion = 0; if(key >= ' ' && key <= '~') { // Insert character - int c = cursor_position; - char t = pattern[c], u; - if(t) { - while(t) { - c++; - u = pattern[c]; - pattern[c] = t; - t = u; - } - pattern[cursor_position++] = key; - } else { - pattern[cursor_position++] = key; - pattern[cursor_position] = '\0'; - } + insert_char(pattern, &cursor_position, key); } - else if(key == KEY_BACKSPACE || key == '' || key == '') { - if(cursor_position > 0) { - if(pattern[cursor_position]) { - int c = cursor_position-1; - while(pattern[c]) { - pattern[c] = pattern[c+1]; - c++; - } - } else { - pattern[cursor_position - 1] = '\0'; - } - cursor_position--; - } + else if(key == KEY_BACKSPACE || key == '\010' || key == '\177') { + backspace_char(pattern, &cursor_position); } - else if(key == KEY_DC || key == '') { - if(pattern[cursor_position]) { - int c = cursor_position; - while(pattern[c]) { - pattern[c] = pattern[c+1]; - c++; - } - } + else if(key == KEY_DC || key == '\004') { + delete_char(pattern, &cursor_position); } else if(key == KEY_HOME) { @@ -810,52 +850,46 @@ int main(int argc, char **argv) { motion = -10; } - else if(key == KEY_DOWN || key == '') { + else if(key == KEY_DOWN || key == '\014') { motion = 1; } - else if(key == KEY_UP || key == '') { + else if(key == KEY_UP || key == '\016') { motion = -1; } - else if(key == KEY_LEFT || key == '') { + else if(key == KEY_LEFT || key == '\002') { if(cursor_position > 0) cursor_position--; } - else if(key == KEY_RIGHT || key == '') { + else if(key == KEY_RIGHT || key == '\006') { if(pattern[cursor_position]) cursor_position++; } - else if(key == '') { + else if(key == '\001') { cursor_position = 0; } - else if(key == '') { + else if(key == '\005') { cursor_position = strlen(pattern); } - else if(key == '') { + else if(key == '\022') { use_regexp = !use_regexp; } - else if(key == '') { - int s = 0; - while(pattern[cursor_position + s]) { - pattern[s] = pattern[cursor_position + s]; - s++; - } - pattern[s] = '\0'; - cursor_position = 0; + else if(key == '\025') { + kill_before_cursor(pattern, &cursor_position); } - else if(key == ' ') { - pattern[cursor_position] = '\0'; + else if(key == '\013') { + kill_after_cursor(pattern, &cursor_position); } update_screen(¤t_line, &temporary_line, motion, nb_lines, lines, cursor_position, pattern); - } while(key != '\n' && key != KEY_ENTER && key != ''); + } while(key != '\n' && key != KEY_ENTER && key != '\007'); echo(); curs_set(1);