diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 4b75627ef3..857b33f625 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -940,9 +940,15 @@ impl Editor { _: &workspace::OpenNew, cx: &mut ViewContext, ) { - let buffer = cx - .add_model(|cx| Buffer::new(0, "", cx).with_language(language::PLAIN_TEXT.clone(), cx)); - workspace.open_item(BufferItemHandle(buffer), cx); + let project = workspace.project(); + if project.read(cx).is_remote() { + cx.propagate_action(); + } else if let Some(buffer) = project + .update(cx, |project, cx| project.create_buffer(cx)) + .log_err() + { + workspace.open_item(BufferItemHandle(buffer), cx); + } } pub fn replica_id(&self, cx: &AppContext) -> ReplicaId { diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index fce2068302..5f3eb2caaf 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -524,6 +524,8 @@ impl LanguageServer { ServerCapabilities { document_highlight_provider: Some(OneOf::Left(true)), code_action_provider: Some(CodeActionProviderCapability::Simple(true)), + document_formatting_provider: Some(OneOf::Left(true)), + document_range_formatting_provider: Some(OneOf::Left(true)), ..Default::default() } } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 2ca1a7ce88..6dda03c216 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -715,6 +715,18 @@ impl Project { !self.is_local() } + pub fn create_buffer(&mut self, cx: &mut ModelContext) -> Result> { + if self.is_remote() { + return Err(anyhow!("creating buffers as a guest is not supported yet")); + } + + let buffer = cx.add_model(|cx| { + Buffer::new(self.replica_id(), "", cx).with_language(language::PLAIN_TEXT.clone(), cx) + }); + self.register_buffer(&buffer, None, cx)?; + Ok(buffer) + } + pub fn open_buffer( &mut self, path: impl Into, @@ -1342,15 +1354,47 @@ impl Project { } for (buffer, buffer_abs_path, lang_server) in local_buffers { - let lsp_edits = lang_server - .request::(lsp::DocumentFormattingParams { - text_document: lsp::TextDocumentIdentifier::new( - lsp::Url::from_file_path(&buffer_abs_path).unwrap(), - ), - options: Default::default(), - work_done_progress_params: Default::default(), - }) - .await?; + let capabilities = if let Some(capabilities) = lang_server.capabilities().await { + capabilities + } else { + continue; + }; + + let text_document = lsp::TextDocumentIdentifier::new( + lsp::Url::from_file_path(&buffer_abs_path).unwrap(), + ); + let lsp_edits = if capabilities + .document_formatting_provider + .map_or(false, |provider| provider != lsp::OneOf::Left(false)) + { + lang_server + .request::(lsp::DocumentFormattingParams { + text_document, + options: Default::default(), + work_done_progress_params: Default::default(), + }) + .await? + } else if capabilities + .document_range_formatting_provider + .map_or(false, |provider| provider != lsp::OneOf::Left(false)) + { + let buffer_start = lsp::Position::new(0, 0); + let buffer_end = buffer + .read_with(&cx, |buffer, _| buffer.max_point_utf16()) + .to_lsp_position(); + lang_server + .request::( + lsp::DocumentRangeFormattingParams { + text_document, + range: lsp::Range::new(buffer_start, buffer_end), + options: Default::default(), + work_done_progress_params: Default::default(), + }, + ) + .await? + } else { + continue; + }; if let Some(lsp_edits) = lsp_edits { let edits = buffer @@ -4128,6 +4172,48 @@ mod tests { assert_eq!(new_text, buffer.read_with(cx, |buffer, _| buffer.text())); } + #[gpui::test] + async fn test_save_as(cx: &mut gpui::TestAppContext) { + let fs = FakeFs::new(cx.background()); + fs.insert_tree("/dir", json!({})).await; + + let project = Project::test(fs.clone(), cx); + let (worktree, _) = project + .update(cx, |project, cx| { + project.find_or_create_local_worktree("/dir", true, cx) + }) + .await + .unwrap(); + let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id()); + + let buffer = project.update(cx, |project, cx| project.create_buffer(cx).unwrap()); + buffer.update(cx, |buffer, cx| { + buffer.edit([0..0], "abc", cx); + assert!(buffer.is_dirty()); + assert!(!buffer.has_conflict()); + }); + project + .update(cx, |project, cx| { + project.save_buffer_as(buffer.clone(), "/dir/file1".into(), cx) + }) + .await + .unwrap(); + assert_eq!(fs.load(Path::new("/dir/file1")).await.unwrap(), "abc"); + buffer.read_with(cx, |buffer, cx| { + assert_eq!(buffer.file().unwrap().full_path(cx), Path::new("dir/file1")); + assert!(!buffer.is_dirty()); + assert!(!buffer.has_conflict()); + }); + + let opened_buffer = project + .update(cx, |project, cx| { + project.open_buffer((worktree_id, "file1"), cx) + }) + .await + .unwrap(); + assert_eq!(opened_buffer, buffer); + } + #[gpui::test(retries = 5)] async fn test_rescan_and_remote_updates(cx: &mut gpui::TestAppContext) { let dir = temp_tree(json!({ diff --git a/crates/text/src/rope.rs b/crates/text/src/rope.rs index 3d1cb28eb1..ce666968b2 100644 --- a/crates/text/src/rope.rs +++ b/crates/text/src/rope.rs @@ -126,6 +126,10 @@ impl Rope { self.chunks.extent(&()) } + pub fn max_point_utf16(&self) -> PointUtf16 { + self.chunks.extent(&()) + } + pub fn cursor(&self, offset: usize) -> Cursor { Cursor::new(self, offset) } diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 95441a1208..89943777e0 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -1526,6 +1526,10 @@ impl BufferSnapshot { self.visible_text.max_point() } + pub fn max_point_utf16(&self) -> PointUtf16 { + self.visible_text.max_point_utf16() + } + pub fn point_to_offset(&self, point: Point) -> usize { self.visible_text.point_to_offset(point) } diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-bold.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-bold.ttf deleted file mode 100644 index 4db0387f74..0000000000 Binary files a/crates/zed/assets/fonts/zed-mono/zed-mono-bold.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-bolditalic.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-bolditalic.ttf deleted file mode 100644 index 311427a7bc..0000000000 Binary files a/crates/zed/assets/fonts/zed-mono/zed-mono-bolditalic.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-extended.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-extended.ttf new file mode 100644 index 0000000000..1cab6121aa Binary files /dev/null and b/crates/zed/assets/fonts/zed-mono/zed-mono-extended.ttf differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbold.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbold.ttf new file mode 100644 index 0000000000..5c027864e0 Binary files /dev/null and b/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbold.ttf differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbolditalic.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbolditalic.ttf new file mode 100644 index 0000000000..47a3a9bc27 Binary files /dev/null and b/crates/zed/assets/fonts/zed-mono/zed-mono-extendedbolditalic.ttf differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-extendeditalic.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-extendeditalic.ttf new file mode 100644 index 0000000000..85ff2c3c4a Binary files /dev/null and b/crates/zed/assets/fonts/zed-mono/zed-mono-extendeditalic.ttf differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-italic.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-italic.ttf deleted file mode 100644 index 2c97a2d705..0000000000 Binary files a/crates/zed/assets/fonts/zed-mono/zed-mono-italic.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-mono/zed-mono-regular.ttf b/crates/zed/assets/fonts/zed-mono/zed-mono-regular.ttf deleted file mode 100644 index 4c6733e2a5..0000000000 Binary files a/crates/zed/assets/fonts/zed-mono/zed-mono-regular.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-bold.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-bold.ttf deleted file mode 100644 index a4ed560d5a..0000000000 Binary files a/crates/zed/assets/fonts/zed-sans/zed-sans-bold.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-bolditalic.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-bolditalic.ttf deleted file mode 100644 index 83cc0c2a4b..0000000000 Binary files a/crates/zed/assets/fonts/zed-sans/zed-sans-bolditalic.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-extended.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-extended.ttf new file mode 100644 index 0000000000..d5cc91e27a Binary files /dev/null and b/crates/zed/assets/fonts/zed-sans/zed-sans-extended.ttf differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbold.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbold.ttf new file mode 100644 index 0000000000..0e1264b1ce Binary files /dev/null and b/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbold.ttf differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbolditalic.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbolditalic.ttf new file mode 100644 index 0000000000..568d9930b7 Binary files /dev/null and b/crates/zed/assets/fonts/zed-sans/zed-sans-extendedbolditalic.ttf differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-extendeditalic.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-extendeditalic.ttf new file mode 100644 index 0000000000..d5f10a2ee6 Binary files /dev/null and b/crates/zed/assets/fonts/zed-sans/zed-sans-extendeditalic.ttf differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-italic.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-italic.ttf deleted file mode 100644 index cc7dbb4c35..0000000000 Binary files a/crates/zed/assets/fonts/zed-sans/zed-sans-italic.ttf and /dev/null differ diff --git a/crates/zed/assets/fonts/zed-sans/zed-sans-regular.ttf b/crates/zed/assets/fonts/zed-sans/zed-sans-regular.ttf deleted file mode 100644 index 8bfd8202cb..0000000000 Binary files a/crates/zed/assets/fonts/zed-sans/zed-sans-regular.ttf and /dev/null differ diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index e5312a5512..c9a14bf236 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -849,7 +849,7 @@ mod tests { lazy_static::lazy_static! { static ref DEFAULT_THEME: parking_lot::Mutex>> = Default::default(); static ref FONTS: Vec>> = vec![ - Assets.load("fonts/zed-sans/zed-sans-regular.ttf").unwrap().to_vec().into() + Assets.load("fonts/zed-sans/zed-sans-extended.ttf").unwrap().to_vec().into() ]; }