дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-09 19:25:54 +02:00
Adds API 1.3 `events.subscribe-paths(kind, globs)` for `file-opened` and `file-saved`: project-relative globs checked before an event is queued or wakes an idle plugin, and again before a queued event is delivered. A new filter replaces the old one atomically; `subscribe` restores unfiltered delivery; filters survive idle reclamation. Also `workspace.project-of(path)`, the most specific open project containing a document (reading it still needs `project.read`). Closes #1958. Co-authored-by: arnaud-ritti <[email protected]>
48 рядки
2.0 KiB
Rust
48 рядки
2.0 KiB
Rust
use openidea_plugin::hover::{Document, Hover, HoverProvider};
|
|
use openidea_plugin::{Context, Error, Event, EventKind, Invocation, Plugin, Position, host, register_plugin};
|
|
|
|
#[derive(Default)]
|
|
struct Fixture;
|
|
|
|
impl Plugin for Fixture {
|
|
fn activate(&mut self, _: &Context) -> Result<(), Error> {
|
|
// Persist the chosen filter so reactivation does not overwrite it.
|
|
let glob = host::storage::get("filter")?.unwrap_or_else(|| "config/*.yaml".into());
|
|
let globs: Vec<_> = glob.lines().collect();
|
|
let _ = host::subscribe_paths("file-opened", &globs);
|
|
let _ = host::subscribe_paths("file-saved", &["config/*.yaml"]);
|
|
Ok(())
|
|
}
|
|
fn run_command(&mut self, id: &str, _: &Invocation, arg: Option<&str>) -> Result<Option<String>, Error> {
|
|
match id {
|
|
"project" => host::project_of(arg.unwrap_or_default()).map(|p| p.root()).transpose(),
|
|
"filter" => {
|
|
let glob = arg.unwrap_or_default();
|
|
host::subscribe_paths("file-opened", &glob.lines().collect::<Vec<_>>())?;
|
|
host::storage::set("filter", glob)?;
|
|
Ok(None)
|
|
}
|
|
"all" => {
|
|
host::subscribe(EventKind::FileOpened)?;
|
|
Ok(None)
|
|
}
|
|
"off" => {
|
|
host::unsubscribe(EventKind::FileOpened);
|
|
Ok(None)
|
|
}
|
|
"count" => Ok(host::storage::get("count")?),
|
|
_ => Err(Error::NotFound(id.into())),
|
|
}
|
|
}
|
|
fn handle_events(&mut self, events: &[Event], _: &Invocation) {
|
|
let count = host::storage::get("count").ok().flatten().and_then(|n| n.parse::<usize>().ok()).unwrap_or(0);
|
|
host::storage::set("count", &(count + events.len()).to_string()).unwrap();
|
|
}
|
|
}
|
|
impl HoverProvider for Fixture {
|
|
fn hover(&mut self, doc: &Document, _: Position) -> Option<Hover> {
|
|
Some(Hover::new(host::project_of(&doc.path)?.root().ok()?))
|
|
}
|
|
}
|
|
register_plugin!(Fixture, hover);
|