Implement find and replace

This commit is contained in:
Matúš Púll 2025-04-17 18:48:22 +02:00
parent 3b872f4ad7
commit 0497e5993d

View file

@ -24,6 +24,7 @@ position cur = {0, 0};
count_type file_offset = 0; count_type file_offset = 0;
position clp; position clp;
treap selection; treap selection;
string last_find, last_replace;
// Accessing the file // Accessing the file
string get_line(count_type r, bool substitute_tab = true) { string get_line(count_type r, bool substitute_tab = true) {
@ -251,6 +252,27 @@ void jump(position p) {
cur.c = p.c; cur.c = p.c;
} }
// Find next string appearance
position find(string text) {
count_type len = text.size();
count_type file_size = file.size();
for(count_type _r = 0; _r < file_size; ++_r) {
count_type r = (file_offset + cur.r + _r) % file_size;
count_type start = ((_r == 0) ? (cur.c+1) : 0);
count_type pos = get_line(r, 0).find(text, start);
if(pos != string::npos)
return {r, pos};
}
return cur;
}
// Replace string appearance
void replace(position p, count_type length, string text) {
remove(p, length);
insert(p, text);
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// Check valid filename and load // Check valid filename and load
@ -308,6 +330,20 @@ int main(int argc, char* argv[]) {
mode = SELECT; mode = SELECT;
clp = cur + file_offset; clp = cur + file_offset;
break; break;
case 'f':
last_find = get_string("to find");
case 'n':
jump(find(last_find));
print_file(file_offset + cur.r);
break;
case 's':
last_find = get_string("to find");
last_replace = get_string("to replace");
case 'r':
jump(find(last_find));
replace(cur + file_offset, last_find.size(), last_replace);
print_file(file_offset + cur.r);
break;
case 'p': case 'p':
paste_selection(cur + file_offset); paste_selection(cur + file_offset);
print_file(file_offset + cur.r); print_file(file_offset + cur.r);