forked from helix-editor/helix
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
transition to nucleo for fuzzy matching (helix-editor#7814)
* transition to nucleo for fuzzy matching * drop flakey test case since the picker streams in results now any test that relies on the picker containing results is potentially flakely * use crates.io version of nucleo * Fix typo in commands.rs Co-authored-by: Skyler Hawthorne <[email protected]> --------- Co-authored-by: Skyler Hawthorne <[email protected]>
- Loading branch information
1 parent
40d7e6c
commit 0cb595e
Showing
26 changed files
with
757 additions
and
1,052 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
use std::ops::DerefMut; | ||
|
||
use nucleo::pattern::{AtomKind, CaseMatching, Pattern}; | ||
use nucleo::Config; | ||
use parking_lot::Mutex; | ||
|
||
pub struct LazyMutex<T> { | ||
inner: Mutex<Option<T>>, | ||
init: fn() -> T, | ||
} | ||
|
||
impl<T> LazyMutex<T> { | ||
pub const fn new(init: fn() -> T) -> Self { | ||
Self { | ||
inner: Mutex::new(None), | ||
init, | ||
} | ||
} | ||
|
||
pub fn lock(&self) -> impl DerefMut<Target = T> + '_ { | ||
parking_lot::MutexGuard::map(self.inner.lock(), |val| val.get_or_insert_with(self.init)) | ||
} | ||
} | ||
|
||
pub static MATCHER: LazyMutex<nucleo::Matcher> = LazyMutex::new(nucleo::Matcher::default); | ||
|
||
/// convenience function to easily fuzzy match | ||
/// on a (relatively small list of inputs). This is not recommended for building a full tui | ||
/// application that can match large numbers of matches as all matching is done on the current | ||
/// thread, effectively blocking the UI | ||
pub fn fuzzy_match<T: AsRef<str>>( | ||
pattern: &str, | ||
items: impl IntoIterator<Item = T>, | ||
path: bool, | ||
) -> Vec<(T, u32)> { | ||
let mut matcher = MATCHER.lock(); | ||
matcher.config = Config::DEFAULT; | ||
if path { | ||
matcher.config.set_match_paths(); | ||
} | ||
let pattern = Pattern::new(pattern, CaseMatching::Smart, AtomKind::Fuzzy); | ||
pattern.match_list(items, &mut matcher) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
[package] | ||
name = "helix-event" | ||
version = "0.6.0" | ||
authors = ["Blaž Hrastnik <[email protected]>"] | ||
edition = "2021" | ||
license = "MPL-2.0" | ||
categories = ["editor"] | ||
repository = "https://github.com/helix-editor/helix" | ||
homepage = "https://helix-editor.com" | ||
|
||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||
|
||
[dependencies] | ||
tokio = { version = "1", features = ["rt", "rt-multi-thread", "time", "sync", "parking_lot"] } | ||
parking_lot = { version = "0.12", features = ["send_guard"] } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
//! `helix-event` contains systems that allow (often async) communication between | ||
//! different editor components without strongly coupling them. Currently this | ||
//! crate only contains some smaller facilities but the intend is to add more | ||
//! functionality in the future ( like a generic hook system) | ||
pub use redraw::{lock_frame, redraw_requested, request_redraw, start_frame, RenderLockGuard}; | ||
|
||
mod redraw; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
//! Signals that control when/if the editor redraws | ||
use std::future::Future; | ||
|
||
use parking_lot::{RwLock, RwLockReadGuard}; | ||
use tokio::sync::Notify; | ||
|
||
/// A `Notify` instance that can be used to (asynchronously) request | ||
/// the editor the render a new frame. | ||
static REDRAW_NOTIFY: Notify = Notify::const_new(); | ||
|
||
/// A `RwLock` that prevents the next frame from being | ||
/// drawn until an exclusive (write) lock can be acquired. | ||
/// This allows asynchsonous tasks to acquire `non-exclusive` | ||
/// locks (read) to prevent the next frame from being drawn | ||
/// until a certain computation has finished. | ||
static RENDER_LOCK: RwLock<()> = RwLock::new(()); | ||
|
||
pub type RenderLockGuard = RwLockReadGuard<'static, ()>; | ||
|
||
/// Requests that the editor is redrawn. The redraws are debounced (currently to | ||
/// 30FPS) so this can be called many times without causing a ton of frames to | ||
/// be rendered. | ||
pub fn request_redraw() { | ||
REDRAW_NOTIFY.notify_one(); | ||
} | ||
|
||
/// Returns a future that will yield once a redraw has been asynchronously | ||
/// requested using [`request_redraw`]. | ||
pub fn redraw_requested() -> impl Future<Output = ()> { | ||
REDRAW_NOTIFY.notified() | ||
} | ||
|
||
/// Wait until all locks acquired with [`lock_frame`] have been released. | ||
/// This function is called before rendering and is intended to allow the frame | ||
/// to wait for async computations that should be included in the current frame. | ||
pub fn start_frame() { | ||
drop(RENDER_LOCK.write()); | ||
// exhaust any leftover redraw notifications | ||
let notify = REDRAW_NOTIFY.notified(); | ||
tokio::pin!(notify); | ||
notify.enable(); | ||
} | ||
|
||
/// Acquires the render lock which will prevent the next frame from being drawn | ||
/// until the returned guard is dropped. | ||
pub fn lock_frame() -> RenderLockGuard { | ||
RENDER_LOCK.read() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.