Basic incremental search
This commit is contained in:
parent
6efb73ff2b
commit
0d3ed442e4
@ -161,7 +161,7 @@ impl Editor {
|
||||
|
||||
fn save(&mut self) {
|
||||
if self.document.file_name.is_none() {
|
||||
let new_name = self.prompt("Save as: ").unwrap_or(None);
|
||||
let new_name = self.prompt("Save as: ", |_,_,_| {}).unwrap_or(None);
|
||||
if new_name.is_none() {
|
||||
self.status_message = StatusMessage::from("Save aborted.");
|
||||
return;
|
||||
@ -196,7 +196,15 @@ impl Editor {
|
||||
},
|
||||
Key::Ctrl('s') => self.save(),
|
||||
Key::Ctrl('f') => {
|
||||
if let Some(query) = self.prompt("Search: ").unwrap_or(None) {
|
||||
if let Some(query) = self
|
||||
.prompt("Search: ", |editor, _, query| {
|
||||
if let Some(position) = editor.document.find(&query) {
|
||||
editor.cursor_position = position;
|
||||
editor.scroll();
|
||||
}
|
||||
})
|
||||
.unwrap_or(None)
|
||||
{
|
||||
if let Some(position) = self.document.find(&query[..]) {
|
||||
self.cursor_position = position;
|
||||
} else {
|
||||
@ -237,14 +245,18 @@ impl Editor {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn prompt(&mut self, prompt: &str) -> Result<Option<String>, std::io::Error> {
|
||||
fn prompt<C>(&mut self, prompt: &str, callback: C) -> Result<Option<String>, std::io::Error>
|
||||
where
|
||||
C: Fn(&mut Self, Key, &String),
|
||||
{
|
||||
let mut result = String::new();
|
||||
|
||||
loop {
|
||||
self.status_message = StatusMessage::from(format!("{}{}", prompt, result));
|
||||
self.refresh_screen()?;
|
||||
|
||||
match Terminal::read_key()? {
|
||||
let key = Terminal::read_key()?;
|
||||
match key {
|
||||
Key::Backspace => result.truncate(result.len().saturating_sub(1)),
|
||||
Key::Char('\n') => break,
|
||||
Key::Char(c) => {
|
||||
@ -258,6 +270,8 @@ impl Editor {
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
||||
callback(self, key, &result);
|
||||
}
|
||||
|
||||
self.status_message = StatusMessage::default();
|
||||
|
Loading…
Reference in New Issue
Block a user