mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: loop through to find (#234)
This commit is contained in:
parent
b2d3e39e96
commit
73b9c62944
2 changed files with 28 additions and 55 deletions
|
|
@ -17,59 +17,24 @@ impl Finder {
|
||||||
Ok(Self { query: Regex::new(s)?, matched: Default::default(), version: 0 })
|
Ok(Self { query: Regex::new(s)?, matched: Default::default(), version: 0 })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn arrow(&self, files: &Files, cursor: usize, prev: bool) -> Option<isize> {
|
pub(super) fn prev(&self, files: &Files, cursor: usize, include: bool) -> Option<isize> {
|
||||||
if prev {
|
for i in !include as usize..files.len() {
|
||||||
files
|
let idx = (cursor + files.len() - i) % files.len();
|
||||||
.iter()
|
if files[idx].name().is_some_and(|n| self.matches(n)) {
|
||||||
.take(cursor)
|
return Some(idx as isize - cursor as isize);
|
||||||
.rev()
|
}
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| -(i as isize) - 1)
|
|
||||||
} else {
|
|
||||||
files
|
|
||||||
.iter()
|
|
||||||
.skip(cursor + 1)
|
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| i as isize + 1)
|
|
||||||
}
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn ring(&self, files: &Files, cursor: usize, prev: bool) -> Option<isize> {
|
pub(super) fn next(&self, files: &Files, cursor: usize, include: bool) -> Option<isize> {
|
||||||
if prev {
|
for i in !include as usize..files.len() {
|
||||||
files
|
let idx = (cursor + i) % files.len();
|
||||||
.iter()
|
if files[idx].name().is_some_and(|n| self.matches(n)) {
|
||||||
.take(cursor + 1)
|
return Some(idx as isize - cursor as isize);
|
||||||
.rev()
|
}
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| -(i as isize))
|
|
||||||
.or_else(|| {
|
|
||||||
files
|
|
||||||
.iter()
|
|
||||||
.skip(cursor + 1)
|
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| i as isize + 1)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
files
|
|
||||||
.iter()
|
|
||||||
.skip(cursor)
|
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| i as isize)
|
|
||||||
.or_else(|| {
|
|
||||||
files
|
|
||||||
.iter()
|
|
||||||
.take(cursor)
|
|
||||||
.rev()
|
|
||||||
.enumerate()
|
|
||||||
.find(|(_, f)| f.name().map_or(false, |n| self.matches(n)))
|
|
||||||
.map(|(i, _)| -(i as isize) - 1)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn catchup(&mut self, files: &Files) -> bool {
|
pub(super) fn catchup(&mut self, files: &Files) -> bool {
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,13 @@ impl Tab {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(step) = finder.ring(&self.current.files, self.current.cursor(), prev) {
|
let step = if prev {
|
||||||
|
finder.prev(&self.current.files, self.current.cursor(), true)
|
||||||
|
} else {
|
||||||
|
finder.next(&self.current.files, self.current.cursor(), true)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(step) = step {
|
||||||
self.arrow(step.into());
|
self.arrow(step.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -274,12 +280,14 @@ impl Tab {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut b = finder.catchup(&self.current.files);
|
let b = finder.catchup(&self.current.files);
|
||||||
if let Some(step) = finder.arrow(&self.current.files, self.current.cursor(), prev) {
|
let step = if prev {
|
||||||
b |= self.arrow(step.into());
|
finder.prev(&self.current.files, self.current.cursor(), false)
|
||||||
}
|
} else {
|
||||||
|
finder.next(&self.current.files, self.current.cursor(), false)
|
||||||
|
};
|
||||||
|
|
||||||
b
|
b | step.is_some_and(|s| self.arrow(s.into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn search(&mut self, grep: bool) -> bool {
|
pub fn search(&mut self, grep: bool) -> bool {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue