mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01: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 })
|
||||
}
|
||||
|
||||
pub(super) fn arrow(&self, files: &Files, cursor: usize, prev: bool) -> Option<isize> {
|
||||
if prev {
|
||||
files
|
||||
.iter()
|
||||
.take(cursor)
|
||||
.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)
|
||||
pub(super) fn prev(&self, files: &Files, cursor: usize, include: bool) -> Option<isize> {
|
||||
for i in !include as usize..files.len() {
|
||||
let idx = (cursor + files.len() - i) % files.len();
|
||||
if files[idx].name().is_some_and(|n| self.matches(n)) {
|
||||
return Some(idx as isize - cursor as isize);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub(super) fn ring(&self, files: &Files, cursor: usize, prev: bool) -> Option<isize> {
|
||||
if prev {
|
||||
files
|
||||
.iter()
|
||||
.take(cursor + 1)
|
||||
.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)
|
||||
})
|
||||
pub(super) fn next(&self, files: &Files, cursor: usize, include: bool) -> Option<isize> {
|
||||
for i in !include as usize..files.len() {
|
||||
let idx = (cursor + i) % files.len();
|
||||
if files[idx].name().is_some_and(|n| self.matches(n)) {
|
||||
return Some(idx as isize - cursor as isize);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub(super) fn catchup(&mut self, files: &Files) -> bool {
|
||||
|
|
|
|||
|
|
@ -243,7 +243,13 @@ impl Tab {
|
|||
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());
|
||||
}
|
||||
|
||||
|
|
@ -274,12 +280,14 @@ impl Tab {
|
|||
return false;
|
||||
};
|
||||
|
||||
let mut b = finder.catchup(&self.current.files);
|
||||
if let Some(step) = finder.arrow(&self.current.files, self.current.cursor(), prev) {
|
||||
b |= self.arrow(step.into());
|
||||
}
|
||||
let b = finder.catchup(&self.current.files);
|
||||
let step = if prev {
|
||||
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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue