mirror of
https://github.com/zed-industries/zed.git
synced 2024-11-08 07:35:01 +03:00
WIP: Start on go to line
This commit is contained in:
parent
a743c2d8d7
commit
cea8107242
12
Cargo.lock
generated
12
Cargo.lock
generated
@ -2084,6 +2084,17 @@ dependencies = [
|
|||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "go_to_line"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"buffer",
|
||||||
|
"editor",
|
||||||
|
"gpui",
|
||||||
|
"postage",
|
||||||
|
"workspace",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gpui"
|
name = "gpui"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -5671,6 +5682,7 @@ dependencies = [
|
|||||||
"fsevent",
|
"fsevent",
|
||||||
"futures",
|
"futures",
|
||||||
"fuzzy",
|
"fuzzy",
|
||||||
|
"go_to_line",
|
||||||
"gpui",
|
"gpui",
|
||||||
"http-auth-basic",
|
"http-auth-basic",
|
||||||
"ignore",
|
"ignore",
|
||||||
|
@ -994,7 +994,7 @@ impl Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn select_ranges<I, T>(&mut self, ranges: I, autoscroll: bool, cx: &mut ViewContext<Self>)
|
pub fn select_ranges<I, T>(&mut self, ranges: I, autoscroll: bool, cx: &mut ViewContext<Self>)
|
||||||
where
|
where
|
||||||
I: IntoIterator<Item = Range<T>>,
|
I: IntoIterator<Item = Range<T>>,
|
||||||
T: ToOffset,
|
T: ToOffset,
|
||||||
@ -1013,8 +1013,8 @@ impl Editor {
|
|||||||
};
|
};
|
||||||
Selection {
|
Selection {
|
||||||
id: post_inc(&mut self.next_selection_id),
|
id: post_inc(&mut self.next_selection_id),
|
||||||
start: start,
|
start,
|
||||||
end: end,
|
end,
|
||||||
reversed,
|
reversed,
|
||||||
goal: SelectionGoal::None,
|
goal: SelectionGoal::None,
|
||||||
}
|
}
|
||||||
|
11
crates/go_to_line/Cargo.toml
Normal file
11
crates/go_to_line/Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "go_to_line"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
buffer = { path = "../buffer" }
|
||||||
|
editor = { path = "../editor" }
|
||||||
|
gpui = { path = "../gpui" }
|
||||||
|
workspace = { path = "../workspace" }
|
||||||
|
postage = { version = "0.4", features = ["futures-traits"] }
|
141
crates/go_to_line/src/lib.rs
Normal file
141
crates/go_to_line/src/lib.rs
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
use buffer::{Bias, Point};
|
||||||
|
use editor::{Editor, EditorSettings};
|
||||||
|
use gpui::{
|
||||||
|
action, elements::*, keymap::Binding, Entity, MutableAppContext, RenderContext, View,
|
||||||
|
ViewContext, ViewHandle,
|
||||||
|
};
|
||||||
|
use postage::watch;
|
||||||
|
use workspace::{Settings, Workspace};
|
||||||
|
|
||||||
|
action!(Toggle);
|
||||||
|
|
||||||
|
pub fn init(cx: &mut MutableAppContext) {
|
||||||
|
cx.add_bindings([
|
||||||
|
Binding::new("ctrl-g", Toggle, Some("Editor")),
|
||||||
|
Binding::new("escape", Toggle, Some("GoToLine")),
|
||||||
|
]);
|
||||||
|
cx.add_action(GoToLine::toggle);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct GoToLine {
|
||||||
|
settings: watch::Receiver<Settings>,
|
||||||
|
line_editor: ViewHandle<Editor>,
|
||||||
|
active_editor: ViewHandle<Editor>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Event {
|
||||||
|
Dismissed,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GoToLine {
|
||||||
|
pub fn new(
|
||||||
|
active_editor: ViewHandle<Editor>,
|
||||||
|
settings: watch::Receiver<Settings>,
|
||||||
|
cx: &mut ViewContext<Self>,
|
||||||
|
) -> Self {
|
||||||
|
let line_editor = cx.add_view(|cx| {
|
||||||
|
Editor::single_line(
|
||||||
|
{
|
||||||
|
let settings = settings.clone();
|
||||||
|
move |_| {
|
||||||
|
let settings = settings.borrow();
|
||||||
|
EditorSettings {
|
||||||
|
tab_size: settings.tab_size,
|
||||||
|
style: settings.theme.editor.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
cx.subscribe(&line_editor, Self::on_line_editor_event)
|
||||||
|
.detach();
|
||||||
|
Self {
|
||||||
|
settings: settings.clone(),
|
||||||
|
line_editor,
|
||||||
|
active_editor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle(workspace: &mut Workspace, _: &Toggle, cx: &mut ViewContext<Workspace>) {
|
||||||
|
workspace.toggle_modal(cx, |cx, workspace| {
|
||||||
|
let editor = workspace
|
||||||
|
.active_item(cx)
|
||||||
|
.unwrap()
|
||||||
|
.to_any()
|
||||||
|
.downcast::<Editor>()
|
||||||
|
.unwrap();
|
||||||
|
let view = cx.add_view(|cx| GoToLine::new(editor, workspace.settings.clone(), cx));
|
||||||
|
cx.subscribe(&view, Self::on_event).detach();
|
||||||
|
view
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_event(
|
||||||
|
workspace: &mut Workspace,
|
||||||
|
_: ViewHandle<Self>,
|
||||||
|
event: &Event,
|
||||||
|
cx: &mut ViewContext<Workspace>,
|
||||||
|
) {
|
||||||
|
match event {
|
||||||
|
Event::Dismissed => workspace.dismiss_modal(cx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_line_editor_event(
|
||||||
|
&mut self,
|
||||||
|
_: ViewHandle<Editor>,
|
||||||
|
event: &editor::Event,
|
||||||
|
cx: &mut ViewContext<Self>,
|
||||||
|
) {
|
||||||
|
match event {
|
||||||
|
editor::Event::Blurred => cx.emit(Event::Dismissed),
|
||||||
|
editor::Event::Edited => {
|
||||||
|
let line_editor = self.line_editor.read(cx).buffer().read(cx).text();
|
||||||
|
let mut components = line_editor.trim().split(':');
|
||||||
|
let row = components.next().and_then(|row| row.parse::<u32>().ok());
|
||||||
|
let column = components.next().and_then(|row| row.parse::<u32>().ok());
|
||||||
|
if let Some(point) = row.map(|row| Point::new(row, column.unwrap_or(0))) {
|
||||||
|
self.active_editor.update(cx, |active_editor, cx| {
|
||||||
|
let point = active_editor
|
||||||
|
.buffer()
|
||||||
|
.read(cx)
|
||||||
|
.clip_point(point, Bias::Left);
|
||||||
|
active_editor.select_ranges([point..point], true, cx);
|
||||||
|
});
|
||||||
|
cx.notify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Entity for GoToLine {
|
||||||
|
type Event = Event;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl View for GoToLine {
|
||||||
|
fn ui_name() -> &'static str {
|
||||||
|
"GoToLine"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render(&mut self, cx: &mut RenderContext<Self>) -> ElementBox {
|
||||||
|
Align::new(
|
||||||
|
ConstrainedBox::new(
|
||||||
|
Container::new(ChildView::new(self.line_editor.id()).boxed()).boxed(),
|
||||||
|
)
|
||||||
|
.with_max_width(500.0)
|
||||||
|
.with_max_height(420.0)
|
||||||
|
.boxed(),
|
||||||
|
)
|
||||||
|
.top()
|
||||||
|
.named("go to line")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_focus(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
|
cx.focus(&self.line_editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_blur(&mut self, _: &mut ViewContext<Self>) {}
|
||||||
|
}
|
@ -36,6 +36,7 @@ fsevent = { path = "../fsevent" }
|
|||||||
fuzzy = { path = "../fuzzy" }
|
fuzzy = { path = "../fuzzy" }
|
||||||
editor = { path = "../editor" }
|
editor = { path = "../editor" }
|
||||||
file_finder = { path = "../file_finder" }
|
file_finder = { path = "../file_finder" }
|
||||||
|
go_to_line = { path = "../go_to_line" }
|
||||||
gpui = { path = "../gpui" }
|
gpui = { path = "../gpui" }
|
||||||
language = { path = "../language" }
|
language = { path = "../language" }
|
||||||
lsp = { path = "../lsp" }
|
lsp = { path = "../lsp" }
|
||||||
|
@ -38,6 +38,7 @@ fn main() {
|
|||||||
client::init(client.clone(), cx);
|
client::init(client.clone(), cx);
|
||||||
workspace::init(cx);
|
workspace::init(cx);
|
||||||
editor::init(cx, &mut entry_openers);
|
editor::init(cx, &mut entry_openers);
|
||||||
|
go_to_line::init(cx);
|
||||||
file_finder::init(cx);
|
file_finder::init(cx);
|
||||||
people_panel::init(cx);
|
people_panel::init(cx);
|
||||||
chat_panel::init(cx);
|
chat_panel::init(cx);
|
||||||
|
Loading…
Reference in New Issue
Block a user