Implement TextObject::Search
This commit is contained in:
parent
bab94a7823
commit
abf58279be
1 changed files with 25 additions and 7 deletions
|
|
@ -42,14 +42,14 @@ fn finish_change<E: Edit>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn search<E: Edit>(editor: &mut E, search: &str, forwards: bool) {
|
fn search<E: Edit>(editor: &mut E, value: &str, forwards: bool) -> bool {
|
||||||
let mut cursor = editor.cursor();
|
let mut cursor = editor.cursor();
|
||||||
let start_line = cursor.line;
|
let start_line = cursor.line;
|
||||||
if forwards {
|
if forwards {
|
||||||
while cursor.line < editor.buffer().lines.len() {
|
while cursor.line < editor.buffer().lines.len() {
|
||||||
if let Some(index) = editor.buffer().lines[cursor.line]
|
if let Some(index) = editor.buffer().lines[cursor.line]
|
||||||
.text()
|
.text()
|
||||||
.match_indices(search)
|
.match_indices(value)
|
||||||
.filter_map(|(i, _)| {
|
.filter_map(|(i, _)| {
|
||||||
if cursor.line != start_line || i > cursor.index {
|
if cursor.line != start_line || i > cursor.index {
|
||||||
Some(i)
|
Some(i)
|
||||||
|
|
@ -61,7 +61,7 @@ fn search<E: Edit>(editor: &mut E, search: &str, forwards: bool) {
|
||||||
{
|
{
|
||||||
cursor.index = index;
|
cursor.index = index;
|
||||||
editor.set_cursor(cursor);
|
editor.set_cursor(cursor);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cursor.line += 1;
|
cursor.line += 1;
|
||||||
|
|
@ -73,7 +73,7 @@ fn search<E: Edit>(editor: &mut E, search: &str, forwards: bool) {
|
||||||
|
|
||||||
if let Some(index) = editor.buffer().lines[cursor.line]
|
if let Some(index) = editor.buffer().lines[cursor.line]
|
||||||
.text()
|
.text()
|
||||||
.rmatch_indices(search)
|
.rmatch_indices(value)
|
||||||
.filter_map(|(i, _)| {
|
.filter_map(|(i, _)| {
|
||||||
if cursor.line != start_line || i < cursor.index {
|
if cursor.line != start_line || i < cursor.index {
|
||||||
Some(i)
|
Some(i)
|
||||||
|
|
@ -85,10 +85,11 @@ fn search<E: Edit>(editor: &mut E, search: &str, forwards: bool) {
|
||||||
{
|
{
|
||||||
cursor.index = index;
|
cursor.index = index;
|
||||||
editor.set_cursor(cursor);
|
editor.set_cursor(cursor);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn select_in<E: Edit>(editor: &mut E, start_c: char, end_c: char, include: bool) {
|
fn select_in<E: Edit>(editor: &mut E, start_c: char, end_c: char, include: bool) {
|
||||||
|
|
@ -313,9 +314,12 @@ impl<'a> Edit for ViEditor<'a> {
|
||||||
|
|
||||||
let editor = &mut self.editor;
|
let editor = &mut self.editor;
|
||||||
|
|
||||||
|
// Ensure a change is always started
|
||||||
|
editor.start_change();
|
||||||
|
|
||||||
if self.passthrough {
|
if self.passthrough {
|
||||||
editor.start_change();
|
|
||||||
editor.action(font_system, action);
|
editor.action(font_system, action);
|
||||||
|
// Always finish change when passing through (TODO: group changes)
|
||||||
finish_change(editor, &mut self.commands, &mut self.changed);
|
finish_change(editor, &mut self.commands, &mut self.changed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -339,8 +343,8 @@ impl<'a> Edit for ViEditor<'a> {
|
||||||
Action::Up => Key::Up,
|
Action::Up => Key::Up,
|
||||||
_ => {
|
_ => {
|
||||||
log::info!("pass through action {:?}", action);
|
log::info!("pass through action {:?}", action);
|
||||||
editor.start_change();
|
|
||||||
editor.action(font_system, action);
|
editor.action(font_system, action);
|
||||||
|
// Always finish change when passing through (TODO: group changes)
|
||||||
finish_change(editor, &mut self.commands, &mut self.changed);
|
finish_change(editor, &mut self.commands, &mut self.changed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -393,6 +397,20 @@ impl<'a> Edit for ViEditor<'a> {
|
||||||
TextObject::CurlyBrackets => select_in(editor, '{', '}', include),
|
TextObject::CurlyBrackets => select_in(editor, '{', '}', include),
|
||||||
TextObject::DoubleQuotes => select_in(editor, '"', '"', include),
|
TextObject::DoubleQuotes => select_in(editor, '"', '"', include),
|
||||||
TextObject::Parentheses => select_in(editor, '(', ')', include),
|
TextObject::Parentheses => select_in(editor, '(', ')', include),
|
||||||
|
TextObject::Search { forwards } => {
|
||||||
|
match &self.search_opt {
|
||||||
|
Some((value, _)) => {
|
||||||
|
if search(editor, value, forwards) {
|
||||||
|
let mut cursor = editor.cursor();
|
||||||
|
editor.set_select_opt(Some(cursor));
|
||||||
|
//TODO: traverse lines if necessary
|
||||||
|
cursor.index += value.len();
|
||||||
|
editor.set_cursor(cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
TextObject::SingleQuotes => select_in(editor, '\'', '\'', include),
|
TextObject::SingleQuotes => select_in(editor, '\'', '\'', include),
|
||||||
TextObject::SquareBrackets => select_in(editor, '[', ']', include),
|
TextObject::SquareBrackets => select_in(editor, '[', ']', include),
|
||||||
TextObject::Ticks => select_in(editor, '`', '`', include),
|
TextObject::Ticks => select_in(editor, '`', '`', include),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue