use super::buffer::VimEditor;
impl VimEditor {
pub fn start_search(&mut self, forward: bool) {
self.search.active = true;
self.search.forward = forward;
self.search.input_buffer.clear();
}
pub fn commit_search(&mut self) {
self.search.active = false;
self.search.pattern = self.search.input_buffer.clone();
if !self.search.pattern.is_empty() {
self.jump_to_next_match();
}
}
pub fn cancel_search(&mut self) {
self.search.active = false;
self.search.input_buffer.clear();
}
pub fn jump_to_next_match(&mut self) {
if self.search.pattern.is_empty() {
return;
}
let pattern = self.search.pattern.to_lowercase();
if self.search.forward {
self.find_forward(&pattern);
} else {
self.find_backward(&pattern);
}
}
pub fn jump_to_prev_match(&mut self) {
if self.search.pattern.is_empty() {
return;
}
let pattern = self.search.pattern.to_lowercase();
if self.search.forward {
self.find_backward(&pattern);
} else {
self.find_forward(&pattern);
}
}
fn find_forward(&mut self, pattern: &str) {
let total = self.lines.len();
let start_col = self.cursor_col + 1;
let line_lower = self.lines[self.cursor_row].to_lowercase();
if let Some(pos) = line_lower[start_col.min(line_lower.len())..].find(pattern) {
self.cursor_col = start_col.min(line_lower.len()) + pos;
self.ensure_cursor_visible();
return;
}
for offset in 1..=total {
let row = (self.cursor_row + offset) % total;
let line_lower = self.lines[row].to_lowercase();
if let Some(pos) = line_lower.find(pattern) {
self.cursor_row = row;
self.cursor_col = pos;
self.ensure_cursor_visible();
return;
}
}
}
fn find_backward(&mut self, pattern: &str) {
let total = self.lines.len();
if self.cursor_col > 0 {
let line_lower = self.lines[self.cursor_row].to_lowercase();
let search_area = &line_lower[..self.cursor_col.min(line_lower.len())];
if let Some(pos) = search_area.rfind(pattern) {
self.cursor_col = pos;
self.ensure_cursor_visible();
return;
}
}
for offset in 1..=total {
let row = (self.cursor_row + total - offset) % total;
let line_lower = self.lines[row].to_lowercase();
if let Some(pos) = line_lower.rfind(pattern) {
self.cursor_row = row;
self.cursor_col = pos;
self.ensure_cursor_visible();
return;
}
}
}
}