Merge branch 'main' into fix-notification-positioning

Conrad Irwin created

Change summary

assets/keymaps/default.json                   |   3 
crates/collab/src/db/queries/notifications.rs |   2 
crates/collab/src/db/queries/users.rs         |   4 
crates/collab/src/rpc.rs                      |  16 
crates/collab_ui/src/notification_panel.rs    |   3 
crates/editor/src/actions.rs                  |   1 
crates/editor/src/editor.rs                   |  34 
crates/editor/src/element.rs                  |   3 
crates/gpui/src/app.rs                        |   8 
crates/gpui/src/app/entity_map.rs             |   6 
crates/gpui/src/app/model_context.rs          |   2 
crates/gpui/src/app/test_context.rs           |   2 
crates/gpui/src/executor.rs                   |   2 
crates/gpui/src/platform/mac/window.rs        |  40 
crates/gpui/src/styled.rs                     |  21 
crates/gpui/src/view.rs                       |   4 
crates/gpui/src/window.rs                     |  46 
crates/language/src/buffer.rs                 | 297 ++++++++++-
crates/language/src/diagnostic_set.rs         |  31 +
crates/language/src/highlight_map.rs          |   4 
crates/language/src/language.rs               |  88 +++
crates/language/src/language_settings.rs      |  91 +++
crates/language/src/markdown.rs               |  35 +
crates/language/src/outline.rs                |   1 
crates/language/src/proto.rs                  |  39 +
crates/language/src/syntax_map.rs             |  51 +
crates/language_tools/src/syntax_tree_view.rs |   6 
crates/multi_buffer/src/multi_buffer.rs       |   2 
crates/plugin_runtime/src/plugin.rs           |   6 
crates/project/src/project.rs                 |   2 
crates/project/src/worktree.rs                |   2 
crates/rpc/proto/zed.proto                    |   3 
crates/settings/src/settings_store.rs         |  10 
crates/terminal/src/terminal.rs               |  50 -
crates/terminal/src/terminal_settings.rs      |  14 
crates/terminal_view/src/terminal_element.rs  |  62 +-
crates/terminal_view/src/terminal_view.rs     |   2 
crates/theme/src/default_colors.rs            |  38 +
crates/theme/src/one_themes.rs                |  11 
crates/theme/src/styles/colors.rs             |  73 +
crates/theme/src/themes/andromeda.rs          |  27 
crates/theme/src/themes/atelier.rs            | 540 ++++++++++++++------
crates/theme/src/themes/ayu.rs                |  81 ++
crates/theme/src/themes/gruvbox.rs            | 162 ++++-
crates/theme/src/themes/one.rs                |  54 +
crates/theme/src/themes/rose_pine.rs          |  81 ++
crates/theme/src/themes/sandcastle.rs         |  27 
crates/theme/src/themes/solarized.rs          |  54 +
crates/theme/src/themes/summercamp.rs         |  27 
crates/theme_importer/src/theme_printer.rs    |  33 
crates/theme_importer/src/zed1/converter.rs   |  27 
crates/ui/src/components/label/label.rs       |   2 
crates/ui/src/components/list/list_item.rs    |  10 
crates/ui/src/components/stories/list_item.rs |  26 +
crates/vim/src/motion.rs                      |  13 
crates/vim/src/normal/change.rs               |  12 
crates/vim/src/object.rs                      |  37 
crates/vim/src/utils.rs                       |  10 
script/deploy-collab                          |   1 
59 files changed, 1,711 insertions(+), 628 deletions(-)

Detailed changes

assets/keymaps/default.json 🔗

@@ -349,7 +349,8 @@
       "alt-cmd-]": "editor::UnfoldLines",
       "ctrl-space": "editor::ShowCompletions",
       "cmd-.": "editor::ToggleCodeActions",
-      "alt-cmd-r": "editor::RevealInFinder"
+      "alt-cmd-r": "editor::RevealInFinder",
+      "ctrl-cmd-c": "editor::DisplayCursorNames"
     }
   },
   {

crates/collab/src/db/queries/notifications.rs 🔗

@@ -66,7 +66,7 @@ impl Database {
         .await
     }
 
-    /// Create a notification. If `avoid_duplicates` is set to true, then avoid
+    /// Creates a notification. If `avoid_duplicates` is set to true, then avoid
     /// creating a new notification if the given recipient already has an
     /// unread notification with the given kind and entity id.
     pub async fn create_notification(

crates/collab/src/db/queries/users.rs 🔗

@@ -153,7 +153,7 @@ impl Database {
         .await
     }
 
-    /// Set "connected_once" on the user for analytics.
+    /// Sets "connected_once" on the user for analytics.
     pub async fn set_user_connected_once(&self, id: UserId, connected_once: bool) -> Result<()> {
         self.transaction(|tx| async move {
             user::Entity::update_many()
@@ -252,7 +252,7 @@ impl Database {
         .await
     }
 
-    /// Return the active flags for the user.
+    /// Returns the active flags for the user.
     pub async fn get_user_flags(&self, user: UserId) -> Result<Vec<String>> {
         self.transaction(|tx| async move {
             #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]

crates/collab/src/rpc.rs 🔗

@@ -950,7 +950,7 @@ async fn ping(_: proto::Ping, response: Response<proto::Ping>, _session: Session
     Ok(())
 }
 
-/// Create a new room for calling (outside of channels)
+/// Creates a new room for calling (outside of channels)
 async fn create_room(
     _request: proto::CreateRoom,
     response: Response<proto::CreateRoom>,
@@ -1276,7 +1276,7 @@ async fn leave_room(
     Ok(())
 }
 
-/// Update the permissions of someone else in the room.
+/// Updates the permissions of someone else in the room.
 async fn set_room_participant_role(
     request: proto::SetRoomParticipantRole,
     response: Response<proto::SetRoomParticipantRole>,
@@ -1460,7 +1460,7 @@ async fn decline_call(message: proto::DeclineCall, session: Session) -> Result<(
     Ok(())
 }
 
-/// Update other participants in the room with your current location.
+/// Updates other participants in the room with your current location.
 async fn update_participant_location(
     request: proto::UpdateParticipantLocation,
     response: Response<proto::UpdateParticipantLocation>,
@@ -1673,7 +1673,7 @@ async fn leave_project(request: proto::LeaveProject, session: Session) -> Result
     Ok(())
 }
 
-/// Update other participants with changes to the project
+/// Updates other participants with changes to the project
 async fn update_project(
     request: proto::UpdateProject,
     response: Response<proto::UpdateProject>,
@@ -1700,7 +1700,7 @@ async fn update_project(
     Ok(())
 }
 
-/// Update other participants with changes to the worktree
+/// Updates other participants with changes to the worktree
 async fn update_worktree(
     request: proto::UpdateWorktree,
     response: Response<proto::UpdateWorktree>,
@@ -1725,7 +1725,7 @@ async fn update_worktree(
     Ok(())
 }
 
-/// Update other participants with changes to the diagnostics
+/// Updates other participants with changes to the diagnostics
 async fn update_diagnostic_summary(
     message: proto::UpdateDiagnosticSummary,
     session: Session,
@@ -1749,7 +1749,7 @@ async fn update_diagnostic_summary(
     Ok(())
 }
 
-/// Update other participants with changes to the worktree settings
+/// Updates other participants with changes to the worktree settings
 async fn update_worktree_settings(
     message: proto::UpdateWorktreeSettings,
     session: Session,
@@ -2293,7 +2293,7 @@ async fn remove_contact(
     Ok(())
 }
 
-/// Create a new channel.
+/// Creates a new channel.
 async fn create_channel(
     request: proto::CreateChannel,
     response: Response<proto::CreateChannel>,

crates/collab_ui/src/notification_panel.rs 🔗

@@ -713,6 +713,9 @@ impl Render for NotificationToast {
 
         h_flex()
             .id("notification_panel_toast")
+            .elevation_3(cx)
+            .p_2()
+            .gap_2()
             .children(user.map(|user| Avatar::new(user.avatar_uri.clone())))
             .child(Label::new(self.text.clone()))
             .child(

crates/editor/src/editor.rs 🔗

@@ -367,7 +367,7 @@ pub struct Editor {
     project: Option<Model<Project>>,
     collaboration_hub: Option<Box<dyn CollaborationHub>>,
     blink_manager: Model<BlinkManager>,
-    recently_focused: bool,
+    show_cursor_names: bool,
     hovered_cursor: Option<HoveredCursor>,
     pub show_local_selections: bool,
     mode: EditorMode,
@@ -1613,7 +1613,7 @@ impl Editor {
             pixel_position_of_newest_cursor: None,
             gutter_width: Default::default(),
             style: None,
-            recently_focused: false,
+            show_cursor_names: false,
             hovered_cursor: Default::default(),
             editor_actions: Default::default(),
             show_copilot_suggestions: mode == EditorMode::Full,
@@ -3899,6 +3899,24 @@ impl Editor {
         self.update_visible_copilot_suggestion(cx);
     }
 
+    pub fn display_cursor_names(&mut self, _: &DisplayCursorNames, cx: &mut ViewContext<Self>) {
+        self.show_cursor_names(cx);
+    }
+
+    fn show_cursor_names(&mut self, cx: &mut ViewContext<Self>) {
+        self.show_cursor_names = true;
+        cx.notify();
+        cx.spawn(|this, mut cx| async move {
+            cx.background_executor().timer(Duration::from_secs(2)).await;
+            this.update(&mut cx, |this, cx| {
+                this.show_cursor_names = false;
+                cx.notify()
+            })
+            .ok()
+        })
+        .detach();
+    }
+
     fn next_copilot_suggestion(&mut self, _: &copilot::NextSuggestion, cx: &mut ViewContext<Self>) {
         if self.has_active_copilot_suggestion(cx) {
             self.cycle_copilot_suggestions(Direction::Next, cx);
@@ -9003,17 +9021,7 @@ impl Editor {
             cx.focus(&rename_editor_focus_handle);
         } else {
             self.blink_manager.update(cx, BlinkManager::enable);
-            self.recently_focused = true;
-            cx.notify();
-            cx.spawn(|this, mut cx| async move {
-                cx.background_executor().timer(Duration::from_secs(2)).await;
-                this.update(&mut cx, |this, cx| {
-                    this.recently_focused = false;
-                    cx.notify()
-                })
-                .ok()
-            })
-            .detach();
+            self.show_cursor_names(cx);
             self.buffer.update(cx, |buffer, cx| {
                 buffer.finalize_last_transaction(cx);
                 if self.leader_peer_id.is_none() {

crates/editor/src/element.rs 🔗

@@ -327,6 +327,7 @@ impl EditorElement {
         register_action(view, cx, Editor::context_menu_prev);
         register_action(view, cx, Editor::context_menu_next);
         register_action(view, cx, Editor::context_menu_last);
+        register_action(view, cx, Editor::display_cursor_names);
     }
 
     fn register_key_listeners(&self, cx: &mut WindowContext) {
@@ -2000,7 +2001,7 @@ impl EditorElement {
                     if Some(selection.peer_id) == editor.leader_peer_id {
                         continue;
                     }
-                    let is_shown = editor.recently_focused || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id);
+                    let is_shown = editor.show_cursor_names || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id);
 
                     remote_selections
                         .entry(selection.replica_id)

crates/gpui/src/app.rs 🔗

@@ -864,7 +864,7 @@ impl AppContext {
             .unwrap()
     }
 
-    /// Set the value of the global of the given type.
+    /// Sets the value of the global of the given type.
     pub fn set_global<G: Any>(&mut self, global: G) {
         let global_type = TypeId::of::<G>();
         self.push_effect(Effect::NotifyGlobalObservers { global_type });
@@ -889,7 +889,7 @@ impl AppContext {
             .unwrap()
     }
 
-    /// Update the global of the given type with a closure. Unlike `global_mut`, this method provides
+    /// Updates the global of the given type with a closure. Unlike `global_mut`, this method provides
     /// your closure with mutable access to the `AppContext` and the global simultaneously.
     pub fn update_global<G: 'static, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R {
         self.update(|cx| {
@@ -1106,7 +1106,7 @@ impl AppContext {
             .contains_key(&action.as_any().type_id())
     }
 
-    /// Set the menu bar for this application. This will replace any existing menu bar.
+    /// Sets the menu bar for this application. This will replace any existing menu bar.
     pub fn set_menus(&mut self, menus: Vec<Menu>) {
         self.platform.set_menus(menus, &self.keymap.lock());
     }
@@ -1190,7 +1190,7 @@ impl Context for AppContext {
         })
     }
 
-    /// Update the entity referenced by the given model. The function is passed a mutable reference to the
+    /// Updates the entity referenced by the given model. The function is passed a mutable reference to the
     /// entity along with a `ModelContext` for the entity.
     fn update_model<T: 'static, R>(
         &mut self,

crates/gpui/src/app/entity_map.rs 🔗

@@ -104,7 +104,7 @@ impl EntityMap {
         }
     }
 
-    /// Return an entity after moving it to the stack.
+    /// Returns an entity after moving it to the stack.
     pub fn end_lease<T>(&mut self, mut lease: Lease<T>) {
         self.entities
             .insert(lease.model.entity_id, lease.entity.take().unwrap());
@@ -391,7 +391,7 @@ impl<T: 'static> Model<T> {
         cx.read_model(self, f)
     }
 
-    /// Update the entity referenced by this model with the given function.
+    /// Updates the entity referenced by this model with the given function.
     ///
     /// The update function receives a context appropriate for its environment.
     /// When updating in an `AppContext`, it receives a `ModelContext`.
@@ -571,7 +571,7 @@ impl<T: 'static> WeakModel<T> {
         Model::upgrade_from(self)
     }
 
-    /// Update the entity referenced by this model with the given function if
+    /// Updates the entity referenced by this model with the given function if
     /// the referenced entity still exists. Returns an error if the entity has
     /// been released.
     pub fn update<C, R>(

crates/gpui/src/app/model_context.rs 🔗

@@ -189,7 +189,7 @@ impl<'a, T: 'static> ModelContext<'a, T> {
         }
     }
 
-    /// Update the given global
+    /// Updates the given global
     pub fn update_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
     where
         G: 'static,

crates/gpui/src/app/test_context.rs 🔗

@@ -578,7 +578,7 @@ impl<'a> VisualTestContext {
         self.cx.update_window(self.window, |_, cx| f(cx)).unwrap()
     }
 
-    /// Create a new VisualTestContext. You would typically shadow the passed in
+    /// Creates a new VisualTestContext. You would typically shadow the passed in
     /// TestAppContext with this, as this is typically more useful.
     /// `let cx = VisualTestContext::from_window(window, cx);`
     pub fn from_window(window: AnyWindowHandle, cx: &TestAppContext) -> Self {

crates/gpui/src/executor.rs 🔗

@@ -46,7 +46,7 @@ pub enum Task<T> {
 }
 
 impl<T> Task<T> {
-    /// Create a new task that will resolve with the value
+    /// Creates a new task that will resolve with the value
     pub fn ready(val: T) -> Self {
         Task::Ready(Some(val))
     }

crates/gpui/src/platform/mac/window.rs 🔗

@@ -514,25 +514,6 @@ impl MacWindow {
                     NSArray::arrayWithObject(nil, NSFilenamesPboardType)
             ];
 
-            let screen = native_window.screen();
-            match options.bounds {
-                WindowBounds::Fullscreen => {
-                    native_window.toggleFullScreen_(nil);
-                }
-                WindowBounds::Maximized => {
-                    native_window.setFrame_display_(screen.visibleFrame(), YES);
-                }
-                WindowBounds::Fixed(bounds) => {
-                    let display_bounds = display.bounds();
-                    let frame = if bounds.intersects(&display_bounds) {
-                        global_bounds_to_ns_rect(bounds)
-                    } else {
-                        global_bounds_to_ns_rect(display_bounds)
-                    };
-                    native_window.setFrame_display_(frame, YES);
-                }
-            }
-
             let native_view: id = msg_send![VIEW_CLASS, alloc];
             let native_view = NSView::init(native_view);
 
@@ -654,6 +635,27 @@ impl MacWindow {
                 native_window.orderFront_(nil);
             }
 
+            let screen = native_window.screen();
+            match options.bounds {
+                WindowBounds::Fullscreen => {
+                    // We need to toggle full screen asynchronously as doing so may
+                    // call back into the platform handlers.
+                    window.toggle_full_screen()
+                }
+                WindowBounds::Maximized => {
+                    native_window.setFrame_display_(screen.visibleFrame(), YES);
+                }
+                WindowBounds::Fixed(bounds) => {
+                    let display_bounds = display.bounds();
+                    let frame = if bounds.intersects(&display_bounds) {
+                        global_bounds_to_ns_rect(bounds)
+                    } else {
+                        global_bounds_to_ns_rect(display_bounds)
+                    };
+                    native_window.setFrame_display_(frame, YES);
+                }
+            }
+
             window.0.lock().move_traffic_light();
             pool.drain();
 

crates/gpui/src/styled.rs 🔗

@@ -307,6 +307,13 @@ pub trait Styled: Sized {
         self
     }
 
+    /// Sets the initial size of flex items for this element.
+    /// [Docs](https://tailwindcss.com/docs/flex-basis)
+    fn flex_basis(mut self, basis: impl Into<Length>) -> Self {
+        self.style().flex_basis = Some(basis.into());
+        self
+    }
+
     /// Sets the element to allow a flex item to grow to fill any available space.
     /// [Docs](https://tailwindcss.com/docs/flex-grow)
     fn flex_grow(mut self) -> Self {
@@ -314,6 +321,20 @@ pub trait Styled: Sized {
         self
     }
 
+    /// Sets the element to allow a flex item to shrink if needed.
+    /// [Docs](https://tailwindcss.com/docs/flex-shrink)
+    fn flex_shrink(mut self) -> Self {
+        self.style().flex_shrink = Some(1.);
+        self
+    }
+
+    /// Sets the element to prevent a flex item from shrinking.
+    /// [Docs](https://tailwindcss.com/docs/flex-shrink#dont-shrink)
+    fn flex_shrink_0(mut self) -> Self {
+        self.style().flex_shrink = Some(0.);
+        self
+    }
+
     /// Sets the element to align flex items to the start of the container's cross axis.
     /// [Docs](https://tailwindcss.com/docs/align-items#start)
     fn items_start(mut self) -> Self {

crates/gpui/src/view.rs 🔗

@@ -64,7 +64,7 @@ impl<V: 'static> View<V> {
         Entity::downgrade(self)
     }
 
-    /// Update the view's state with the given function, which is passed a mutable reference and a context.
+    /// Updates the view's state with the given function, which is passed a mutable reference and a context.
     pub fn update<C, R>(
         &self,
         cx: &mut C,
@@ -156,7 +156,7 @@ impl<V: 'static> WeakView<V> {
         Entity::upgrade_from(self)
     }
 
-    /// Update this view's state if it hasn't been released.
+    /// Updates this view's state if it hasn't been released.
     /// Returns an error if this view has been released.
     pub fn update<C, R>(
         &self,

crates/gpui/src/window.rs 🔗

@@ -721,7 +721,7 @@ impl<'a> WindowContext<'a> {
         subscription
     }
 
-    /// Create an `AsyncWindowContext`, which has a static lifetime and can be held across
+    /// Creates an [`AsyncWindowContext`], which has a static lifetime and can be held across
     /// await points in async code.
     pub fn to_async(&self) -> AsyncWindowContext {
         AsyncWindowContext::new(self.app.to_async(), self.window.handle)
@@ -794,7 +794,7 @@ impl<'a> WindowContext<'a> {
             .spawn(|app| f(AsyncWindowContext::new(app, self.window.handle)))
     }
 
-    /// Update the global of the given type. The given closure is given simultaneous mutable
+    /// Updates the global of the given type. The given closure is given simultaneous mutable
     /// access both to the global and the context.
     pub fn update_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
     where
@@ -913,7 +913,7 @@ impl<'a> WindowContext<'a> {
         self.window.platform_window.zoom();
     }
 
-    /// Update the window's title at the platform level.
+    /// Updates the window's title at the platform level.
     pub fn set_window_title(&mut self, title: &str) {
         self.window.platform_window.set_title(title);
     }
@@ -1063,14 +1063,14 @@ impl<'a> WindowContext<'a> {
         self.window.modifiers
     }
 
-    /// Update the cursor style at the platform level.
+    /// Updates the cursor style at the platform level.
     pub fn set_cursor_style(&mut self, style: CursorStyle) {
         let view_id = self.parent_view_id();
         self.window.next_frame.cursor_styles.insert(view_id, style);
         self.window.next_frame.requested_cursor_style = Some(style);
     }
 
-    /// Set a tooltip to be rendered for the upcoming frame
+    /// Sets a tooltip to be rendered for the upcoming frame
     pub fn set_tooltip(&mut self, tooltip: AnyTooltip) {
         let view_id = self.parent_view_id();
         self.window.next_frame.tooltip_request = Some(TooltipRequest { view_id, tooltip });
@@ -2080,8 +2080,8 @@ impl<'a> WindowContext<'a> {
         })
     }
 
-    /// Update or initialize state for an element with the given id that lives across multiple
-    /// frames. If an element with this id existed in the rendered frame, its state will be passed
+    /// Updates or initializes state for an element with the given id that lives across multiple
+    /// frames. If an element with this ID existed in the rendered frame, its state will be passed
     /// to the given closure. The state returned by the closure will be stored so it can be referenced
     /// when drawing the next frame.
     pub(crate) fn with_element_state<S, R>(
@@ -2182,7 +2182,7 @@ impl<'a> WindowContext<'a> {
             .expect("a view should always be on the stack while drawing")
     }
 
-    /// Set an input handler, such as [`ElementInputHandler`][element_input_handler], which interfaces with the
+    /// Sets an input handler, such as [`ElementInputHandler`][element_input_handler], which interfaces with the
     /// platform to receive textual input with proper integration with concerns such
     /// as IME interactions. This handler will be active for the upcoming frame until the following frame is
     /// rendered.
@@ -2322,7 +2322,7 @@ impl VisualContext for WindowContext<'_> {
         view
     }
 
-    /// Update the given view. Prefer calling `View::update` instead, which calls this method.
+    /// Updates the given view. Prefer calling [`View::update`] instead, which calls this method.
     fn update_view<T: 'static, R>(
         &mut self,
         view: &View<T>,
@@ -2491,7 +2491,7 @@ pub trait BorrowWindow: BorrowMut<Window> + BorrowMut<AppContext> {
         result
     }
 
-    /// Update the global element offset relative to the current offset. This is used to implement
+    /// Updates the global element offset relative to the current offset. This is used to implement
     /// scrolling.
     fn with_element_offset<R>(
         &mut self,
@@ -2506,7 +2506,7 @@ pub trait BorrowWindow: BorrowMut<Window> + BorrowMut<AppContext> {
         self.with_absolute_element_offset(abs_offset, f)
     }
 
-    /// Update the global element offset based on the given offset. This is used to implement
+    /// Updates the global element offset based on the given offset. This is used to implement
     /// drag handles and other manual painting of elements.
     fn with_absolute_element_offset<R>(
         &mut self,
@@ -2629,7 +2629,7 @@ impl<'a, V: 'static> ViewContext<'a, V> {
         &mut self.window_cx
     }
 
-    /// Set a given callback to be run on the next frame.
+    /// Sets a given callback to be run on the next frame.
     pub fn on_next_frame(&mut self, f: impl FnOnce(&mut V, &mut ViewContext<V>) + 'static)
     where
         V: 'static,
@@ -2957,7 +2957,7 @@ impl<'a, V: 'static> ViewContext<'a, V> {
         self.window_cx.spawn(|cx| f(view, cx))
     }
 
-    /// Update the global state of the given type.
+    /// Updates the global state of the given type.
     pub fn update_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
     where
         G: 'static,
@@ -3189,7 +3189,7 @@ pub struct WindowHandle<V> {
 }
 
 impl<V: 'static + Render> WindowHandle<V> {
-    /// Create a new handle from a window ID.
+    /// Creates a new handle from a window ID.
     /// This does not check if the root type of the window is `V`.
     pub fn new(id: WindowId) -> Self {
         WindowHandle {
@@ -3215,7 +3215,7 @@ impl<V: 'static + Render> WindowHandle<V> {
         }))
     }
 
-    /// Update the root view of this window.
+    /// Updates the root view of this window.
     ///
     /// This will fail if the window has been closed or if the root view's type does not match
     pub fn update<C, R>(
@@ -3337,7 +3337,7 @@ impl AnyWindowHandle {
         }
     }
 
-    /// Update the state of the root view of this window.
+    /// Updates the state of the root view of this window.
     ///
     /// This will fail if the window has been closed.
     pub fn update<C, R>(
@@ -3477,7 +3477,7 @@ pub struct PaintQuad {
 }
 
 impl PaintQuad {
-    /// Set the corner radii of the quad.
+    /// Sets the corner radii of the quad.
     pub fn corner_radii(self, corner_radii: impl Into<Corners<Pixels>>) -> Self {
         PaintQuad {
             corner_radii: corner_radii.into(),
@@ -3485,7 +3485,7 @@ impl PaintQuad {
         }
     }
 
-    /// Set the border widths of the quad.
+    /// Sets the border widths of the quad.
     pub fn border_widths(self, border_widths: impl Into<Edges<Pixels>>) -> Self {
         PaintQuad {
             border_widths: border_widths.into(),
@@ -3493,7 +3493,7 @@ impl PaintQuad {
         }
     }
 
-    /// Set the border color of the quad.
+    /// Sets the border color of the quad.
     pub fn border_color(self, border_color: impl Into<Hsla>) -> Self {
         PaintQuad {
             border_color: border_color.into(),
@@ -3501,7 +3501,7 @@ impl PaintQuad {
         }
     }
 
-    /// Set the background color of the quad.
+    /// Sets the background color of the quad.
     pub fn background(self, background: impl Into<Hsla>) -> Self {
         PaintQuad {
             background: background.into(),
@@ -3510,7 +3510,7 @@ impl PaintQuad {
     }
 }
 
-/// Create a quad with the given parameters.
+/// Creates a quad with the given parameters.
 pub fn quad(
     bounds: Bounds<Pixels>,
     corner_radii: impl Into<Corners<Pixels>>,
@@ -3527,7 +3527,7 @@ pub fn quad(
     }
 }
 
-/// Create a filled quad with the given bounds and background color.
+/// Creates a filled quad with the given bounds and background color.
 pub fn fill(bounds: impl Into<Bounds<Pixels>>, background: impl Into<Hsla>) -> PaintQuad {
     PaintQuad {
         bounds: bounds.into(),
@@ -3538,7 +3538,7 @@ pub fn fill(bounds: impl Into<Bounds<Pixels>>, background: impl Into<Hsla>) -> P
     }
 }
 
-/// Create a rectangle outline with the given bounds, border color, and a 1px border width
+/// Creates a rectangle outline with the given bounds, border color, and a 1px border width
 pub fn outline(bounds: impl Into<Bounds<Pixels>>, border_color: impl Into<Hsla>) -> PaintQuad {
     PaintQuad {
         bounds: bounds.into(),

crates/language/src/buffer.rs 🔗

@@ -10,7 +10,7 @@ use crate::{
     markdown::parse_markdown,
     outline::OutlineItem,
     syntax_map::{
-        SyntaxLayerInfo, SyntaxMap, SyntaxMapCapture, SyntaxMapCaptures, SyntaxMapMatches,
+        SyntaxLayer, SyntaxMap, SyntaxMapCapture, SyntaxMapCaptures, SyntaxMapMatches,
         SyntaxSnapshot, ToTreeSitterPoint,
     },
     CodeLabel, LanguageScope, Outline,
@@ -42,7 +42,13 @@ use std::{
 };
 use sum_tree::TreeMap;
 use text::operation_queue::OperationQueue;
-pub use text::{Buffer as TextBuffer, BufferSnapshot as TextBufferSnapshot, *};
+use text::*;
+pub use text::{
+    Anchor, Bias, Buffer as TextBuffer, BufferSnapshot as TextBufferSnapshot, Edit, OffsetRangeExt,
+    OffsetUtf16, Patch, Point, PointUtf16, Rope, RopeFingerprint, Selection, SelectionGoal,
+    Subscription, TextDimension, TextSummary, ToOffset, ToOffsetUtf16, ToPoint, ToPointUtf16,
+    Transaction, TransactionId, Unclipped,
+};
 use theme::SyntaxTheme;
 #[cfg(any(test, feature = "test-support"))]
 use util::RandomCharIter;
@@ -54,15 +60,22 @@ pub use {tree_sitter_rust, tree_sitter_typescript};
 pub use lsp::DiagnosticSeverity;
 
 lazy_static! {
+    /// A label for the background task spawned by the buffer to compute
+    /// a diff against the contents of its file.
     pub static ref BUFFER_DIFF_TASK: TaskLabel = TaskLabel::new();
 }
 
+/// Indicate whether a [Buffer] has permissions to edit.
 #[derive(PartialEq, Clone, Copy, Debug)]
 pub enum Capability {
+    /// The buffer is a mutable replica.
     ReadWrite,
+    /// The buffer is a read-only replica.
     ReadOnly,
 }
 
+/// An in-memory representation of a source code file, including its text,
+/// syntax trees, git status, and diagnostics.
 pub struct Buffer {
     text: TextBuffer,
     diff_base: Option<String>,
@@ -99,9 +112,11 @@ pub struct Buffer {
     capability: Capability,
 }
 
+/// An immutable, cheaply cloneable representation of a fixed
+/// state of a buffer.
 pub struct BufferSnapshot {
     text: text::BufferSnapshot,
-    pub git_diff: git::diff::BufferDiff,
+    git_diff: git::diff::BufferDiff,
     pub(crate) syntax: SyntaxSnapshot,
     file: Option<Arc<dyn File>>,
     diagnostics: SmallVec<[(LanguageServerId, DiagnosticSet); 2]>,
@@ -114,25 +129,37 @@ pub struct BufferSnapshot {
     parse_count: usize,
 }
 
+/// The kind and amount of indentation in a particular line. For now,
+/// assumes that indentation is all the same character.
 #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub struct IndentSize {
+    /// The number of bytes that comprise the indentation.
     pub len: u32,
+    /// The kind of whitespace used for indentation.
     pub kind: IndentKind,
 }
 
+/// A whitespace character that's used for indentation.
 #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub enum IndentKind {
+    /// An ASCII space character.
     #[default]
     Space,
+    /// An ASCII tab character.
     Tab,
 }
 
+/// The shape of a selection cursor.
 #[derive(Copy, Clone, PartialEq, Eq, Debug, Default)]
 pub enum CursorShape {
+    /// A vertical bar
     #[default]
     Bar,
+    /// A block that surrounds the following character
     Block,
+    /// An underline that runs along the following character
     Underscore,
+    /// A box drawn around the following character
     Hollow,
 }
 
@@ -144,25 +171,40 @@ struct SelectionSet {
     lamport_timestamp: clock::Lamport,
 }
 
-#[derive(Clone, Debug, PartialEq, Eq)]
-pub struct GroupId {
-    source: Arc<str>,
-    id: usize,
-}
-
+/// A diagnostic associated with a certain range of a buffer.
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub struct Diagnostic {
+    /// The name of the service that produced this diagnostic.
     pub source: Option<String>,
+    /// A machine-readable code that identifies this diagnostic.
     pub code: Option<String>,
+    /// Whether this diagnostic is a hint, warning, or error.
     pub severity: DiagnosticSeverity,
+    /// The human-readable message associated with this diagnostic.
     pub message: String,
+    /// An id that identifies the group to which this diagnostic belongs.
+    ///
+    /// When a language server produces a diagnostic with
+    /// one or more associated diagnostics, those diagnostics are all
+    /// assigned a single group id.
     pub group_id: usize,
-    pub is_valid: bool,
+    /// Whether this diagnostic is the primary diagnostic for its group.
+    ///
+    /// In a given group, the primary diagnostic is the top-level diagnostic
+    /// returned by the language server. The non-primary diagnostics are the
+    /// associated diagnostics.
     pub is_primary: bool,
+    /// Whether this diagnostic is considered to originate from an analysis of
+    /// files on disk, as opposed to any unsaved buffer contents. This is a
+    /// property of a given diagnostic source, and is configured for a given
+    /// language server via the [LspAdapter::disk_based_diagnostic_sources] method
+    /// for the language server.
     pub is_disk_based: bool,
+    /// Whether this diagnostic marks unnecessary code.
     pub is_unnecessary: bool,
 }
 
+/// TODO - move this into the `project` crate and make it private.
 pub async fn prepare_completion_documentation(
     documentation: &lsp::Documentation,
     language_registry: &Arc<LanguageRegistry>,
@@ -194,77 +236,127 @@ pub async fn prepare_completion_documentation(
     }
 }
 
+/// Documentation associated with a [Completion].
 #[derive(Clone, Debug)]
 pub enum Documentation {
+    /// There is no documentation for this completion.
     Undocumented,
+    /// A single line of documentation.
     SingleLine(String),
+    /// Multiple lines of plain text documentation.
     MultiLinePlainText(String),
+    /// Markdown documentation.
     MultiLineMarkdown(ParsedMarkdown),
 }
 
+/// A completion provided by a language server
 #[derive(Clone, Debug)]
 pub struct Completion {
+    /// The range of the buffer that will be replaced.
     pub old_range: Range<Anchor>,
+    /// The new text that will be inserted.
     pub new_text: String,
+    /// A label for this completion that is shown in the menu.
     pub label: CodeLabel,
+    /// The id of the language server that produced this completion.
     pub server_id: LanguageServerId,
+    /// The documentation for this completion.
     pub documentation: Option<Documentation>,
+    /// The raw completion provided by the language server.
     pub lsp_completion: lsp::CompletionItem,
 }
 
+/// A code action provided by a language server.
 #[derive(Clone, Debug)]
 pub struct CodeAction {
+    /// The id of the language server that produced this code action.
     pub server_id: LanguageServerId,
+    /// The range of the buffer where this code action is applicable.
     pub range: Range<Anchor>,
+    /// The raw code action provided by the language server.
     pub lsp_action: lsp::CodeAction,
 }
 
+/// An operation used to synchronize this buffer with its other replicas.
 #[derive(Clone, Debug, PartialEq)]
 pub enum Operation {
+    /// A text operation.
     Buffer(text::Operation),
 
+    /// An update to the buffer's diagnostics.
     UpdateDiagnostics {
+        /// The id of the language server that produced the new diagnostics.
         server_id: LanguageServerId,
+        /// The diagnostics.
         diagnostics: Arc<[DiagnosticEntry<Anchor>]>,
+        /// The buffer's lamport timestamp.
         lamport_timestamp: clock::Lamport,
     },
 
+    /// An update to the most recent selections in this buffer.
     UpdateSelections {
+        /// The selections.
         selections: Arc<[Selection<Anchor>]>,
+        /// The buffer's lamport timestamp.
         lamport_timestamp: clock::Lamport,
+        /// Whether the selections are in 'line mode'.
         line_mode: bool,
+        /// The [CursorShape] associated with these selections.
         cursor_shape: CursorShape,
     },
 
+    /// An update to the characters that should trigger autocompletion
+    /// for this buffer.
     UpdateCompletionTriggers {
+        /// The characters that trigger autocompletion.
         triggers: Vec<String>,
+        /// The buffer's lamport timestamp.
         lamport_timestamp: clock::Lamport,
     },
 }
 
+/// An event that occurs in a buffer.
 #[derive(Clone, Debug, PartialEq)]
 pub enum Event {
+    /// The buffer was changed in a way that must be
+    /// propagated to its other replicas.
     Operation(Operation),
+    /// The buffer was edited.
     Edited,
+    /// The buffer's `dirty` bit changed.
     DirtyChanged,
+    /// The buffer was saved.
     Saved,
+    /// The buffer's file was changed on disk.
     FileHandleChanged,
+    /// The buffer was reloaded.
     Reloaded,
+    /// The buffer's diff_base changed.
     DiffBaseChanged,
+    /// The buffer's language was changed.
     LanguageChanged,
+    /// The buffer's syntax trees were updated.
     Reparsed,
+    /// The buffer's diagnostics were updated.
     DiagnosticsUpdated,
+    /// The buffer gained or lost editing capabilities.
     CapabilityChanged,
+    /// The buffer was explicitly requested to close.
     Closed,
 }
 
+/// The file associated with a buffer.
 pub trait File: Send + Sync {
+    /// Returns the [LocalFile] associated with this file, if the
+    /// file is local.
     fn as_local(&self) -> Option<&dyn LocalFile>;
 
+    /// Returns whether this file is local.
     fn is_local(&self) -> bool {
         self.as_local().is_some()
     }
 
+    /// Returns the file's mtime.
     fn mtime(&self) -> SystemTime;
 
     /// Returns the path of this file relative to the worktree's root directory.
@@ -283,19 +375,25 @@ pub trait File: Send + Sync {
     /// This is needed for looking up project-specific settings.
     fn worktree_id(&self) -> usize;
 
+    /// Returns whether the file has been deleted.
     fn is_deleted(&self) -> bool;
 
+    /// Converts this file into an [Any] trait object.
     fn as_any(&self) -> &dyn Any;
 
+    /// Converts this file into a protobuf message.
     fn to_proto(&self) -> rpc::proto::File;
 }
 
+/// The file associated with a buffer, in the case where the file is on the local disk.
 pub trait LocalFile: File {
     /// Returns the absolute path of this file.
     fn abs_path(&self, cx: &AppContext) -> PathBuf;
 
+    /// Loads the file's contents from disk.
     fn load(&self, cx: &AppContext) -> Task<Result<String>>;
 
+    /// Called when the buffer is reloaded from disk.
     fn buffer_reloaded(
         &self,
         buffer_id: u64,
@@ -307,6 +405,10 @@ pub trait LocalFile: File {
     );
 }
 
+/// The auto-indent behavior associated with an editing operation.
+/// For some editing operations, each affected line of text has its
+/// indentation recomputed. For other operations, the entire block
+/// of edited text is adjusted uniformly.
 #[derive(Clone, Debug)]
 pub enum AutoindentMode {
     /// Indent each line of inserted text.
@@ -354,6 +456,8 @@ struct BufferChunkHighlights<'a> {
     highlight_maps: Vec<HighlightMap>,
 }
 
+/// An iterator that yields chunks of a buffer's text, along with their
+/// syntax highlights and diagnostic status.
 pub struct BufferChunks<'a> {
     range: Range<usize>,
     chunks: text::Chunks<'a>,
@@ -366,16 +470,26 @@ pub struct BufferChunks<'a> {
     highlights: Option<BufferChunkHighlights<'a>>,
 }
 
+/// A chunk of a buffer's text, along with its syntax highlight and
+/// diagnostic status.
 #[derive(Clone, Copy, Debug, Default)]
 pub struct Chunk<'a> {
+    /// The text of the chunk.
     pub text: &'a str,
+    /// The syntax highlighting style of the chunk.
     pub syntax_highlight_id: Option<HighlightId>,
+    /// The highlight style that has been applied to this chunk in
+    /// the editor.
     pub highlight_style: Option<HighlightStyle>,
+    /// The severity of diagnostic associated with this chunk, if any.
     pub diagnostic_severity: Option<DiagnosticSeverity>,
+    /// Whether this chunk of text is marked as unnecessary.
     pub is_unnecessary: bool,
+    /// Whether this chunk of text was originally a tab character.
     pub is_tab: bool,
 }
 
+/// A set of edits to a given version of a buffer, computed asynchronously.
 pub struct Diff {
     pub(crate) base_version: clock::Global,
     line_ending: LineEnding,
@@ -390,24 +504,19 @@ pub(crate) struct DiagnosticEndpoint {
     is_unnecessary: bool,
 }
 
+/// A class of characters, used for characterizing a run of text.
 #[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Debug)]
 pub enum CharKind {
+    /// Whitespace.
     Whitespace,
+    /// Punctuation.
     Punctuation,
+    /// Word.
     Word,
 }
 
-impl CharKind {
-    pub fn coerce_punctuation(self, treat_punctuation_as_word: bool) -> Self {
-        if treat_punctuation_as_word && self == CharKind::Punctuation {
-            CharKind::Word
-        } else {
-            self
-        }
-    }
-}
-
 impl Buffer {
+    /// Create a new buffer with the given base text.
     pub fn new<T: Into<String>>(replica_id: ReplicaId, id: u64, base_text: T) -> Self {
         Self::build(
             TextBuffer::new(replica_id, id, base_text.into()),
@@ -417,6 +526,7 @@ impl Buffer {
         )
     }
 
+    /// Create a new buffer that is a replica of a remote buffer.
     pub fn remote(
         remote_id: u64,
         replica_id: ReplicaId,
@@ -431,6 +541,8 @@ impl Buffer {
         )
     }
 
+    /// Create a new buffer that is a replica of a remote buffer, populating its
+    /// state from the given protobuf message.
     pub fn from_proto(
         replica_id: ReplicaId,
         capability: Capability,
@@ -457,6 +569,7 @@ impl Buffer {
         Ok(this)
     }
 
+    /// Serialize the buffer's state to a protobuf message.
     pub fn to_proto(&self) -> proto::BufferState {
         proto::BufferState {
             id: self.remote_id(),
@@ -470,6 +583,7 @@ impl Buffer {
         }
     }
 
+    /// Serialize as protobufs all of the changes to the buffer since the given version.
     pub fn serialize_ops(
         &self,
         since: Option<clock::Global>,
@@ -516,19 +630,23 @@ impl Buffer {
         })
     }
 
+    /// Assign a language to the buffer, returning the buffer.
     pub fn with_language(mut self, language: Arc<Language>, cx: &mut ModelContext<Self>) -> Self {
         self.set_language(Some(language), cx);
         self
     }
 
+    /// Returns the [Capability] of this buffer.
     pub fn capability(&self) -> Capability {
         self.capability
     }
 
+    /// Whether this buffer can only be read.
     pub fn read_only(&self) -> bool {
         self.capability == Capability::ReadOnly
     }
 
+    /// Builds a [Buffer] with the given underlying [TextBuffer], diff base, [File] and [Capability].
     pub fn build(
         buffer: TextBuffer,
         diff_base: Option<String>,
@@ -573,6 +691,8 @@ impl Buffer {
         }
     }
 
+    /// Retrieve a snapshot of the buffer's current state. This is computationally
+    /// cheap, and allows reading from the buffer on a background thread.
     pub fn snapshot(&self) -> BufferSnapshot {
         let text = self.text.snapshot();
         let mut syntax_map = self.syntax_map.lock();
@@ -595,30 +715,38 @@ impl Buffer {
         }
     }
 
-    pub fn as_text_snapshot(&self) -> &text::BufferSnapshot {
+    #[cfg(test)]
+    pub(crate) fn as_text_snapshot(&self) -> &text::BufferSnapshot {
         &self.text
     }
 
+    /// Retrieve a snapshot of the buffer's raw text, without any
+    /// language-related state like the syntax tree or diagnostics.
     pub fn text_snapshot(&self) -> text::BufferSnapshot {
         self.text.snapshot()
     }
 
+    /// The file associated with the buffer, if any.
     pub fn file(&self) -> Option<&Arc<dyn File>> {
         self.file.as_ref()
     }
 
+    /// The version of the buffer that was last saved or reloaded from disk.
     pub fn saved_version(&self) -> &clock::Global {
         &self.saved_version
     }
 
+    /// The fingerprint of the buffer's text when the buffer was last saved or reloaded from disk.
     pub fn saved_version_fingerprint(&self) -> RopeFingerprint {
         self.file_fingerprint
     }
 
+    /// The mtime of the buffer's file when the buffer was last saved or reloaded from disk.
     pub fn saved_mtime(&self) -> SystemTime {
         self.saved_mtime
     }
 
+    /// Assign a language to the buffer.
     pub fn set_language(&mut self, language: Option<Arc<Language>>, cx: &mut ModelContext<Self>) {
         self.syntax_map.lock().clear();
         self.language = language;
@@ -626,17 +754,21 @@ impl Buffer {
         cx.emit(Event::LanguageChanged);
     }
 
+    /// Assign a language registry to the buffer. This allows the buffer to retrieve
+    /// other languages if parts of the buffer are written in different languages.
     pub fn set_language_registry(&mut self, language_registry: Arc<LanguageRegistry>) {
         self.syntax_map
             .lock()
             .set_language_registry(language_registry);
     }
 
+    /// Assign the buffer a new [Capability].
     pub fn set_capability(&mut self, capability: Capability, cx: &mut ModelContext<Self>) {
         self.capability = capability;
         cx.emit(Event::CapabilityChanged)
     }
 
+    /// This method is called to signal that the buffer has been saved.
     pub fn did_save(
         &mut self,
         version: clock::Global,
@@ -651,6 +783,7 @@ impl Buffer {
         cx.notify();
     }
 
+    /// Reloads the contents of the buffer from disk.
     pub fn reload(
         &mut self,
         cx: &mut ModelContext<Self>,
@@ -699,6 +832,7 @@ impl Buffer {
         rx
     }
 
+    /// This method is called to signal that the buffer has been reloaded.
     pub fn did_reload(
         &mut self,
         version: clock::Global,
@@ -725,6 +859,8 @@ impl Buffer {
         cx.notify();
     }
 
+    /// Updates the [File] backing this buffer. This should be called when
+    /// the file has changed or has been deleted.
     pub fn file_updated(&mut self, new_file: Arc<dyn File>, cx: &mut ModelContext<Self>) {
         let mut file_changed = false;
 
@@ -762,16 +898,20 @@ impl Buffer {
         }
     }
 
+    /// Returns the current diff base, see [Buffer::set_diff_base].
     pub fn diff_base(&self) -> Option<&str> {
         self.diff_base.as_deref()
     }
 
+    /// Sets the text that will be used to compute a Git diff
+    /// against the buffer text.
     pub fn set_diff_base(&mut self, diff_base: Option<String>, cx: &mut ModelContext<Self>) {
         self.diff_base = diff_base;
         self.git_diff_recalc(cx);
         cx.emit(Event::DiffBaseChanged);
     }
 
+    /// Recomputes the Git diff status.
     pub fn git_diff_recalc(&mut self, cx: &mut ModelContext<Self>) -> Option<Task<()>> {
         let diff_base = self.diff_base.clone()?; // TODO: Make this an Arc
         let snapshot = self.snapshot();
@@ -792,14 +932,12 @@ impl Buffer {
         }))
     }
 
-    pub fn close(&mut self, cx: &mut ModelContext<Self>) {
-        cx.emit(Event::Closed);
-    }
-
+    /// Returns the primary [Language] assigned to this [Buffer].
     pub fn language(&self) -> Option<&Arc<Language>> {
         self.language.as_ref()
     }
 
+    /// Returns the [Language] at the given location.
     pub fn language_at<D: ToOffset>(&self, position: D) -> Option<Arc<Language>> {
         let offset = position.to_offset(self);
         self.syntax_map
@@ -810,31 +948,39 @@ impl Buffer {
             .or_else(|| self.language.clone())
     }
 
+    /// The number of times the buffer was parsed.
     pub fn parse_count(&self) -> usize {
         self.parse_count
     }
 
+    /// The number of times selections were updated.
     pub fn selections_update_count(&self) -> usize {
         self.selections_update_count
     }
 
+    /// The number of times diagnostics were updated.
     pub fn diagnostics_update_count(&self) -> usize {
         self.diagnostics_update_count
     }
 
+    /// The number of times the underlying file was updated.
     pub fn file_update_count(&self) -> usize {
         self.file_update_count
     }
 
+    /// The number of times the git diff status was updated.
     pub fn git_diff_update_count(&self) -> usize {
         self.git_diff_update_count
     }
 
+    /// Whether the buffer is being parsed in the background.
     #[cfg(any(test, feature = "test-support"))]
     pub fn is_parsing(&self) -> bool {
         self.parsing_in_background
     }
 
+    /// Indicates whether the buffer contains any regions that may be
+    /// written in a language that hasn't been loaded yet.
     pub fn contains_unknown_injections(&self) -> bool {
         self.syntax_map.lock().contains_unknown_injections()
     }
@@ -941,6 +1087,7 @@ impl Buffer {
         cx.notify();
     }
 
+    /// Assign to the buffer a set of diagnostics created by a given language server.
     pub fn update_diagnostics(
         &mut self,
         server_id: LanguageServerId,
@@ -1170,9 +1317,9 @@ impl Buffer {
         self.edit(edits, None, cx);
     }
 
-    // Create a minimal edit that will cause the the given row to be indented
-    // with the given size. After applying this edit, the length of the line
-    // will always be at least `new_size.len`.
+    /// Create a minimal edit that will cause the the given row to be indented
+    /// with the given size. After applying this edit, the length of the line
+    /// will always be at least `new_size.len`.
     pub fn edit_for_indent_size_adjustment(
         row: u32,
         current_size: IndentSize,
@@ -1207,6 +1354,8 @@ impl Buffer {
         }
     }
 
+    /// Spawns a background task that asynchronously computes a `Diff` between the buffer's text
+    /// and the given new text.
     pub fn diff(&self, mut new_text: String, cx: &AppContext) -> Task<Diff> {
         let old_text = self.as_rope().clone();
         let base_version = self.version();
@@ -1278,7 +1427,7 @@ impl Buffer {
             })
     }
 
-    /// Spawn a background task that searches the buffer for any whitespace
+    /// Spawns a background task that searches the buffer for any whitespace
     /// at the ends of a lines, and returns a `Diff` that removes that whitespace.
     pub fn remove_trailing_whitespace(&self, cx: &AppContext) -> Task<Diff> {
         let old_text = self.as_rope().clone();
@@ -1298,7 +1447,7 @@ impl Buffer {
         })
     }
 
-    /// Ensure that the buffer ends with a single newline character, and
+    /// Ensures that the buffer ends with a single newline character, and
     /// no other whitespace.
     pub fn ensure_final_newline(&mut self, cx: &mut ModelContext<Self>) {
         let len = self.len();
@@ -1319,7 +1468,7 @@ impl Buffer {
         self.edit([(offset..len, "\n")], None, cx);
     }
 
-    /// Apply a diff to the buffer. If the buffer has changed since the given diff was
+    /// Applies a diff to the buffer. If the buffer has changed since the given diff was
     /// calculated, then adjust the diff to account for those changes, and discard any
     /// parts of the diff that conflict with those changes.
     pub fn apply_diff(&mut self, diff: Diff, cx: &mut ModelContext<Self>) -> Option<TransactionId> {
@@ -1358,11 +1507,14 @@ impl Buffer {
         self.end_transaction(cx)
     }
 
+    /// Checks if the buffer has unsaved changes.
     pub fn is_dirty(&self) -> bool {
         self.file_fingerprint != self.as_rope().fingerprint()
             || self.file.as_ref().map_or(false, |file| file.is_deleted())
     }
 
+    /// Checks if the buffer and its file have both changed since the buffer
+    /// was last saved or reloaded.
     pub fn has_conflict(&self) -> bool {
         self.file_fingerprint != self.as_rope().fingerprint()
             && self
@@ -1371,14 +1523,23 @@ impl Buffer {
                 .map_or(false, |file| file.mtime() > self.saved_mtime)
     }
 
+    /// Gets a [`Subscription`] that tracks all of the changes to the buffer's text.
     pub fn subscribe(&mut self) -> Subscription {
         self.text.subscribe()
     }
 
+    /// Starts a transaction, if one is not already in-progress. When undoing or
+    /// redoing edits, all of the edits performed within a transaction are undone
+    /// or redone together.
     pub fn start_transaction(&mut self) -> Option<TransactionId> {
         self.start_transaction_at(Instant::now())
     }
 
+    /// Starts a transaction, providing the current time. Subsequent transactions
+    /// that occur within a short period of time will be grouped together. This
+    /// is controlled by the buffer's undo grouping duration.
+    ///
+    /// See [`Buffer::set_group_interval`].
     pub fn start_transaction_at(&mut self, now: Instant) -> Option<TransactionId> {
         self.transaction_depth += 1;
         if self.was_dirty_before_starting_transaction.is_none() {
@@ -1387,10 +1548,16 @@ impl Buffer {
         self.text.start_transaction_at(now)
     }
 
+    /// Terminates the current transaction, if this is the outermost transaction.
     pub fn end_transaction(&mut self, cx: &mut ModelContext<Self>) -> Option<TransactionId> {
         self.end_transaction_at(Instant::now(), cx)
     }
 
+    /// Terminates the current transaction, providing the current time. Subsequent transactions
+    /// that occur within a short period of time will be grouped together. This
+    /// is controlled by the buffer's undo grouping duration.
+    ///
+    /// See [`Buffer::set_group_interval`].
     pub fn end_transaction_at(
         &mut self,
         now: Instant,
@@ -1411,26 +1578,33 @@ impl Buffer {
         }
     }
 
+    /// Manually add a transaction to the buffer's undo history.
     pub fn push_transaction(&mut self, transaction: Transaction, now: Instant) {
         self.text.push_transaction(transaction, now);
     }
 
+    /// Prevent the last transaction from being grouped with any subsequent transactions,
+    /// even if they occur with the buffer's undo grouping duration.
     pub fn finalize_last_transaction(&mut self) -> Option<&Transaction> {
         self.text.finalize_last_transaction()
     }
 
+    /// Manually group all changes since a given transaction.
     pub fn group_until_transaction(&mut self, transaction_id: TransactionId) {
         self.text.group_until_transaction(transaction_id);
     }
 
+    /// Manually remove a transaction from the buffer's undo history
     pub fn forget_transaction(&mut self, transaction_id: TransactionId) {
         self.text.forget_transaction(transaction_id);
     }
 
+    /// Manually merge two adjacent transactions in the buffer's undo history.
     pub fn merge_transactions(&mut self, transaction: TransactionId, destination: TransactionId) {
         self.text.merge_transactions(transaction, destination);
     }
 
+    /// Waits for the buffer to receive operations with the given timestamps.
     pub fn wait_for_edits(
         &mut self,
         edit_ids: impl IntoIterator<Item = clock::Lamport>,
@@ -1438,6 +1612,7 @@ impl Buffer {
         self.text.wait_for_edits(edit_ids)
     }
 
+    /// Waits for the buffer to receive the operations necessary for resolving the given anchors.
     pub fn wait_for_anchors(
         &mut self,
         anchors: impl IntoIterator<Item = Anchor>,
@@ -1445,14 +1620,18 @@ impl Buffer {
         self.text.wait_for_anchors(anchors)
     }
 
+    /// Waits for the buffer to receive operations up to the given version.
     pub fn wait_for_version(&mut self, version: clock::Global) -> impl Future<Output = Result<()>> {
         self.text.wait_for_version(version)
     }
 
+    /// Forces all futures returned by [`Buffer::wait_for_version`], [`Buffer::wait_for_edits`], or
+    /// [`Buffer::wait_for_version`] to resolve with an error.
     pub fn give_up_waiting(&mut self) {
         self.text.give_up_waiting();
     }
 
+    /// Stores a set of selections that should be broadcasted to all of the buffer's replicas.
     pub fn set_active_selections(
         &mut self,
         selections: Arc<[Selection<Anchor>]>,
@@ -1481,6 +1660,8 @@ impl Buffer {
         );
     }
 
+    /// Clears the selections, so that other replicas of the buffer do not see any selections for
+    /// this replica.
     pub fn remove_active_selections(&mut self, cx: &mut ModelContext<Self>) {
         if self
             .remote_selections
@@ -1491,6 +1672,7 @@ impl Buffer {
         }
     }
 
+    /// Replaces the buffer's entire text.
     pub fn set_text<T>(&mut self, text: T, cx: &mut ModelContext<Self>) -> Option<clock::Lamport>
     where
         T: Into<Arc<str>>,
@@ -1499,6 +1681,15 @@ impl Buffer {
         self.edit([(0..self.len(), text)], None, cx)
     }
 
+    /// Applies the given edits to the buffer. Each edit is specified as a range of text to
+    /// delete, and a string of text to insert at that location.
+    ///
+    /// If an [`AutoindentMode`] is provided, then the buffer will enqueue an auto-indent
+    /// request for the edited ranges, which will be processed when the buffer finishes
+    /// parsing.
+    ///
+    /// Parsing takes place at the end of a transaction, and may compute synchronously
+    /// or asynchronously, depending on the changes.
     pub fn edit<I, S, T>(
         &mut self,
         edits_iter: I,
@@ -1632,6 +1823,7 @@ impl Buffer {
         cx.notify();
     }
 
+    /// Applies the given remote operations to the buffer.
     pub fn apply_ops<I: IntoIterator<Item = Operation>>(
         &mut self,
         ops: I,
@@ -1779,11 +1971,13 @@ impl Buffer {
         cx.emit(Event::Operation(operation));
     }
 
+    /// Removes the selections for a given peer.
     pub fn remove_peer(&mut self, replica_id: ReplicaId, cx: &mut ModelContext<Self>) {
         self.remote_selections.remove(&replica_id);
         cx.notify();
     }
 
+    /// Undoes the most recent transaction.
     pub fn undo(&mut self, cx: &mut ModelContext<Self>) -> Option<TransactionId> {
         let was_dirty = self.is_dirty();
         let old_version = self.version.clone();
@@ -1797,6 +1991,7 @@ impl Buffer {
         }
     }
 
+    /// Manually undoes a specific transaction in the buffer's undo history.
     pub fn undo_transaction(
         &mut self,
         transaction_id: TransactionId,
@@ -1813,6 +2008,7 @@ impl Buffer {
         }
     }
 
+    /// Manually undoes all changes after a given transaction in the buffer's undo history.
     pub fn undo_to_transaction(
         &mut self,
         transaction_id: TransactionId,
@@ -1832,6 +2028,7 @@ impl Buffer {
         undone
     }
 
+    /// Manually redoes a specific transaction in the buffer's redo history.
     pub fn redo(&mut self, cx: &mut ModelContext<Self>) -> Option<TransactionId> {
         let was_dirty = self.is_dirty();
         let old_version = self.version.clone();
@@ -1845,6 +2042,7 @@ impl Buffer {
         }
     }
 
+    /// Manually undoes all changes until a given transaction in the buffer's redo history.
     pub fn redo_to_transaction(
         &mut self,
         transaction_id: TransactionId,
@@ -1864,6 +2062,7 @@ impl Buffer {
         redone
     }
 
+    /// Override current completion triggers with the user-provided completion triggers.
     pub fn set_completion_triggers(&mut self, triggers: Vec<String>, cx: &mut ModelContext<Self>) {
         self.completion_triggers = triggers.clone();
         self.completion_triggers_timestamp = self.text.lamport_clock.tick();
@@ -1877,11 +2076,14 @@ impl Buffer {
         cx.notify();
     }
 
+    /// Returns a list of strings which trigger a completion menu for this language.
+    /// Usually this is driven by LSP server which returns a list of trigger characters for completions.
     pub fn completion_triggers(&self) -> &[String] {
         &self.completion_triggers
     }
 }
 
+#[doc(hidden)]
 #[cfg(any(test, feature = "test-support"))]
 impl Buffer {
     pub fn edit_via_marked_text(
@@ -1954,10 +2156,12 @@ impl Deref for Buffer {
 }
 
 impl BufferSnapshot {
+    /// Returns [`IndentSize`] for a given line that respects user settings and /// language preferences.
     pub fn indent_size_for_line(&self, row: u32) -> IndentSize {
         indent_size_for_line(self, row)
     }
-
+    /// Returns [`IndentSize`] for a given position that respects user settings
+    /// and language preferences.
     pub fn language_indent_size_at<T: ToOffset>(&self, position: T, cx: &AppContext) -> IndentSize {
         let settings = language_settings(self.language_at(position), self.file(), cx);
         if settings.hard_tabs {
@@ -1967,6 +2171,8 @@ impl BufferSnapshot {
         }
     }
 
+    /// Retrieve the suggested indent size for all of the given rows. The unit of indentation
+    /// is passed in as `single_indent_size`.
     pub fn suggested_indents(
         &self,
         rows: impl Iterator<Item = u32>,
@@ -2213,6 +2419,10 @@ impl BufferSnapshot {
         None
     }
 
+    /// Iterates over chunks of text in the given range of the buffer. Text is chunked
+    /// in an arbitrary way due to being stored in a [`rope::Rope`]. The text is also
+    /// returned in chunks where each chunk has a single syntax highlighting style and
+    /// diagnostic status.
     pub fn chunks<T: ToOffset>(&self, range: Range<T>, language_aware: bool) -> BufferChunks {
         let range = range.start.to_offset(self)..range.end.to_offset(self);
 
@@ -2249,7 +2459,9 @@ impl BufferSnapshot {
         BufferChunks::new(self.text.as_rope(), range, syntax, diagnostic_endpoints)
     }
 
-    pub fn for_each_line(&self, range: Range<Point>, mut callback: impl FnMut(u32, &str)) {
+    /// Invokes the given callback for each line of text in the given range of the buffer.
+    /// Uses callback to avoid allocating a string for each line.
+    fn for_each_line(&self, range: Range<Point>, mut callback: impl FnMut(u32, &str)) {
         let mut line = String::new();
         let mut row = range.start.row;
         for chunk in self
@@ -2268,11 +2480,12 @@ impl BufferSnapshot {
         }
     }
 
-    pub fn syntax_layers(&self) -> impl Iterator<Item = SyntaxLayerInfo> + '_ {
+    /// Iterates over every [`SyntaxLayer`] in the buffer.
+    pub fn syntax_layers(&self) -> impl Iterator<Item = SyntaxLayer> + '_ {
         self.syntax.layers_for_range(0..self.len(), &self.text)
     }
 
-    pub fn syntax_layer_at<D: ToOffset>(&self, position: D) -> Option<SyntaxLayerInfo> {
+    fn syntax_layer_at<D: ToOffset>(&self, position: D) -> Option<SyntaxLayer> {
         let offset = position.to_offset(self);
         self.syntax
             .layers_for_range(offset..offset, &self.text)
@@ -2280,12 +2493,14 @@ impl BufferSnapshot {
             .last()
     }
 
+    /// Returns the [Language] at the given location.
     pub fn language_at<D: ToOffset>(&self, position: D) -> Option<&Arc<Language>> {
         self.syntax_layer_at(position)
             .map(|info| info.language)
             .or(self.language.as_ref())
     }
 
+    /// Returns the settings for the language at the given location.
     pub fn settings_at<'a, D: ToOffset>(
         &self,
         position: D,
@@ -2294,6 +2509,7 @@ impl BufferSnapshot {
         language_settings(self.language_at(position), self.file.as_ref(), cx)
     }
 
+    /// Returns the [LanguageScope] at the given location.
     pub fn language_scope_at<D: ToOffset>(&self, position: D) -> Option<LanguageScope> {
         let offset = position.to_offset(self);
         let mut scope = None;
@@ -2338,6 +2554,8 @@ impl BufferSnapshot {
         })
     }
 
+    /// Returns a tuple of the range and character kind of the word
+    /// surrounding the given position.
     pub fn surrounding_word<T: ToOffset>(&self, start: T) -> (Range<usize>, Option<CharKind>) {
         let mut start = start.to_offset(self);
         let mut end = start;
@@ -2370,6 +2588,7 @@ impl BufferSnapshot {
         (start..end, word_kind)
     }
 
+    /// Returns the range for the closes syntax node enclosing the given range.
     pub fn range_for_syntax_ancestor<T: ToOffset>(&self, range: Range<T>) -> Option<Range<usize>> {
         let range = range.start.to_offset(self)..range.end.to_offset(self);
         let mut result: Option<Range<usize>> = None;
@@ -2438,11 +2657,19 @@ impl BufferSnapshot {
         result
     }
 
+    /// Returns the outline for the buffer.
+    ///
+    /// This method allows passing an optional [SyntaxTheme] to
+    /// syntax-highlight the returned symbols.
     pub fn outline(&self, theme: Option<&SyntaxTheme>) -> Option<Outline<Anchor>> {
         self.outline_items_containing(0..self.len(), true, theme)
             .map(Outline::new)
     }
 
+    /// Returns all the symbols that contain the given position.
+    ///
+    /// This method allows passing an optional [SyntaxTheme] to
+    /// syntax-highlight the returned symbols.
     pub fn symbols_containing<T: ToOffset>(
         &self,
         position: T,

crates/language/src/diagnostic_set.rs 🔗

@@ -9,20 +9,36 @@ use std::{
 use sum_tree::{self, Bias, SumTree};
 use text::{Anchor, FromAnchor, PointUtf16, ToOffset};
 
+/// A set of diagnostics associated with a given buffer, provided
+/// by a single language server.
+///
+/// The diagnostics are stored in a [SumTree], which allows this struct
+/// to be cheaply copied, and allows for efficient retrieval of the
+/// diagnostics that intersect a given range of the buffer.
 #[derive(Clone, Debug, Default)]
 pub struct DiagnosticSet {
     diagnostics: SumTree<DiagnosticEntry<Anchor>>,
 }
 
+/// A single diagnostic in a set. Generic over its range type, because
+/// the diagnostics are stored internally as [Anchor]s, but can be
+/// resolved to different coordinates types like [usize] byte offsets or
+/// [Point]s.
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub struct DiagnosticEntry<T> {
+    /// The range of the buffer where the diagnostic applies.
     pub range: Range<T>,
+    /// The information about the diagnostic.
     pub diagnostic: Diagnostic,
 }
 
+/// A group of related diagnostics, ordered by their start position
+/// in the buffer.
 #[derive(Debug)]
 pub struct DiagnosticGroup<T> {
+    /// The diagnostics.
     pub entries: Vec<DiagnosticEntry<T>>,
+    /// The index into `entries` where the primary diagnostic is stored.
     pub primary_ix: usize,
 }
 
@@ -36,7 +52,8 @@ pub struct Summary {
 }
 
 impl<T> DiagnosticEntry<T> {
-    // Used to provide diagnostic context to lsp codeAction request
+    /// Returns a raw LSP diagnostic ssed to provide diagnostic context to lsp
+    /// codeAction request
     pub fn to_lsp_diagnostic_stub(&self) -> lsp::Diagnostic {
         let code = self
             .diagnostic
@@ -53,6 +70,8 @@ impl<T> DiagnosticEntry<T> {
 }
 
 impl DiagnosticSet {
+    /// Constructs a [DiagnosticSet] from a sequence of entries, ordered by
+    /// their position in the buffer.
     pub fn from_sorted_entries<I>(iter: I, buffer: &text::BufferSnapshot) -> Self
     where
         I: IntoIterator<Item = DiagnosticEntry<Anchor>>,
@@ -62,6 +81,7 @@ impl DiagnosticSet {
         }
     }
 
+    /// Constructs a [DiagnosticSet] from a sequence of entries in an arbitrary order.
     pub fn new<I>(iter: I, buffer: &text::BufferSnapshot) -> Self
     where
         I: IntoIterator<Item = DiagnosticEntry<PointUtf16>>,
@@ -80,14 +100,18 @@ impl DiagnosticSet {
         }
     }
 
+    /// Returns the number of diagnostics in the set.
     pub fn len(&self) -> usize {
         self.diagnostics.summary().count
     }
 
+    /// Returns an iterator over the diagnostic entries in the set.
     pub fn iter(&self) -> impl Iterator<Item = &DiagnosticEntry<Anchor>> {
         self.diagnostics.iter()
     }
 
+    /// Returns an iterator over the diagnostic entries that intersect the
+    /// given range of the buffer.
     pub fn range<'a, T, O>(
         &'a self,
         range: Range<T>,
@@ -134,6 +158,7 @@ impl DiagnosticSet {
         })
     }
 
+    /// Adds all of this set's diagnostic groups to the given output vector.
     pub fn groups(
         &self,
         language_server_id: LanguageServerId,
@@ -173,6 +198,8 @@ impl DiagnosticSet {
         });
     }
 
+    /// Returns all of the diagnostics in a particular diagnostic group,
+    /// in order of their position in the buffer.
     pub fn group<'a, O: FromAnchor>(
         &'a self,
         group_id: usize,
@@ -183,6 +210,7 @@ impl DiagnosticSet {
             .map(|entry| entry.resolve(buffer))
     }
 }
+
 impl sum_tree::Item for DiagnosticEntry<Anchor> {
     type Summary = Summary;
 
@@ -198,6 +226,7 @@ impl sum_tree::Item for DiagnosticEntry<Anchor> {
 }
 
 impl DiagnosticEntry<Anchor> {
+    /// Converts the [DiagnosticEntry] to a different buffer coordinate type.
     pub fn resolve<O: FromAnchor>(&self, buffer: &text::BufferSnapshot) -> DiagnosticEntry<O> {
         DiagnosticEntry {
             range: O::from_anchor(&self.range.start, buffer)

crates/language/src/highlight_map.rs 🔗

@@ -11,7 +11,7 @@ pub struct HighlightId(pub u32);
 const DEFAULT_SYNTAX_HIGHLIGHT_ID: HighlightId = HighlightId(u32::MAX);
 
 impl HighlightMap {
-    pub fn new(capture_names: &[&str], theme: &SyntaxTheme) -> Self {
+    pub(crate) fn new(capture_names: &[&str], theme: &SyntaxTheme) -> Self {
         // For each capture name in the highlight query, find the longest
         // key in the theme's syntax styles that matches all of the
         // dot-separated components of the capture name.
@@ -51,7 +51,7 @@ impl HighlightMap {
 }
 
 impl HighlightId {
-    pub fn is_default(&self) -> bool {
+    pub(crate) fn is_default(&self) -> bool {
         *self == DEFAULT_SYNTAX_HIGHLIGHT_ID
     }
 

crates/language/src/language.rs 🔗

@@ -1,3 +1,11 @@
+//! The `language` crate provides a large chunk of Zed's language-related
+//! features (the other big contributors being project and lsp crates that revolve around LSP features).
+//! Namely, this crate:
+//! - Provides [`Language`], [`Grammar`] and [`LanguageRegistry`] types that
+//! use Tree-sitter to provide syntax highlighting to the editor; note though that `language` doesn't perform the highlighting by itself. It only maps ranges in a buffer to colors. Treesitter is also used for buffer outlines (lists of symbols in a buffer)
+//! - Exposes [`LanguageConfig`] that describes how constructs (like brackets or line comments) should be handled by the editor for a source file of a particular language.
+//!
+//! Notably we do *not* assign a single language to a single file; in real world a single file can consist of multiple programming languages - HTML is a good example of that - and `language` crate tends to reflect that status quo in it's API.
 mod buffer;
 mod diagnostic_set;
 mod highlight_map;
@@ -54,10 +62,13 @@ pub use buffer::*;
 pub use diagnostic_set::DiagnosticEntry;
 pub use lsp::LanguageServerId;
 pub use outline::{Outline, OutlineItem};
-pub use syntax_map::{OwnedSyntaxLayerInfo, SyntaxLayerInfo};
+pub use syntax_map::{OwnedSyntaxLayer, SyntaxLayer};
 pub use text::LineEnding;
 pub use tree_sitter::{Parser, Tree};
 
+/// Initializes the `language` crate.
+///
+/// This should be called before making use of items from the create.
 pub fn init(cx: &mut AppContext) {
     language_settings::init(cx);
 }
@@ -90,7 +101,9 @@ thread_local! {
 }
 
 lazy_static! {
-    pub static ref NEXT_GRAMMAR_ID: AtomicUsize = Default::default();
+    pub(crate) static ref NEXT_GRAMMAR_ID: AtomicUsize = Default::default();
+    /// A shared grammar for plain text, exposed for reuse by downstream crates.
+    #[doc(hidden)]
     pub static ref PLAIN_TEXT: Arc<Language> = Arc::new(Language::new(
         LanguageConfig {
             name: "Plain Text".into(),
@@ -100,10 +113,14 @@ lazy_static! {
     ));
 }
 
+/// Types that represent a position in a buffer, and can be converted into
+/// an LSP position, to send to a language server.
 pub trait ToLspPosition {
+    /// Converts the value into an LSP position.
     fn to_lsp_position(self) -> lsp::Position;
 }
 
+/// A name of a language server.
 #[derive(Clone, Debug, PartialEq, Eq, Hash)]
 pub struct LanguageServerName(pub Arc<str>);
 
@@ -239,6 +256,8 @@ impl CachedLspAdapter {
     }
 }
 
+/// [`LspAdapterDelegate`] allows [`LspAdapter]` implementations to interface with the application
+// e.g. to display a notification or fetch data from the web.
 pub trait LspAdapterDelegate: Send + Sync {
     fn show_notification(&self, message: &str, cx: &mut AppContext);
     fn http_client(&self) -> Arc<dyn HttpClient>;
@@ -284,6 +303,10 @@ pub trait LspAdapter: 'static + Send + Sync {
         delegate: &dyn LspAdapterDelegate,
     ) -> Option<LanguageServerBinary>;
 
+    /// Returns true if a language server can be reinstalled.
+    /// If language server initialization fails, a reinstallation will be attempted unless the value returned from this method is false.
+    /// Implementations that rely on software already installed on user's system
+    /// should have [`can_be_reinstalled`] return false.
     fn can_be_reinstalled(&self) -> bool {
         true
     }
@@ -295,6 +318,9 @@ pub trait LspAdapter: 'static + Send + Sync {
 
     fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {}
 
+    /// A callback called for each [`lsp_types::CompletionItem`] obtained from LSP server.
+    /// Some LspAdapter implementations might want to modify the obtained item to
+    /// change how it's displayed.
     async fn process_completion(&self, _: &mut lsp::CompletionItem) {}
 
     async fn label_for_completion(
@@ -314,6 +340,7 @@ pub trait LspAdapter: 'static + Send + Sync {
         None
     }
 
+    /// Returns initialization options that are going to be sent to a LSP server as a part of [`lsp_types::InitializeParams`]
     async fn initialization_options(&self) -> Option<Value> {
         None
     }
@@ -322,6 +349,7 @@ pub trait LspAdapter: 'static + Send + Sync {
         futures::future::ready(serde_json::json!({})).boxed()
     }
 
+    /// Returns a list of code actions supported by a given LspAdapter
     fn code_action_kinds(&self) -> Option<Vec<CodeActionKind>> {
         Some(vec![
             CodeActionKind::EMPTY,
@@ -358,36 +386,59 @@ pub struct CodeLabel {
 
 #[derive(Clone, Deserialize)]
 pub struct LanguageConfig {
+    /// Human-readable name of the language.
     pub name: Arc<str>,
+    // The name of the grammar in a WASM bundle (experimental).
     pub grammar_name: Option<Arc<str>>,
+    /// Given a list of `LanguageConfig`'s, the language of a file can be determined based on the path extension matching any of the `path_suffixes`.
     pub path_suffixes: Vec<String>,
+    /// List of bracket types in a language.
     pub brackets: BracketPairConfig,
+    /// A regex pattern that determines whether the language should be assigned to a file or not.
     #[serde(default, deserialize_with = "deserialize_regex")]
     pub first_line_pattern: Option<Regex>,
+    /// If set to true, auto indentation uses last non empty line to determine
+    /// the indentation level for a new line.
     #[serde(default = "auto_indent_using_last_non_empty_line_default")]
     pub auto_indent_using_last_non_empty_line: bool,
+    /// A regex that is used to determine whether the indentation level should be
+    /// increased in the following line.
     #[serde(default, deserialize_with = "deserialize_regex")]
     pub increase_indent_pattern: Option<Regex>,
+    /// A regex that is used to determine whether the indentation level should be
+    /// decreased in the following line.
     #[serde(default, deserialize_with = "deserialize_regex")]
     pub decrease_indent_pattern: Option<Regex>,
+    /// A list of characters that trigger the automatic insertion of a closing
+    /// bracket when they immediately precede the point where an opening
+    /// bracket is inserted.
     #[serde(default)]
     pub autoclose_before: String,
-    #[serde(default)]
-    pub line_comment: Option<Arc<str>>,
+    /// A placeholder used internally by Semantic Index.
     #[serde(default)]
     pub collapsed_placeholder: String,
+    /// A line comment string that is inserted in e.g. `toggle comments` action.
+    #[serde(default)]
+    pub line_comment: Option<Arc<str>>,
+    /// Starting and closing characters of a block comment.
     #[serde(default)]
     pub block_comment: Option<(Arc<str>, Arc<str>)>,
+    /// A list of language servers that are allowed to run on subranges of a given language.
     #[serde(default)]
     pub scope_opt_in_language_servers: Vec<String>,
     #[serde(default)]
     pub overrides: HashMap<String, LanguageConfigOverride>,
+    /// A list of characters that Zed should treat as word characters for the
+    /// purpose of features that operate on word boundaries, like 'move to next word end'
+    /// or a whole-word search in buffer search.
     #[serde(default)]
     pub word_characters: HashSet<char>,
+    /// The name of a Prettier parser that should be used for this language.
     #[serde(default)]
     pub prettier_parser_name: Option<String>,
 }
 
+/// Tree-sitter language queries for a given language.
 #[derive(Debug, Default)]
 pub struct LanguageQueries {
     pub highlights: Option<Cow<'static, str>>,
@@ -399,6 +450,9 @@ pub struct LanguageQueries {
     pub overrides: Option<Cow<'static, str>>,
 }
 
+/// Represents a language for the given range. Some languages (e.g. HTML)
+/// interleave several languages together, thus a single buffer might actually contain
+/// several nested scopes.
 #[derive(Clone, Debug)]
 pub struct LanguageScope {
     language: Arc<Language>,
@@ -458,9 +512,9 @@ impl Default for LanguageConfig {
             block_comment: Default::default(),
             scope_opt_in_language_servers: Default::default(),
             overrides: Default::default(),
-            collapsed_placeholder: Default::default(),
             word_characters: Default::default(),
             prettier_parser_name: None,
+            collapsed_placeholder: Default::default(),
         }
     }
 }
@@ -478,6 +532,7 @@ fn deserialize_regex<'de, D: Deserializer<'de>>(d: D) -> Result<Option<Regex>, D
     }
 }
 
+#[doc(hidden)]
 #[cfg(any(test, feature = "test-support"))]
 pub struct FakeLspAdapter {
     pub name: &'static str,
@@ -489,9 +544,16 @@ pub struct FakeLspAdapter {
     pub prettier_plugins: Vec<&'static str>,
 }
 
+/// Configuration of handling bracket pairs for a given language.
+///
+/// This struct includes settings for defining which pairs of characters are considered brackets and
+/// also specifies any language-specific scopes where these pairs should be ignored for bracket matching purposes.
 #[derive(Clone, Debug, Default)]
 pub struct BracketPairConfig {
+    /// A list of character pairs that should be treated as brackets in the context of a given language.
     pub pairs: Vec<BracketPair>,
+    /// A list of tree-sitter scopes for which a given bracket should not be active.
+    /// N-th entry in `[Self::disabled_scopes_by_bracket_ix]` contains a list of disabled scopes for an n-th entry in `[Self::pairs]`
     pub disabled_scopes_by_bracket_ix: Vec<Vec<String>>,
 }
 
@@ -523,11 +585,18 @@ impl<'de> Deserialize<'de> for BracketPairConfig {
     }
 }
 
+/// Describes a single bracket pair and how an editor should react to e.g. inserting
+/// an opening bracket or to a newline character insertion inbetween `start` and `end` characters.
 #[derive(Clone, Debug, Default, Deserialize, PartialEq)]
 pub struct BracketPair {
+    /// Starting substring for a bracket.
     pub start: String,
+    /// Ending substring for a bracket.
     pub end: String,
+    /// True if `end` should be automatically inserted right after `start` characters.
     pub close: bool,
+    /// True if an extra newline should be inserted while the cursor is in the middle
+    /// of that bracket pair.
     pub newline: bool,
 }
 
@@ -1641,6 +1710,8 @@ impl LanguageScope {
         self.language.config.collapsed_placeholder.as_ref()
     }
 
+    /// Returns line prefix that is inserted in e.g. line continuations or
+    /// in `toggle comments` action.
     pub fn line_comment_prefix(&self) -> Option<&Arc<str>> {
         Override::as_option(
             self.config_override().map(|o| &o.line_comment),
@@ -1656,6 +1727,11 @@ impl LanguageScope {
         .map(|e| (&e.0, &e.1))
     }
 
+    /// Returns a list of language-specific word characters.
+    ///
+    /// By default, Zed treats alphanumeric characters (and '_') as word characters for
+    /// the purpose of actions like 'move to next word end` or whole-word search.
+    /// It additionally accounts for language's additional word characters.
     pub fn word_characters(&self) -> Option<&HashSet<char>> {
         Override::as_option(
             self.config_override().map(|o| &o.word_characters),
@@ -1663,6 +1739,8 @@ impl LanguageScope {
         )
     }
 
+    /// Returns a list of bracket pairs for a given language with an additional
+    /// piece of information about whether the particular bracket pair is currently active for a given language.
     pub fn brackets(&self) -> impl Iterator<Item = (&BracketPair, bool)> {
         let mut disabled_ids = self
             .config_override()

crates/language/src/language_settings.rs 🔗

@@ -1,3 +1,5 @@
+//! Provides `language`-related settings.
+
 use crate::{File, Language};
 use anyhow::Result;
 use collections::{HashMap, HashSet};
@@ -11,10 +13,12 @@ use serde::{Deserialize, Serialize};
 use settings::Settings;
 use std::{num::NonZeroU32, path::Path, sync::Arc};
 
+/// Initializes the language settings.
 pub fn init(cx: &mut AppContext) {
     AllLanguageSettings::register(cx);
 }
 
+/// Returns the settings for the specified language from the provided file.
 pub fn language_settings<'a>(
     language: Option<&Arc<Language>>,
     file: Option<&Arc<dyn File>>,
@@ -24,6 +28,7 @@ pub fn language_settings<'a>(
     all_language_settings(file, cx).language(language_name.as_deref())
 }
 
+/// Returns the settings for all languages from the provided file.
 pub fn all_language_settings<'a>(
     file: Option<&Arc<dyn File>>,
     cx: &'a AppContext,
@@ -32,51 +37,89 @@ pub fn all_language_settings<'a>(
     AllLanguageSettings::get(location, cx)
 }
 
+/// The settings for all languages.
 #[derive(Debug, Clone)]
 pub struct AllLanguageSettings {
+    /// The settings for GitHub Copilot.
     pub copilot: CopilotSettings,
     defaults: LanguageSettings,
     languages: HashMap<Arc<str>, LanguageSettings>,
 }
 
+/// The settings for a particular language.
 #[derive(Debug, Clone, Deserialize)]
 pub struct LanguageSettings {
+    /// How many columns a tab should occupy.
     pub tab_size: NonZeroU32,
+    /// Whether to indent lines using tab characters, as opposed to multiple
+    /// spaces.
     pub hard_tabs: bool,
+    /// How to soft-wrap long lines of text.
     pub soft_wrap: SoftWrap,
+    /// The column at which to soft-wrap lines, for buffers where soft-wrap
+    /// is enabled.
     pub preferred_line_length: u32,
+    /// Whether to show wrap guides in the editor. Setting this to true will
+    /// show a guide at the 'preferred_line_length' value if softwrap is set to
+    /// 'preferred_line_length', and will show any additional guides as specified
+    /// by the 'wrap_guides' setting.
     pub show_wrap_guides: bool,
+    /// Character counts at which to show wrap guides in the editor.
     pub wrap_guides: Vec<usize>,
+    /// Whether or not to perform a buffer format before saving.
     pub format_on_save: FormatOnSave,
+    /// Whether or not to remove any trailing whitespace from lines of a buffer
+    /// before saving it.
     pub remove_trailing_whitespace_on_save: bool,
+    /// Whether or not to ensure there's a single newline at the end of a buffer
+    /// when saving it.
     pub ensure_final_newline_on_save: bool,
+    /// How to perform a buffer format.
     pub formatter: Formatter,
+    /// Zed's Prettier integration settings.
+    /// If Prettier is enabled, Zed will use this its Prettier instance for any applicable file, if
+    /// the project has no other Prettier installed.
     pub prettier: HashMap<String, serde_json::Value>,
+    /// Whether to use language servers to provide code intelligence.
     pub enable_language_server: bool,
+    /// Controls whether Copilot provides suggestion immediately (true)
+    /// or waits for a `copilot::Toggle` (false).
     pub show_copilot_suggestions: bool,
+    /// Whether to show tabs and spaces in the editor.
     pub show_whitespaces: ShowWhitespaceSetting,
+    /// Whether to start a new line with a comment when a previous line is a comment as well.
     pub extend_comment_on_newline: bool,
+    /// Inlay hint related settings.
     pub inlay_hints: InlayHintSettings,
 }
 
+/// The settings for [GitHub Copilot](https://github.com/features/copilot).
 #[derive(Clone, Debug, Default)]
 pub struct CopilotSettings {
+    /// Whether Copilot is enabled.
     pub feature_enabled: bool,
+    /// A list of globs representing files that Copilot should be disabled for.
     pub disabled_globs: Vec<GlobMatcher>,
 }
 
+/// The settings for all languages.
 #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
 pub struct AllLanguageSettingsContent {
+    /// The settings for enabling/disabling features.
     #[serde(default)]
     pub features: Option<FeaturesContent>,
+    /// The settings for GitHub Copilot.
     #[serde(default)]
     pub copilot: Option<CopilotSettingsContent>,
+    /// The default language settings.
     #[serde(flatten)]
     pub defaults: LanguageSettingsContent,
+    /// The settings for individual languages.
     #[serde(default, alias = "language_overrides")]
     pub languages: HashMap<Arc<str>, LanguageSettingsContent>,
 }
 
+/// The settings for a particular language.
 #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
 pub struct LanguageSettingsContent {
     /// How many columns a tab should occupy.
@@ -138,7 +181,7 @@ pub struct LanguageSettingsContent {
     pub formatter: Option<Formatter>,
     /// Zed's Prettier integration settings.
     /// If Prettier is enabled, Zed will use this its Prettier instance for any applicable file, if
-    /// project has no other Prettier installed.
+    /// the project has no other Prettier installed.
     ///
     /// Default: {}
     #[serde(default)]
@@ -148,7 +191,7 @@ pub struct LanguageSettingsContent {
     /// Default: true
     #[serde(default)]
     pub enable_language_server: Option<bool>,
-    /// Controls whether copilot provides suggestion immediately (true)
+    /// Controls whether Copilot provides suggestion immediately (true)
     /// or waits for a `copilot::Toggle` (false).
     ///
     /// Default: true
@@ -167,18 +210,23 @@ pub struct LanguageSettingsContent {
     pub inlay_hints: Option<InlayHintSettings>,
 }
 
+/// The contents of the GitHub Copilot settings.
 #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
 pub struct CopilotSettingsContent {
+    /// A list of globs representing files that Copilot should be disabled for.
     #[serde(default)]
     pub disabled_globs: Option<Vec<String>>,
 }
 
+/// The settings for enabling/disabling features.
 #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub struct FeaturesContent {
+    /// Whether the GitHub Copilot feature is enabled.
     pub copilot: Option<bool>,
 }
 
+/// Controls the soft-wrapping behavior in the editor.
 #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub enum SoftWrap {
@@ -190,29 +238,38 @@ pub enum SoftWrap {
     PreferredLineLength,
 }
 
+/// Controls the behavior of formatting files when they are saved.
 #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub enum FormatOnSave {
+    /// Files should be formatted on save.
     On,
+    /// Files should not be formatted on save.
     Off,
+    /// Files should be formatted using the current language server.
     LanguageServer,
+    /// The external program to use to format the files on save.
     External {
+        /// The external program to run.
         command: Arc<str>,
+        /// The arguments to pass to the program.
         arguments: Arc<[String]>,
     },
 }
 
+/// Controls how whitespace should be displayedin the editor.
 #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub enum ShowWhitespaceSetting {
-    /// Draw tabs and spaces only for the selected text.
+    /// Draw whitespace only for the selected text.
     Selection,
-    /// Do not draw any tabs or spaces
+    /// Do not draw any tabs or spaces.
     None,
-    /// Draw all invisible symbols
+    /// Draw all invisible symbols.
     All,
 }
 
+/// Controls which formatter should be used when formatting code.
 #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
 #[serde(rename_all = "snake_case")]
 pub enum Formatter {
@@ -226,11 +283,14 @@ pub enum Formatter {
     Prettier,
     /// Format code using an external command.
     External {
+        /// The external program to run.
         command: Arc<str>,
+        /// The arguments to pass to the program.
         arguments: Arc<[String]>,
     },
 }
 
+/// The settings for inlay hints.
 #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
 pub struct InlayHintSettings {
     /// Global switch to toggle hints on and off.
@@ -238,10 +298,19 @@ pub struct InlayHintSettings {
     /// Default: false
     #[serde(default)]
     pub enabled: bool,
+    /// Whether type hints should be shown.
+    ///
+    /// Default: true
     #[serde(default = "default_true")]
     pub show_type_hints: bool,
+    /// Whether parameter hints should be shown.
+    ///
+    /// Default: true
     #[serde(default = "default_true")]
     pub show_parameter_hints: bool,
+    /// Whether other hints should be shown.
+    ///
+    /// Default: true
     #[serde(default = "default_true")]
     pub show_other_hints: bool,
 }
@@ -251,6 +320,7 @@ fn default_true() -> bool {
 }
 
 impl InlayHintSettings {
+    /// Returns the kinds of inlay hints that are enabled based on the settings.
     pub fn enabled_inlay_hint_kinds(&self) -> HashSet<Option<InlayHintKind>> {
         let mut kinds = HashSet::default();
         if self.show_type_hints {
@@ -267,6 +337,7 @@ impl InlayHintSettings {
 }
 
 impl AllLanguageSettings {
+    /// Returns the [`LanguageSettings`] for the language with the specified name.
     pub fn language<'a>(&'a self, language_name: Option<&str>) -> &'a LanguageSettings {
         if let Some(name) = language_name {
             if let Some(overrides) = self.languages.get(name) {
@@ -276,6 +347,7 @@ impl AllLanguageSettings {
         &self.defaults
     }
 
+    /// Returns whether GitHub Copilot is enabled for the given path.
     pub fn copilot_enabled_for_path(&self, path: &Path) -> bool {
         !self
             .copilot
@@ -284,6 +356,7 @@ impl AllLanguageSettings {
             .any(|glob| glob.is_match(path))
     }
 
+    /// Returns whether GitHub Copilot is enabled for the given language and path.
     pub fn copilot_enabled(&self, language: Option<&Arc<Language>>, path: Option<&Path>) -> bool {
         if !self.copilot.feature_enabled {
             return false;
@@ -300,13 +373,20 @@ impl AllLanguageSettings {
     }
 }
 
+/// The kind of an inlay hint.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum InlayHintKind {
+    /// An inlay hint for a type.
     Type,
+    /// An inlay hint for a parameter.
     Parameter,
 }
 
 impl InlayHintKind {
+    /// Returns the [`InlayHintKind`] from the given name.
+    ///
+    /// Returns `None` if `name` does not match any of the expected
+    /// string representations.
     pub fn from_name(name: &str) -> Option<Self> {
         match name {
             "type" => Some(InlayHintKind::Type),
@@ -315,6 +395,7 @@ impl InlayHintKind {
         }
     }
 
+    /// Returns the name of this [`InlayHintKind`].
     pub fn name(&self) -> &'static str {
         match self {
             InlayHintKind::Type => "type",

crates/language/src/markdown.rs 🔗

@@ -1,3 +1,5 @@
+//! Provides Markdown-related constructs.
+
 use std::sync::Arc;
 use std::{ops::Range, path::PathBuf};
 
@@ -5,21 +7,30 @@ use crate::{HighlightId, Language, LanguageRegistry};
 use gpui::{px, FontStyle, FontWeight, HighlightStyle, UnderlineStyle};
 use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag};
 
+/// Parsed Markdown content.
 #[derive(Debug, Clone)]
 pub struct ParsedMarkdown {
+    /// The Markdown text.
     pub text: String,
+    /// The list of highlights contained in the Markdown document.
     pub highlights: Vec<(Range<usize>, MarkdownHighlight)>,
+    /// The regions of the various ranges in the Markdown document.
     pub region_ranges: Vec<Range<usize>>,
+    /// The regions of the Markdown document.
     pub regions: Vec<ParsedRegion>,
 }
 
+/// A run of highlighted Markdown text.
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub enum MarkdownHighlight {
+    /// A styled Markdown highlight.
     Style(MarkdownHighlightStyle),
+    /// A highlighted code block.
     Code(HighlightId),
 }
 
 impl MarkdownHighlight {
+    /// Converts this [`MarkdownHighlight`] to a [`HighlightStyle`].
     pub fn to_highlight_style(&self, theme: &theme::SyntaxTheme) -> Option<HighlightStyle> {
         match self {
             MarkdownHighlight::Style(style) => {
@@ -48,23 +59,39 @@ impl MarkdownHighlight {
     }
 }
 
+/// The style for a Markdown highlight.
 #[derive(Debug, Clone, Default, PartialEq, Eq)]
 pub struct MarkdownHighlightStyle {
+    /// Whether the text should be italicized.
     pub italic: bool,
+    /// Whether the text should be underlined.
     pub underline: bool,
+    /// The weight of the text.
     pub weight: FontWeight,
 }
 
+/// A parsed region in a Markdown document.
 #[derive(Debug, Clone)]
 pub struct ParsedRegion {
+    /// Whether the region is a code block.
     pub code: bool,
+    /// The link contained in this region, if it has one.
     pub link: Option<Link>,
 }
 
+/// A Markdown link.
 #[derive(Debug, Clone)]
 pub enum Link {
-    Web { url: String },
-    Path { path: PathBuf },
+    /// A link to a webpage.
+    Web {
+        /// The URL of the webpage.
+        url: String,
+    },
+    /// A link to a path on the filesystem.
+    Path {
+        /// The path to the item.
+        path: PathBuf,
+    },
 }
 
 impl Link {
@@ -82,6 +109,7 @@ impl Link {
     }
 }
 
+/// Parses a string of Markdown.
 pub async fn parse_markdown(
     markdown: &str,
     language_registry: &Arc<LanguageRegistry>,
@@ -111,6 +139,7 @@ pub async fn parse_markdown(
     }
 }
 
+/// Parses a Markdown block.
 pub async fn parse_markdown_block(
     markdown: &str,
     language_registry: &Arc<LanguageRegistry>,
@@ -261,6 +290,7 @@ pub async fn parse_markdown_block(
     }
 }
 
+/// Appends a highlighted run of text to the provided `text` buffer.
 pub fn highlight_code(
     text: &mut String,
     highlights: &mut Vec<(Range<usize>, MarkdownHighlight)>,
@@ -275,6 +305,7 @@ pub fn highlight_code(
     }
 }
 
+/// Appends a new paragraph to the provided `text` buffer.
 pub fn new_paragraph(text: &mut String, list_stack: &mut Vec<(Option<u64>, bool)>) {
     let mut is_subsequent_paragraph_of_list = false;
     if let Some((_, has_content)) = list_stack.last_mut() {

crates/language/src/outline.rs 🔗

@@ -2,6 +2,7 @@ use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{BackgroundExecutor, HighlightStyle};
 use std::ops::Range;
 
+/// An outline of all the symbols contained in a buffer.
 #[derive(Debug)]
 pub struct Outline<T> {
     pub items: Vec<OutlineItem<T>>,

crates/language/src/proto.rs 🔗

@@ -1,3 +1,5 @@
+//! Handles conversions of `language` items to and from the [`rpc`] protocol.
+
 use crate::{
     diagnostic_set::DiagnosticEntry, CodeAction, CodeLabel, Completion, CursorShape, Diagnostic,
     Language,
@@ -11,15 +13,18 @@ use text::*;
 
 pub use proto::{BufferState, Operation};
 
+/// Serializes a [`RopeFingerprint`] to be sent over RPC.
 pub fn serialize_fingerprint(fingerprint: RopeFingerprint) -> String {
     fingerprint.to_hex()
 }
 
+/// Deserializes a [`RopeFingerprint`] from the RPC representation.
 pub fn deserialize_fingerprint(fingerprint: &str) -> Result<RopeFingerprint> {
     RopeFingerprint::from_hex(fingerprint)
         .map_err(|error| anyhow!("invalid fingerprint: {}", error))
 }
 
+/// Deserializes a `[text::LineEnding]` from the RPC representation.
 pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding {
     match message {
         proto::LineEnding::Unix => text::LineEnding::Unix,
@@ -27,6 +32,7 @@ pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding {
     }
 }
 
+/// Serializes a [`text::LineEnding`] to be sent over RPC.
 pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding {
     match message {
         text::LineEnding::Unix => proto::LineEnding::Unix,
@@ -34,6 +40,7 @@ pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding {
     }
 }
 
+/// Serializes a [`crate::Operation`] to be sent over RPC.
 pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation {
     proto::Operation {
         variant: Some(match operation {
@@ -96,6 +103,7 @@ pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation {
     }
 }
 
+/// Serializes an [`operation::EditOperation`] to be sent over RPC.
 pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation::Edit {
     proto::operation::Edit {
         replica_id: operation.timestamp.replica_id as u32,
@@ -110,6 +118,7 @@ pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation::
     }
 }
 
+/// Serializes an entry in the undo map to be sent over RPC.
 pub fn serialize_undo_map_entry(
     (edit_id, counts): (&clock::Lamport, &[(clock::Lamport, u32)]),
 ) -> proto::UndoMapEntry {
@@ -127,6 +136,7 @@ pub fn serialize_undo_map_entry(
     }
 }
 
+/// Splits the given list of operations into chunks.
 pub fn split_operations(
     mut operations: Vec<proto::Operation>,
 ) -> impl Iterator<Item = Vec<proto::Operation>> {
@@ -152,10 +162,12 @@ pub fn split_operations(
     })
 }
 
+/// Serializes selections to be sent over RPC.
 pub fn serialize_selections(selections: &Arc<[Selection<Anchor>]>) -> Vec<proto::Selection> {
     selections.iter().map(serialize_selection).collect()
 }
 
+/// Serializes a [`Selection`] to be sent over RPC.
 pub fn serialize_selection(selection: &Selection<Anchor>) -> proto::Selection {
     proto::Selection {
         id: selection.id as u64,
@@ -171,6 +183,7 @@ pub fn serialize_selection(selection: &Selection<Anchor>) -> proto::Selection {
     }
 }
 
+/// Serializes a [`CursorShape`] to be sent over RPC.
 pub fn serialize_cursor_shape(cursor_shape: &CursorShape) -> proto::CursorShape {
     match cursor_shape {
         CursorShape::Bar => proto::CursorShape::CursorBar,
@@ -180,6 +193,7 @@ pub fn serialize_cursor_shape(cursor_shape: &CursorShape) -> proto::CursorShape
     }
 }
 
+/// Deserializes a [`CursorShape`] from the RPC representation.
 pub fn deserialize_cursor_shape(cursor_shape: proto::CursorShape) -> CursorShape {
     match cursor_shape {
         proto::CursorShape::CursorBar => CursorShape::Bar,
@@ -189,6 +203,7 @@ pub fn deserialize_cursor_shape(cursor_shape: proto::CursorShape) -> CursorShape
     }
 }
 
+/// Serializes a list of diagnostics to be sent over RPC.
 pub fn serialize_diagnostics<'a>(
     diagnostics: impl IntoIterator<Item = &'a DiagnosticEntry<Anchor>>,
 ) -> Vec<proto::Diagnostic> {
@@ -208,7 +223,7 @@ pub fn serialize_diagnostics<'a>(
             } as i32,
             group_id: entry.diagnostic.group_id as u64,
             is_primary: entry.diagnostic.is_primary,
-            is_valid: entry.diagnostic.is_valid,
+            is_valid: true,
             code: entry.diagnostic.code.clone(),
             is_disk_based: entry.diagnostic.is_disk_based,
             is_unnecessary: entry.diagnostic.is_unnecessary,
@@ -216,6 +231,7 @@ pub fn serialize_diagnostics<'a>(
         .collect()
 }
 
+/// Serializes an [`Anchor`] to be sent over RPC.
 pub fn serialize_anchor(anchor: &Anchor) -> proto::Anchor {
     proto::Anchor {
         replica_id: anchor.timestamp.replica_id as u32,
@@ -230,6 +246,7 @@ pub fn serialize_anchor(anchor: &Anchor) -> proto::Anchor {
 }
 
 // This behavior is currently copied in the collab database, for snapshotting channel notes
+/// Deserializes an [`crate::Operation`] from the RPC representation.
 pub fn deserialize_operation(message: proto::Operation) -> Result<crate::Operation> {
     Ok(
         match message
@@ -312,6 +329,7 @@ pub fn deserialize_operation(message: proto::Operation) -> Result<crate::Operati
     )
 }
 
+/// Deserializes an [`EditOperation`] from the RPC representation.
 pub fn deserialize_edit_operation(edit: proto::operation::Edit) -> EditOperation {
     EditOperation {
         timestamp: clock::Lamport {
@@ -324,6 +342,7 @@ pub fn deserialize_edit_operation(edit: proto::operation::Edit) -> EditOperation
     }
 }
 
+/// Deserializes an entry in the undo map from the RPC representation.
 pub fn deserialize_undo_map_entry(
     entry: proto::UndoMapEntry,
 ) -> (clock::Lamport, Vec<(clock::Lamport, u32)>) {
@@ -348,6 +367,7 @@ pub fn deserialize_undo_map_entry(
     )
 }
 
+/// Deserializes selections from the RPC representation.
 pub fn deserialize_selections(selections: Vec<proto::Selection>) -> Arc<[Selection<Anchor>]> {
     Arc::from(
         selections
@@ -357,6 +377,7 @@ pub fn deserialize_selections(selections: Vec<proto::Selection>) -> Arc<[Selecti
     )
 }
 
+/// Deserializes a [`Selection`] from the RPC representation.
 pub fn deserialize_selection(selection: proto::Selection) -> Option<Selection<Anchor>> {
     Some(Selection {
         id: selection.id as usize,
@@ -367,6 +388,7 @@ pub fn deserialize_selection(selection: proto::Selection) -> Option<Selection<An
     })
 }
 
+/// Deserializes a list of diagnostics from the RPC representation.
 pub fn deserialize_diagnostics(
     diagnostics: Vec<proto::Diagnostic>,
 ) -> Arc<[DiagnosticEntry<Anchor>]> {
@@ -387,7 +409,6 @@ pub fn deserialize_diagnostics(
                     message: diagnostic.message,
                     group_id: diagnostic.group_id as usize,
                     code: diagnostic.code,
-                    is_valid: diagnostic.is_valid,
                     is_primary: diagnostic.is_primary,
                     is_disk_based: diagnostic.is_disk_based,
                     is_unnecessary: diagnostic.is_unnecessary,
@@ -397,6 +418,7 @@ pub fn deserialize_diagnostics(
         .collect()
 }
 
+/// Deserializes an [`Anchor`] from the RPC representation.
 pub fn deserialize_anchor(anchor: proto::Anchor) -> Option<Anchor> {
     Some(Anchor {
         timestamp: clock::Lamport {
@@ -412,6 +434,7 @@ pub fn deserialize_anchor(anchor: proto::Anchor) -> Option<Anchor> {
     })
 }
 
+/// Returns a `[clock::Lamport`] timestamp for the given [`proto::Operation`].
 pub fn lamport_timestamp_for_operation(operation: &proto::Operation) -> Option<clock::Lamport> {
     let replica_id;
     let value;
@@ -444,6 +467,7 @@ pub fn lamport_timestamp_for_operation(operation: &proto::Operation) -> Option<c
     })
 }
 
+/// Serializes a [`Completion`] to be sent over RPC.
 pub fn serialize_completion(completion: &Completion) -> proto::Completion {
     proto::Completion {
         old_start: Some(serialize_anchor(&completion.old_range.start)),
@@ -454,6 +478,7 @@ pub fn serialize_completion(completion: &Completion) -> proto::Completion {
     }
 }
 
+/// Deserializes a [`Completion`] from the RPC representation.
 pub async fn deserialize_completion(
     completion: proto::Completion,
     language: Option<Arc<Language>>,
@@ -488,6 +513,7 @@ pub async fn deserialize_completion(
     })
 }
 
+/// Serializes a [`CodeAction`] to be sent over RPC.
 pub fn serialize_code_action(action: &CodeAction) -> proto::CodeAction {
     proto::CodeAction {
         server_id: action.server_id.0 as u64,
@@ -497,6 +523,7 @@ pub fn serialize_code_action(action: &CodeAction) -> proto::CodeAction {
     }
 }
 
+/// Deserializes a [`CodeAction`] from the RPC representation.
 pub fn deserialize_code_action(action: proto::CodeAction) -> Result<CodeAction> {
     let start = action
         .start
@@ -514,6 +541,7 @@ pub fn deserialize_code_action(action: proto::CodeAction) -> Result<CodeAction>
     })
 }
 
+/// Serializes a [`Transaction`] to be sent over RPC.
 pub fn serialize_transaction(transaction: &Transaction) -> proto::Transaction {
     proto::Transaction {
         id: Some(serialize_timestamp(transaction.id)),
@@ -527,6 +555,7 @@ pub fn serialize_transaction(transaction: &Transaction) -> proto::Transaction {
     }
 }
 
+/// Deserializes a [`Transaction`] from the RPC representation.
 pub fn deserialize_transaction(transaction: proto::Transaction) -> Result<Transaction> {
     Ok(Transaction {
         id: deserialize_timestamp(
@@ -543,6 +572,7 @@ pub fn deserialize_transaction(transaction: proto::Transaction) -> Result<Transa
     })
 }
 
+/// Serializes a [`clock::Lamport`] timestamp to be sent over RPC.
 pub fn serialize_timestamp(timestamp: clock::Lamport) -> proto::LamportTimestamp {
     proto::LamportTimestamp {
         replica_id: timestamp.replica_id as u32,
@@ -550,6 +580,7 @@ pub fn serialize_timestamp(timestamp: clock::Lamport) -> proto::LamportTimestamp
     }
 }
 
+/// Deserializes a [`clock::Lamport`] timestamp from the RPC representation.
 pub fn deserialize_timestamp(timestamp: proto::LamportTimestamp) -> clock::Lamport {
     clock::Lamport {
         replica_id: timestamp.replica_id as ReplicaId,
@@ -557,6 +588,7 @@ pub fn deserialize_timestamp(timestamp: proto::LamportTimestamp) -> clock::Lampo
     }
 }
 
+/// Serializes a range of [`FullOffset`]s to be sent over RPC.
 pub fn serialize_range(range: &Range<FullOffset>) -> proto::Range {
     proto::Range {
         start: range.start.0 as u64,
@@ -564,10 +596,12 @@ pub fn serialize_range(range: &Range<FullOffset>) -> proto::Range {
     }
 }
 
+/// Deserializes a range of [`FullOffset`]s from the RPC representation.
 pub fn deserialize_range(range: proto::Range) -> Range<FullOffset> {
     FullOffset(range.start as usize)..FullOffset(range.end as usize)
 }
 
+/// Deserializes a clock version from the RPC representation.
 pub fn deserialize_version(message: &[proto::VectorClockEntry]) -> clock::Global {
     let mut version = clock::Global::new();
     for entry in message {
@@ -579,6 +613,7 @@ pub fn deserialize_version(message: &[proto::VectorClockEntry]) -> clock::Global
     version
 }
 
+/// Serializes a clock version to be sent over RPC.
 pub fn serialize_version(version: &clock::Global) -> Vec<proto::VectorClockEntry> {
     version
         .iter()

crates/language/src/syntax_map.rs 🔗

@@ -29,7 +29,7 @@ pub struct SyntaxMap {
 
 #[derive(Clone, Default)]
 pub struct SyntaxSnapshot {
-    layers: SumTree<SyntaxLayer>,
+    layers: SumTree<SyntaxLayerEntry>,
     parsed_version: clock::Global,
     interpolated_version: clock::Global,
     language_registry_version: usize,
@@ -84,7 +84,7 @@ struct SyntaxMapMatchesLayer<'a> {
 }
 
 #[derive(Clone)]
-struct SyntaxLayer {
+struct SyntaxLayerEntry {
     depth: usize,
     range: Range<Anchor>,
     content: SyntaxLayerContent,
@@ -117,17 +117,22 @@ impl SyntaxLayerContent {
     }
 }
 
+/// A layer of syntax highlighting, corresponding to a single syntax
+/// tree in a particular language.
 #[derive(Debug)]
-pub struct SyntaxLayerInfo<'a> {
-    pub depth: usize,
+pub struct SyntaxLayer<'a> {
+    /// The language for this layer.
     pub language: &'a Arc<Language>,
+    depth: usize,
     tree: &'a Tree,
     offset: (usize, tree_sitter::Point),
 }
 
+/// A layer of syntax highlighting. Like [SyntaxLayer], but holding
+/// owned data instead of references.
 #[derive(Clone)]
-pub struct OwnedSyntaxLayerInfo {
-    pub depth: usize,
+pub struct OwnedSyntaxLayer {
+    /// The language for this layer.
     pub language: Arc<Language>,
     tree: tree_sitter::Tree,
     offset: (usize, tree_sitter::Point),
@@ -691,7 +696,7 @@ impl SyntaxSnapshot {
             };
 
             layers.push(
-                SyntaxLayer {
+                SyntaxLayerEntry {
                     depth: step.depth,
                     range: step.range,
                     content,
@@ -741,7 +746,7 @@ impl SyntaxSnapshot {
         SyntaxMapCaptures::new(
             range.clone(),
             text,
-            [SyntaxLayerInfo {
+            [SyntaxLayer {
                 language,
                 tree,
                 depth: 0,
@@ -781,7 +786,7 @@ impl SyntaxSnapshot {
     }
 
     #[cfg(test)]
-    pub fn layers<'a>(&'a self, buffer: &'a BufferSnapshot) -> Vec<SyntaxLayerInfo> {
+    pub fn layers<'a>(&'a self, buffer: &'a BufferSnapshot) -> Vec<SyntaxLayer> {
         self.layers_for_range(0..buffer.len(), buffer).collect()
     }
 
@@ -789,7 +794,7 @@ impl SyntaxSnapshot {
         &'a self,
         range: Range<T>,
         buffer: &'a BufferSnapshot,
-    ) -> impl 'a + Iterator<Item = SyntaxLayerInfo> {
+    ) -> impl 'a + Iterator<Item = SyntaxLayer> {
         let start_offset = range.start.to_offset(buffer);
         let end_offset = range.end.to_offset(buffer);
         let start = buffer.anchor_before(start_offset);
@@ -813,7 +818,7 @@ impl SyntaxSnapshot {
                     let layer_start_offset = layer.range.start.to_offset(buffer);
                     let layer_start_point = layer.range.start.to_point(buffer).to_ts_point();
 
-                    info = Some(SyntaxLayerInfo {
+                    info = Some(SyntaxLayer {
                         tree,
                         language,
                         depth: layer.depth,
@@ -842,7 +847,7 @@ impl<'a> SyntaxMapCaptures<'a> {
     fn new(
         range: Range<usize>,
         text: &'a Rope,
-        layers: impl Iterator<Item = SyntaxLayerInfo<'a>>,
+        layers: impl Iterator<Item = SyntaxLayer<'a>>,
         query: fn(&Grammar) -> Option<&Query>,
     ) -> Self {
         let mut result = Self {
@@ -964,7 +969,7 @@ impl<'a> SyntaxMapMatches<'a> {
     fn new(
         range: Range<usize>,
         text: &'a Rope,
-        layers: impl Iterator<Item = SyntaxLayerInfo<'a>>,
+        layers: impl Iterator<Item = SyntaxLayer<'a>>,
         query: fn(&Grammar) -> Option<&Query>,
     ) -> Self {
         let mut result = Self::default();
@@ -1296,7 +1301,7 @@ fn get_injections(
     }
 }
 
-/// Update the given list of included `ranges`, removing any ranges that intersect
+/// Updates the given list of included `ranges`, removing any ranges that intersect
 /// `removed_ranges`, and inserting the given `new_ranges`.
 ///
 /// Returns a new vector of ranges, and the range of the vector that was changed,
@@ -1436,23 +1441,25 @@ fn insert_newlines_between_ranges(
     }
 }
 
-impl OwnedSyntaxLayerInfo {
+impl OwnedSyntaxLayer {
+    /// Returns the root syntax node for this layer.
     pub fn node(&self) -> Node {
         self.tree
             .root_node_with_offset(self.offset.0, self.offset.1)
     }
 }
 
-impl<'a> SyntaxLayerInfo<'a> {
-    pub fn to_owned(&self) -> OwnedSyntaxLayerInfo {
-        OwnedSyntaxLayerInfo {
+impl<'a> SyntaxLayer<'a> {
+    /// Returns an owned version of this layer.
+    pub fn to_owned(&self) -> OwnedSyntaxLayer {
+        OwnedSyntaxLayer {
             tree: self.tree.clone(),
             offset: self.offset,
-            depth: self.depth,
             language: self.language.clone(),
         }
     }
 
+    /// Returns the root node for this layer.
     pub fn node(&self) -> Node<'a> {
         self.tree
             .root_node_with_offset(self.offset.0, self.offset.1)
@@ -1564,7 +1571,7 @@ impl ChangeRegionSet {
         )
     }
 
-    fn intersects(&self, layer: &SyntaxLayer, text: &BufferSnapshot) -> bool {
+    fn intersects(&self, layer: &SyntaxLayerEntry, text: &BufferSnapshot) -> bool {
         for region in &self.0 {
             if region.depth < layer.depth {
                 continue;
@@ -1675,7 +1682,7 @@ impl<'a> SeekTarget<'a, SyntaxLayerSummary, SyntaxLayerSummary>
     }
 }
 
-impl sum_tree::Item for SyntaxLayer {
+impl sum_tree::Item for SyntaxLayerEntry {
     type Summary = SyntaxLayerSummary;
 
     fn summary(&self) -> Self::Summary {
@@ -1690,7 +1697,7 @@ impl sum_tree::Item for SyntaxLayer {
     }
 }
 
-impl std::fmt::Debug for SyntaxLayer {
+impl std::fmt::Debug for SyntaxLayerEntry {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         f.debug_struct("SyntaxLayer")
             .field("depth", &self.depth)

crates/language_tools/src/syntax_tree_view.rs 🔗

@@ -5,7 +5,7 @@ use gpui::{
     MouseButton, MouseDownEvent, MouseMoveEvent, ParentElement, Render, Styled,
     UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WindowContext,
 };
-use language::{Buffer, OwnedSyntaxLayerInfo};
+use language::{Buffer, OwnedSyntaxLayer};
 use std::{mem, ops::Range};
 use theme::ActiveTheme;
 use tree_sitter::{Node, TreeCursor};
@@ -54,7 +54,7 @@ struct EditorState {
 struct BufferState {
     buffer: Model<Buffer>,
     excerpt_id: ExcerptId,
-    active_layer: Option<OwnedSyntaxLayerInfo>,
+    active_layer: Option<OwnedSyntaxLayer>,
 }
 
 impl SyntaxTreeView {
@@ -477,7 +477,7 @@ impl SyntaxTreeToolbarItemView {
         })
     }
 
-    fn render_header(active_layer: &OwnedSyntaxLayerInfo) -> ButtonLike {
+    fn render_header(active_layer: &OwnedSyntaxLayer) -> ButtonLike {
         ButtonLike::new("syntax tree header")
             .child(Label::new(active_layer.language.name()))
             .child(Label::new(format_node_range(active_layer.node())))

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -3028,7 +3028,7 @@ impl MultiBufferSnapshot {
 
     pub fn has_git_diffs(&self) -> bool {
         for excerpt in self.excerpts.iter() {
-            if !excerpt.buffer.git_diff.is_empty() {
+            if excerpt.buffer.has_git_diff() {
                 return true;
             }
         }

crates/plugin_runtime/src/plugin.rs 🔗

@@ -69,7 +69,7 @@ impl Default for Metering {
 }
 
 /// This struct is used to build a new [`Plugin`], using the builder pattern.
-/// Create a new default plugin with `PluginBuilder::new_with_default_ctx`,
+/// Creates a new default plugin with `PluginBuilder::new_with_default_ctx`,
 /// and add host-side exported functions using `host_function` and `host_function_async`.
 /// Finalize the plugin by calling [`init`].
 pub struct PluginBuilder {
@@ -90,7 +90,7 @@ fn create_default_engine() -> Result<Engine, Error> {
 }
 
 impl PluginBuilder {
-    /// Create a new [`PluginBuilder`] with the given WASI context.
+    /// Creates a new [`PluginBuilder`] with the given WASI context.
     /// Using the default context is a safe bet, see [`new_with_default_context`].
     /// This plugin will yield after a configurable amount of fuel is consumed.
     pub fn new(wasi_ctx: WasiCtx, metering: Metering) -> Result<Self, Error> {
@@ -105,7 +105,7 @@ impl PluginBuilder {
         })
     }
 
-    /// Create a new `PluginBuilder` with the default `WasiCtx` (see [`default_ctx`]).
+    /// Creates a new `PluginBuilder` with the default `WasiCtx` (see [`default_ctx`]).
     /// This plugin will yield after a configurable amount of fuel is consumed.
     pub fn new_default() -> Result<Self, Error> {
         let default_ctx = WasiCtxBuilder::new()

crates/project/src/project.rs 🔗

@@ -3910,7 +3910,6 @@ impl Project {
                         message: diagnostic.message.clone(),
                         group_id,
                         is_primary: true,
-                        is_valid: true,
                         is_disk_based,
                         is_unnecessary,
                     },
@@ -3928,7 +3927,6 @@ impl Project {
                                     message: info.message.clone(),
                                     group_id,
                                     is_primary: false,
-                                    is_valid: true,
                                     is_disk_based,
                                     is_unnecessary: false,
                                 },

crates/project/src/worktree.rs 🔗

@@ -1866,7 +1866,7 @@ impl Snapshot {
         })
     }
 
-    /// Update the `git_status` of the given entries such that files'
+    /// Updates the `git_status` of the given entries such that files'
     /// statuses bubble up to their ancestor directories.
     pub fn propagate_git_statuses(&self, result: &mut [Entry]) {
         let mut cursor = self

crates/rpc/proto/zed.proto 🔗

@@ -1472,7 +1472,10 @@ message Diagnostic {
     optional string code = 6;
     uint64 group_id = 7;
     bool is_primary = 8;
+
+    // TODO: remove this field
     bool is_valid = 9;
+
     bool is_disk_based = 10;
     bool is_unnecessary = 11;
 

crates/settings/src/settings_store.rs 🔗

@@ -246,7 +246,7 @@ impl SettingsStore {
         this
     }
 
-    /// Update the value of a setting in the user's global configuration.
+    /// Updates the value of a setting in the user's global configuration.
     ///
     /// This is only for tests. Normally, settings are only loaded from
     /// JSON files.
@@ -261,7 +261,7 @@ impl SettingsStore {
         self.set_user_settings(&new_text, cx).unwrap();
     }
 
-    /// Update the value of a setting in a JSON file, returning the new text
+    /// Updates the value of a setting in a JSON file, returning the new text
     /// for that JSON file.
     pub fn new_text_for_update<T: Settings>(
         &self,
@@ -276,7 +276,7 @@ impl SettingsStore {
         new_text
     }
 
-    /// Update the value of a setting in a JSON file, returning a list
+    /// Updates the value of a setting in a JSON file, returning a list
     /// of edits to apply to the JSON file.
     pub fn edits_for_update<T: Settings>(
         &self,
@@ -344,7 +344,7 @@ impl SettingsStore {
         DEFAULT_JSON_TAB_SIZE
     }
 
-    /// Set the default settings via a JSON string.
+    /// Sets the default settings via a JSON string.
     ///
     /// The string should contain a JSON object with a default value for every setting.
     pub fn set_default_settings(
@@ -362,7 +362,7 @@ impl SettingsStore {
         }
     }
 
-    /// Set the user settings via a JSON string.
+    /// Sets the user settings via a JSON string.
     pub fn set_user_settings(
         &mut self,
         user_settings_content: &str,

crates/terminal/src/terminal.rs 🔗

@@ -52,9 +52,9 @@ use std::{
 use thiserror::Error;
 
 use gpui::{
-    actions, black, px, red, AnyWindowHandle, AppContext, Bounds, ClipboardItem, EventEmitter,
-    Hsla, Keystroke, ModelContext, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent,
-    MouseUpEvent, Pixels, Point, Rgba, ScrollWheelEvent, Size, Task, TouchPhase,
+    actions, black, px, AnyWindowHandle, AppContext, Bounds, ClipboardItem, EventEmitter, Hsla,
+    Keystroke, ModelContext, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent,
+    Pixels, Point, Rgba, ScrollWheelEvent, Size, Task, TouchPhase,
 };
 
 use crate::mappings::{colors::to_alac_rgb, keys::to_esc_str};
@@ -599,7 +599,7 @@ impl Terminal {
         }
     }
 
-    /// Update the cached process info, returns whether the Zed-relevant info has changed
+    /// Updates the cached process info, returns whether the Zed-relevant info has changed
     fn update_process_info(&mut self) -> bool {
         let mut pid = unsafe { libc::tcgetpgrp(self.shell_fd as i32) };
         if pid < 0 {
@@ -1380,7 +1380,7 @@ pub fn get_color_at_index(index: usize, theme: &Theme) -> Hsla {
     let colors = theme.colors();
 
     match index {
-        //0-15 are the same as the named colors above
+        // 0-15 are the same as the named colors above
         0 => colors.terminal_ansi_black,
         1 => colors.terminal_ansi_red,
         2 => colors.terminal_ansi_green,
@@ -1397,34 +1397,32 @@ pub fn get_color_at_index(index: usize, theme: &Theme) -> Hsla {
         13 => colors.terminal_ansi_bright_magenta,
         14 => colors.terminal_ansi_bright_cyan,
         15 => colors.terminal_ansi_bright_white,
-        //16-231 are mapped to their RGB colors on a 0-5 range per channel
+        // 16-231 are mapped to their RGB colors on a 0-5 range per channel
         16..=231 => {
-            let (r, g, b) = rgb_for_index(&(index as u8)); //Split the index into it's ANSI-RGB components
-            let step = (u8::MAX as f32 / 5.).floor() as u8; //Split the RGB range into 5 chunks, with floor so no overflow
-            rgba_color(r * step, g * step, b * step) //Map the ANSI-RGB components to an RGB color
+            let (r, g, b) = rgb_for_index(&(index as u8)); // Split the index into it's ANSI-RGB components
+            let step = (u8::MAX as f32 / 5.).floor() as u8; // Split the RGB range into 5 chunks, with floor so no overflow
+            rgba_color(r * step, g * step, b * step) // Map the ANSI-RGB components to an RGB color
         }
-        //232-255 are a 24 step grayscale from black to white
+        // 232-255 are a 24 step grayscale from black to white
         232..=255 => {
-            let i = index as u8 - 232; //Align index to 0..24
-            let step = (u8::MAX as f32 / 24.).floor() as u8; //Split the RGB grayscale values into 24 chunks
-            rgba_color(i * step, i * step, i * step) //Map the ANSI-grayscale components to the RGB-grayscale
+            let i = index as u8 - 232; // Align index to 0..24
+            let step = (u8::MAX as f32 / 24.).floor() as u8; // Split the RGB grayscale values into 24 chunks
+            rgba_color(i * step, i * step, i * step) // Map the ANSI-grayscale components to the RGB-grayscale
         }
-        //For compatibility with the alacritty::Colors interface
+        // For compatibility with the alacritty::Colors interface
         256 => colors.text,
         257 => colors.background,
         258 => theme.players().local().cursor,
-
-        // todo!(more colors)
-        259 => red(),                      //style.dim_black,
-        260 => red(),                      //style.dim_red,
-        261 => red(),                      //style.dim_green,
-        262 => red(),                      //style.dim_yellow,
-        263 => red(),                      //style.dim_blue,
-        264 => red(),                      //style.dim_magenta,
-        265 => red(),                      //style.dim_cyan,
-        266 => red(),                      //style.dim_white,
-        267 => red(),                      //style.bright_foreground,
-        268 => colors.terminal_ansi_black, //'Dim Background', non-standard color
+        259 => colors.terminal_ansi_dim_black,
+        260 => colors.terminal_ansi_dim_red,
+        261 => colors.terminal_ansi_dim_green,
+        262 => colors.terminal_ansi_dim_yellow,
+        263 => colors.terminal_ansi_dim_blue,
+        264 => colors.terminal_ansi_dim_magenta,
+        265 => colors.terminal_ansi_dim_cyan,
+        266 => colors.terminal_ansi_dim_white,
+        267 => colors.terminal_bright_foreground,
+        268 => colors.terminal_ansi_black, // 'Dim Background', non-standard color
 
         _ => black(),
     }

crates/terminal/src/terminal_settings.rs 🔗

@@ -90,17 +90,17 @@ pub struct TerminalSettingsContent {
     ///
     /// Default: current_project_directory
     pub working_directory: Option<WorkingDirectory>,
-    /// Set the terminal's font size.
+    /// Sets the terminal's font size.
     ///
     /// If this option is not included,
     /// the terminal will default to matching the buffer's font size.
     pub font_size: Option<f32>,
-    /// Set the terminal's font family.
+    /// Sets the terminal's font family.
     ///
     /// If this option is not included,
     /// the terminal will default to matching the buffer's font family.
     pub font_family: Option<String>,
-    /// Set the terminal's line height.
+    /// Sets the terminal's line height.
     ///
     /// Default: comfortable
     pub line_height: Option<TerminalLineHeight>,
@@ -110,18 +110,18 @@ pub struct TerminalSettingsContent {
     ///
     /// Default: {}
     pub env: Option<HashMap<String, String>>,
-    /// Set the cursor blinking behavior in the terminal.
+    /// Sets the cursor blinking behavior in the terminal.
     ///
     /// Default: terminal_controlled
     pub blinking: Option<TerminalBlink>,
-    /// Set whether Alternate Scroll mode (code: ?1007) is active by default.
+    /// Sets whether Alternate Scroll mode (code: ?1007) is active by default.
     /// Alternate Scroll mode converts mouse scroll events into up / down key
     /// presses when in the alternate screen (e.g. when running applications
     /// like vim or  less). The terminal can still set and unset this mode.
     ///
     /// Default: off
     pub alternate_scroll: Option<AlternateScroll>,
-    /// Set whether the option key behaves as the meta key.
+    /// Sets whether the option key behaves as the meta key.
     ///
     /// Default: false
     pub option_as_meta: Option<bool>,
@@ -139,7 +139,7 @@ pub struct TerminalSettingsContent {
     ///
     /// Default: 320
     pub default_height: Option<f32>,
-    /// Activate the python virtual environment, if one is found, in the
+    /// Activates the python virtual environment, if one is found, in the
     /// terminal's working directory (as resolved by the working_directory
     /// setting). Set this to "off" to disable this behavior.
     ///

crates/terminal_view/src/terminal_element.rs 🔗

@@ -1,12 +1,11 @@
 use editor::{Cursor, HighlightedRange, HighlightedRangeLine};
 use gpui::{
-    div, fill, point, px, red, relative, AnyElement, AsyncWindowContext, AvailableSpace,
-    BorrowWindow, Bounds, DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle,
-    FontWeight, HighlightStyle, Hsla, InteractiveBounds, InteractiveElement,
-    InteractiveElementState, Interactivity, IntoElement, LayoutId, Model, ModelContext,
-    ModifiersChangedEvent, MouseButton, MouseMoveEvent, Pixels, PlatformInputHandler, Point,
-    ShapedLine, StatefulInteractiveElement, Styled, TextRun, TextStyle, TextSystem, UnderlineStyle,
-    WeakView, WhiteSpace, WindowContext,
+    div, fill, point, px, relative, AnyElement, AsyncWindowContext, AvailableSpace, BorrowWindow,
+    Bounds, DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle, FontWeight,
+    HighlightStyle, Hsla, InteractiveBounds, InteractiveElement, InteractiveElementState,
+    Interactivity, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton,
+    MouseMoveEvent, Pixels, PlatformInputHandler, Point, ShapedLine, StatefulInteractiveElement,
+    Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, WeakView, WhiteSpace, WindowContext,
 };
 use itertools::Itertools;
 use language::CursorShape;
@@ -29,7 +28,7 @@ use workspace::Workspace;
 use std::mem;
 use std::{fmt::Debug, ops::RangeInclusive};
 
-///The information generated during layout that is necessary for painting
+/// The information generated during layout that is necessary for painting.
 pub struct LayoutState {
     cells: Vec<LayoutCell>,
     rects: Vec<LayoutRect>,
@@ -43,7 +42,7 @@ pub struct LayoutState {
     gutter: Pixels,
 }
 
-///Helper struct for converting data between alacritty's cursor points, and displayed cursor points
+/// Helper struct for converting data between Alacritty's cursor points, and displayed cursor points.
 struct DisplayCursor {
     line: i32,
     col: usize,
@@ -139,8 +138,8 @@ impl LayoutRect {
     }
 }
 
-///The GPUI element that paints the terminal.
-///We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection?
+/// The GPUI element that paints the terminal.
+/// We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection?
 pub struct TerminalElement {
     terminal: Model<Terminal>,
     workspace: WeakView<Workspace>,
@@ -278,8 +277,8 @@ impl TerminalElement {
         (cells, rects)
     }
 
-    // Compute the cursor position and expected block width, may return a zero width if x_for_index returns
-    // the same position for sequential indexes. Use em_width instead
+    /// Computes the cursor position and expected block width, may return a zero width if x_for_index returns
+    /// the same position for sequential indexes. Use em_width instead
     fn shape_cursor(
         cursor_point: DisplayCursor,
         size: TerminalSize,
@@ -306,7 +305,7 @@ impl TerminalElement {
         }
     }
 
-    /// Convert the Alacritty cell styles to GPUI text styles and background color
+    /// Converts the Alacritty cell styles to GPUI text styles and background color.
     fn cell_style(
         indexed: &IndexedCell,
         fg: terminal::alacritty_terminal::ansi::Color,
@@ -506,8 +505,8 @@ impl TerminalElement {
             cx,
         );
 
-        //Layout cursor. Rectangle is used for IME, so we should lay it out even
-        //if we don't end up showing it.
+        // Layout cursor. Rectangle is used for IME, so we should lay it out even
+        // if we don't end up showing it.
         let cursor = if let AlacCursorShape::Hidden = cursor.shape {
             None
         } else {
@@ -556,7 +555,6 @@ impl TerminalElement {
             )
         };
 
-        //Done!
         LayoutState {
             cells,
             cursor,
@@ -991,11 +989,11 @@ fn to_highlighted_range_lines(
     Some((start_y, highlighted_range_lines))
 }
 
-///Converts a 2, 8, or 24 bit color ANSI color to the GPUI equivalent
+/// Converts a 2, 8, or 24 bit color ANSI color to the GPUI equivalent.
 fn convert_color(fg: &terminal::alacritty_terminal::ansi::Color, theme: &Theme) -> Hsla {
     let colors = theme.colors();
     match fg {
-        //Named and theme defined colors
+        // Named and theme defined colors
         terminal::alacritty_terminal::ansi::Color::Named(n) => match n {
             NamedColor::Black => colors.terminal_ansi_black,
             NamedColor::Red => colors.terminal_ansi_red,
@@ -1016,24 +1014,22 @@ fn convert_color(fg: &terminal::alacritty_terminal::ansi::Color, theme: &Theme)
             NamedColor::Foreground => colors.text,
             NamedColor::Background => colors.background,
             NamedColor::Cursor => theme.players().local().cursor,
-
-            // todo!(more colors)
-            NamedColor::DimBlack => red(),
-            NamedColor::DimRed => red(),
-            NamedColor::DimGreen => red(),
-            NamedColor::DimYellow => red(),
-            NamedColor::DimBlue => red(),
-            NamedColor::DimMagenta => red(),
-            NamedColor::DimCyan => red(),
-            NamedColor::DimWhite => red(),
-            NamedColor::BrightForeground => red(),
-            NamedColor::DimForeground => red(),
+            NamedColor::DimBlack => colors.terminal_ansi_dim_black,
+            NamedColor::DimRed => colors.terminal_ansi_dim_red,
+            NamedColor::DimGreen => colors.terminal_ansi_dim_green,
+            NamedColor::DimYellow => colors.terminal_ansi_dim_yellow,
+            NamedColor::DimBlue => colors.terminal_ansi_dim_blue,
+            NamedColor::DimMagenta => colors.terminal_ansi_dim_magenta,
+            NamedColor::DimCyan => colors.terminal_ansi_dim_cyan,
+            NamedColor::DimWhite => colors.terminal_ansi_dim_white,
+            NamedColor::BrightForeground => colors.terminal_bright_foreground,
+            NamedColor::DimForeground => colors.terminal_dim_foreground,
         },
-        //'True' colors
+        // 'True' colors
         terminal::alacritty_terminal::ansi::Color::Spec(rgb) => {
             terminal::rgba_color(rgb.r, rgb.g, rgb.b)
         }
-        //8 bit, indexed colors
+        // 8 bit, indexed colors
         terminal::alacritty_terminal::ansi::Color::Indexed(i) => {
             terminal::get_color_at_index(*i as usize, theme)
         }

crates/terminal_view/src/terminal_view.rs 🔗

@@ -832,7 +832,7 @@ impl SearchableItem for TerminalView {
         self.terminal().update(cx, |term, _| term.matches = matches)
     }
 
-    /// Return the selection content to pre-load into this search
+    /// Returns the selection content to pre-load into this search
     fn query_suggestion(&mut self, cx: &mut ViewContext<Self>) -> String {
         self.terminal()
             .read(cx)

crates/theme/src/default_colors.rs 🔗

@@ -77,6 +77,9 @@ impl ThemeColors {
             editor_document_highlight_read_background: neutral().light_alpha().step_3(),
             editor_document_highlight_write_background: neutral().light_alpha().step_4(),
             terminal_background: neutral().light().step_1(),
+            terminal_foreground: black().light().step_12(),
+            terminal_bright_foreground: black().light().step_11(),
+            terminal_dim_foreground: black().light().step_10(),
             terminal_ansi_bright_black: black().light().step_11(),
             terminal_ansi_bright_red: red().light().step_10(),
             terminal_ansi_bright_green: green().light().step_10(),
@@ -93,6 +96,14 @@ impl ThemeColors {
             terminal_ansi_magenta: violet().light().step_11(),
             terminal_ansi_cyan: cyan().light().step_11(),
             terminal_ansi_white: neutral().light().step_12(),
+            terminal_ansi_dim_black: black().light().step_11(),
+            terminal_ansi_dim_red: red().light().step_10(),
+            terminal_ansi_dim_green: green().light().step_10(),
+            terminal_ansi_dim_yellow: yellow().light().step_10(),
+            terminal_ansi_dim_blue: blue().light().step_10(),
+            terminal_ansi_dim_magenta: violet().light().step_10(),
+            terminal_ansi_dim_cyan: cyan().light().step_10(),
+            terminal_ansi_dim_white: neutral().light().step_11(),
             link_text_hover: orange().light().step_10(),
         }
     }
@@ -160,22 +171,33 @@ impl ThemeColors {
             editor_document_highlight_read_background: neutral().dark_alpha().step_4(),
             editor_document_highlight_write_background: neutral().dark_alpha().step_4(),
             terminal_background: neutral().dark().step_1(),
-            terminal_ansi_bright_black: black().dark().step_11(),
-            terminal_ansi_bright_red: red().dark().step_10(),
-            terminal_ansi_bright_green: green().dark().step_10(),
-            terminal_ansi_bright_yellow: yellow().dark().step_10(),
-            terminal_ansi_bright_blue: blue().dark().step_10(),
-            terminal_ansi_bright_magenta: violet().dark().step_10(),
-            terminal_ansi_bright_cyan: cyan().dark().step_10(),
-            terminal_ansi_bright_white: neutral().dark().step_11(),
+            terminal_foreground: white().dark().step_12(),
+            terminal_bright_foreground: white().dark().step_11(),
+            terminal_dim_foreground: white().dark().step_10(),
             terminal_ansi_black: black().dark().step_12(),
+            terminal_ansi_bright_black: black().dark().step_11(),
+            terminal_ansi_dim_black: black().dark().step_10(),
             terminal_ansi_red: red().dark().step_11(),
+            terminal_ansi_bright_red: red().dark().step_10(),
+            terminal_ansi_dim_red: red().dark().step_9(),
             terminal_ansi_green: green().dark().step_11(),
+            terminal_ansi_bright_green: green().dark().step_10(),
+            terminal_ansi_dim_green: green().dark().step_9(),
             terminal_ansi_yellow: yellow().dark().step_11(),
+            terminal_ansi_bright_yellow: yellow().dark().step_10(),
+            terminal_ansi_dim_yellow: yellow().dark().step_9(),
             terminal_ansi_blue: blue().dark().step_11(),
+            terminal_ansi_bright_blue: blue().dark().step_10(),
+            terminal_ansi_dim_blue: blue().dark().step_9(),
             terminal_ansi_magenta: violet().dark().step_11(),
+            terminal_ansi_bright_magenta: violet().dark().step_10(),
+            terminal_ansi_dim_magenta: violet().dark().step_9(),
             terminal_ansi_cyan: cyan().dark().step_11(),
+            terminal_ansi_bright_cyan: cyan().dark().step_10(),
+            terminal_ansi_dim_cyan: cyan().dark().step_9(),
             terminal_ansi_white: neutral().dark().step_12(),
+            terminal_ansi_bright_white: neutral().dark().step_11(),
+            terminal_ansi_dim_white: neutral().dark().step_10(),
             link_text_hover: orange().dark().step_10(),
         }
     }

crates/theme/src/one_themes.rs 🔗

@@ -101,6 +101,9 @@ pub(crate) fn one_dark() -> Theme {
 
                 terminal_background: bg,
                 // todo!("Use one colors for terminal")
+                terminal_foreground: crate::white().dark().step_12(),
+                terminal_bright_foreground: crate::white().dark().step_11(),
+                terminal_dim_foreground: crate::white().dark().step_10(),
                 terminal_ansi_black: crate::black().dark().step_12(),
                 terminal_ansi_red: crate::red().dark().step_11(),
                 terminal_ansi_green: crate::green().dark().step_11(),
@@ -117,6 +120,14 @@ pub(crate) fn one_dark() -> Theme {
                 terminal_ansi_bright_magenta: crate::violet().dark().step_10(),
                 terminal_ansi_bright_cyan: crate::cyan().dark().step_10(),
                 terminal_ansi_bright_white: crate::neutral().dark().step_11(),
+                terminal_ansi_dim_black: crate::black().dark().step_10(),
+                terminal_ansi_dim_red: crate::red().dark().step_9(),
+                terminal_ansi_dim_green: crate::green().dark().step_9(),
+                terminal_ansi_dim_yellow: crate::yellow().dark().step_9(),
+                terminal_ansi_dim_blue: crate::blue().dark().step_9(),
+                terminal_ansi_dim_magenta: crate::violet().dark().step_9(),
+                terminal_ansi_dim_cyan: crate::cyan().dark().step_9(),
+                terminal_ansi_dim_white: crate::neutral().dark().step_10(),
                 panel_background: bg,
                 panel_focused_border: blue,
                 pane_focused_border: blue,

crates/theme/src/styles/colors.rs 🔗

@@ -169,40 +169,63 @@ pub struct ThemeColors {
     // ===
     // Terminal
     // ===
-    /// Terminal Background Color
+    /// Terminal background color.
     pub terminal_background: Hsla,
-    /// Bright Black Color for ANSI Terminal
-    pub terminal_ansi_bright_black: Hsla,
-    /// Bright Red Color for ANSI Terminal
-    pub terminal_ansi_bright_red: Hsla,
-    /// Bright Green Color for ANSI Terminal
-    pub terminal_ansi_bright_green: Hsla,
-    /// Bright Yellow Color for ANSI Terminal
-    pub terminal_ansi_bright_yellow: Hsla,
-    /// Bright Blue Color for ANSI Terminal
-    pub terminal_ansi_bright_blue: Hsla,
-    /// Bright Magenta Color for ANSI Terminal
-    pub terminal_ansi_bright_magenta: Hsla,
-    /// Bright Cyan Color for ANSI Terminal
-    pub terminal_ansi_bright_cyan: Hsla,
-    /// Bright White Color for ANSI Terminal
-    pub terminal_ansi_bright_white: Hsla,
-    /// Black Color for ANSI Terminal
+    /// Terminal foreground color.
+    pub terminal_foreground: Hsla,
+    /// Bright terminal foreground color.
+    pub terminal_bright_foreground: Hsla,
+    /// Dim terminal foreground color.
+    pub terminal_dim_foreground: Hsla,
+
+    /// Black ANSI terminal color.
     pub terminal_ansi_black: Hsla,
-    /// Red Color for ANSI Terminal
+    /// Bright black ANSI terminal color.
+    pub terminal_ansi_bright_black: Hsla,
+    /// Dim black ANSI terminal color.
+    pub terminal_ansi_dim_black: Hsla,
+    /// Red ANSI terminal color.
     pub terminal_ansi_red: Hsla,
-    /// Green Color for ANSI Terminal
+    /// Bright red ANSI terminal color.
+    pub terminal_ansi_bright_red: Hsla,
+    /// Dim red ANSI terminal color.
+    pub terminal_ansi_dim_red: Hsla,
+    /// Green ANSI terminal color.
     pub terminal_ansi_green: Hsla,
-    /// Yellow Color for ANSI Terminal
+    /// Bright green ANSI terminal color.
+    pub terminal_ansi_bright_green: Hsla,
+    /// Dim green ANSI terminal color.
+    pub terminal_ansi_dim_green: Hsla,
+    /// Yellow ANSI terminal color.
     pub terminal_ansi_yellow: Hsla,
-    /// Blue Color for ANSI Terminal
+    /// Bright yellow ANSI terminal color.
+    pub terminal_ansi_bright_yellow: Hsla,
+    /// Dim yellow ANSI terminal color.
+    pub terminal_ansi_dim_yellow: Hsla,
+    /// Blue ANSI terminal color.
     pub terminal_ansi_blue: Hsla,
-    /// Magenta Color for ANSI Terminal
+    /// Bright blue ANSI terminal color.
+    pub terminal_ansi_bright_blue: Hsla,
+    /// Dim blue ANSI terminal color.
+    pub terminal_ansi_dim_blue: Hsla,
+    /// Magenta ANSI terminal color.
     pub terminal_ansi_magenta: Hsla,
-    /// Cyan Color for ANSI Terminal
+    /// Bright magenta ANSI terminal color.
+    pub terminal_ansi_bright_magenta: Hsla,
+    /// Dim magenta ANSI terminal color.
+    pub terminal_ansi_dim_magenta: Hsla,
+    /// Cyan ANSI terminal color.
     pub terminal_ansi_cyan: Hsla,
-    /// White Color for ANSI Terminal
+    /// Bright cyan ANSI terminal color.
+    pub terminal_ansi_bright_cyan: Hsla,
+    /// Dim cyan ANSI terminal color.
+    pub terminal_ansi_dim_cyan: Hsla,
+    /// White ANSI terminal color.
     pub terminal_ansi_white: Hsla,
+    /// Bright white ANSI terminal color.
+    pub terminal_ansi_bright_white: Hsla,
+    /// Dim white ANSI terminal color.
+    pub terminal_ansi_dim_white: Hsla,
 
     // ===
     // UI/Rich Text

crates/theme/src/themes/andromeda.rs 🔗

@@ -75,22 +75,33 @@ pub fn andromeda() -> UserThemeFamily {
                     editor_document_highlight_read_background: Some(rgba(0x11a7931a).into()),
                     editor_document_highlight_write_background: Some(rgba(0x64646d66).into()),
                     terminal_background: Some(rgba(0x1e2025ff).into()),
-                    terminal_ansi_bright_black: Some(rgba(0x40434cff).into()),
-                    terminal_ansi_bright_red: Some(rgba(0x8e103aff).into()),
-                    terminal_ansi_bright_green: Some(rgba(0x457c38ff).into()),
-                    terminal_ansi_bright_yellow: Some(rgba(0x958435ff).into()),
-                    terminal_ansi_bright_blue: Some(rgba(0x1b5148ff).into()),
-                    terminal_ansi_bright_magenta: Some(rgba(0x682781ff).into()),
-                    terminal_ansi_bright_cyan: Some(rgba(0x018169ff).into()),
-                    terminal_ansi_bright_white: Some(rgba(0xf7f7f8ff).into()),
+                    terminal_foreground: Some(rgba(0xf7f7f8ff).into()),
+                    terminal_bright_foreground: Some(rgba(0xf7f7f8ff).into()),
+                    terminal_dim_foreground: Some(rgba(0x1e2025ff).into()),
                     terminal_ansi_black: Some(rgba(0x1e2025ff).into()),
+                    terminal_ansi_bright_black: Some(rgba(0x40434cff).into()),
+                    terminal_ansi_dim_black: Some(rgba(0xf7f7f8ff).into()),
                     terminal_ansi_red: Some(rgba(0xf82872ff).into()),
+                    terminal_ansi_bright_red: Some(rgba(0x8e103aff).into()),
+                    terminal_ansi_dim_red: Some(rgba(0xffa3b6ff).into()),
                     terminal_ansi_green: Some(rgba(0x96df72ff).into()),
+                    terminal_ansi_bright_green: Some(rgba(0x457c38ff).into()),
+                    terminal_ansi_dim_green: Some(rgba(0xcef0b9ff).into()),
                     terminal_ansi_yellow: Some(rgba(0xfee56dff).into()),
+                    terminal_ansi_bright_yellow: Some(rgba(0x958435ff).into()),
+                    terminal_ansi_dim_yellow: Some(rgba(0xfff2b8ff).into()),
                     terminal_ansi_blue: Some(rgba(0x11a793ff).into()),
+                    terminal_ansi_bright_blue: Some(rgba(0x1b5148ff).into()),
+                    terminal_ansi_dim_blue: Some(rgba(0x9cd4c8ff).into()),
                     terminal_ansi_magenta: Some(rgba(0xc74decff).into()),
+                    terminal_ansi_bright_magenta: Some(rgba(0x682781ff).into()),
+                    terminal_ansi_dim_magenta: Some(rgba(0xe8abf7ff).into()),
                     terminal_ansi_cyan: Some(rgba(0x09e7c6ff).into()),
+                    terminal_ansi_bright_cyan: Some(rgba(0x018169ff).into()),
+                    terminal_ansi_dim_cyan: Some(rgba(0xaaf5e2ff).into()),
                     terminal_ansi_white: Some(rgba(0xf7f7f8ff).into()),
+                    terminal_ansi_bright_white: Some(rgba(0xf7f7f8ff).into()),
+                    terminal_ansi_dim_white: Some(rgba(0x88868dff).into()),
                     link_text_hover: Some(rgba(0x11a793ff).into()),
                     ..Default::default()
                 },

crates/theme/src/themes/atelier.rs 🔗

@@ -76,22 +76,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x576dda1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x726c7a66).into()),
                         terminal_background: Some(rgba(0x19171cff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x635d6bff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x5c283cff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x1f4747ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x2d376fff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x60255bff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x26445eff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xefecf4ff).into()),
+                        terminal_foreground: Some(rgba(0xefecf4ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xefecf4ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x19171cff).into()),
                         terminal_ansi_black: Some(rgba(0x19171cff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x635d6bff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xefecf4ff).into()),
                         terminal_ansi_red: Some(rgba(0xbe4678ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x5c283cff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xe3a4b9ff).into()),
                         terminal_ansi_green: Some(rgba(0x2c9292ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x1f4747ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x9dc8c8ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa06e3bff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xd4b499ff).into()),
                         terminal_ansi_blue: Some(rgba(0x576ddaff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x2d376fff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xb3b3eeff).into()),
                         terminal_ansi_magenta: Some(rgba(0xbf41bfff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x60255bff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xe3a4dfff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3a8bc6ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x26445eff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xa6c4e3ff).into()),
                         terminal_ansi_white: Some(rgba(0xefecf4ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xefecf4ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x807b89ff).into()),
                         link_text_hover: Some(rgba(0x576ddaff).into()),
                         ..Default::default()
                     },
@@ -541,22 +552,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x586dda1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x726c7a66).into()),
                         terminal_background: Some(rgba(0xefecf4ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x807b89ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xe3a4b9ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x9dc8c8ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xb3b3eeff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xe3a4dfff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xa6c4e3ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x19171cff).into()),
+                        terminal_foreground: Some(rgba(0x19171cff).into()),
+                        terminal_bright_foreground: Some(rgba(0x19171cff).into()),
+                        terminal_dim_foreground: Some(rgba(0xefecf4ff).into()),
                         terminal_ansi_black: Some(rgba(0xefecf4ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x807b89ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x19171cff).into()),
                         terminal_ansi_red: Some(rgba(0xbe4778ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xe3a4b9ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x5c283cff).into()),
                         terminal_ansi_green: Some(rgba(0x2c9292ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x9dc8c8ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x1f4747ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa06e3cff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x4e3821ff).into()),
                         terminal_ansi_blue: Some(rgba(0x586ddaff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xb3b3eeff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x2d376fff).into()),
                         terminal_ansi_magenta: Some(rgba(0xbf41bfff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xe3a4dfff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x60255bff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3b8bc6ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xa6c4e3ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x26445eff).into()),
                         terminal_ansi_white: Some(rgba(0x19171cff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x19171cff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x635d6bff).into()),
                         link_text_hover: Some(rgba(0x586ddaff).into()),
                         ..Default::default()
                     },
@@ -1006,22 +1028,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x6684e01a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x8b887466).into()),
                         terminal_background: Some(rgba(0x20201dff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x7a7766ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x781c1fff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x335322ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x574815ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x334173ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x721d2bff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x1e5341ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xfefbecff).into()),
+                        terminal_foreground: Some(rgba(0xfefbecff).into()),
+                        terminal_bright_foreground: Some(rgba(0xfefbecff).into()),
+                        terminal_dim_foreground: Some(rgba(0x20201dff).into()),
                         terminal_ansi_black: Some(rgba(0x20201dff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x7a7766ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xfefbecff).into()),
                         terminal_ansi_red: Some(rgba(0xd73837ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x781c1fff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xf7a195ff).into()),
                         terminal_ansi_green: Some(rgba(0x60ac3aff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x335322ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xb3d69cff).into()),
                         terminal_ansi_yellow: Some(rgba(0xae9515ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x574815ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xdcc98eff).into()),
                         terminal_ansi_blue: Some(rgba(0x6684e0ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x334173ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xb8c0f1ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xd43652ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x721d2bff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xf3a0a4ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x21ad83ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x1e5341ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9ed7c0ff).into()),
                         terminal_ansi_white: Some(rgba(0xfefbecff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xfefbecff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x9b9782ff).into()),
                         link_text_hover: Some(rgba(0x6684e0ff).into()),
                         ..Default::default()
                     },
@@ -1471,22 +1504,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x6784e01a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x8b887466).into()),
                         terminal_background: Some(rgba(0xfefbecff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x9b9782ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xf7a195ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xb3d69cff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xdcc98eff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xb8c0f1ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xf3a0a4ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9ed7c0ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x20201dff).into()),
+                        terminal_foreground: Some(rgba(0x20201dff).into()),
+                        terminal_bright_foreground: Some(rgba(0x20201dff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfefbecff).into()),
                         terminal_ansi_black: Some(rgba(0xfefbecff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x9b9782ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x20201dff).into()),
                         terminal_ansi_red: Some(rgba(0xd73838ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xf7a195ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x781c1fff).into()),
                         terminal_ansi_green: Some(rgba(0x61ac3aff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xb3d69cff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x335322ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xae9515ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xdcc98eff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x574815ff).into()),
                         terminal_ansi_blue: Some(rgba(0x6784e0ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xb8c0f1ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x334173ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xd43753ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xf3a0a4ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x721d2bff).into()),
                         terminal_ansi_cyan: Some(rgba(0x22ad83ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9ed7c0ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1e5341ff).into()),
                         terminal_ansi_white: Some(rgba(0x20201dff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x20201dff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x7a7766ff).into()),
                         link_text_hover: Some(rgba(0x6784e0ff).into()),
                         ..Default::default()
                     },
@@ -1936,22 +1980,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x37a1661a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x7a786766).into()),
                         terminal_background: Some(rgba(0x22221bff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x6a6958ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x5c331fff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x3f491aff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x514a14ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x234e34ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x4c373eff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x314c27ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf4f3ecff).into()),
+                        terminal_foreground: Some(rgba(0xf4f3ecff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf4f3ecff).into()),
+                        terminal_dim_foreground: Some(rgba(0x22221bff).into()),
                         terminal_ansi_black: Some(rgba(0x22221bff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x6a6958ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf4f3ecff).into()),
                         terminal_ansi_red: Some(rgba(0xba6237ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x5c331fff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xe4af96ff).into()),
                         terminal_ansi_green: Some(rgba(0x7d9727ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x3f491aff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xc0ca93ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa59810ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x514a14ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xd7ca8dff).into()),
                         terminal_ansi_blue: Some(rgba(0x37a166ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x234e34ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xa0d1b0ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x9d6c7cff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x4c373eff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xcfb4bcff).into()),
                         terminal_ansi_cyan: Some(rgba(0x5b9d48ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x314c27ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xaecea1ff).into()),
                         terminal_ansi_white: Some(rgba(0xf4f3ecff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf4f3ecff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x898775ff).into()),
                         link_text_hover: Some(rgba(0x37a166ff).into()),
                         ..Default::default()
                     },
@@ -2401,22 +2456,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x38a1661a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x7a786766).into()),
                         terminal_background: Some(rgba(0xf4f3ecff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x898775ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xe4af96ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xc0ca93ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xd7ca8dff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xa0d1b0ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xcfb4bcff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xaecea1ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x22221bff).into()),
+                        terminal_foreground: Some(rgba(0x22221bff).into()),
+                        terminal_bright_foreground: Some(rgba(0x22221bff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf4f3ecff).into()),
                         terminal_ansi_black: Some(rgba(0xf4f3ecff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x898775ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x22221bff).into()),
                         terminal_ansi_red: Some(rgba(0xba6337ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xe4af96ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x5c331fff).into()),
                         terminal_ansi_green: Some(rgba(0x7d9728ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xc0ca93ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x3f491aff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa59810ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xd7ca8dff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x514a14ff).into()),
                         terminal_ansi_blue: Some(rgba(0x38a166ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xa0d1b0ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x234e34ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x9d6c7cff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xcfb4bcff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x4c373eff).into()),
                         terminal_ansi_cyan: Some(rgba(0x5c9d49ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xaecea1ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x314c27ff).into()),
                         terminal_ansi_white: Some(rgba(0x22221bff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x22221bff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x6a6958ff).into()),
                         link_text_hover: Some(rgba(0x38a166ff).into()),
                         ..Default::default()
                     },
@@ -2866,22 +2932,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x417ee61a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x89817e66).into()),
                         terminal_background: Some(rgba(0x1b1918ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x746c69ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x8c1223ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x3e491aff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x674115ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x213f78ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x662186ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x264958ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf1efeeff).into()),
+                        terminal_foreground: Some(rgba(0xf1efeeff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf1efeeff).into()),
+                        terminal_dim_foreground: Some(rgba(0x1b1918ff).into()),
                         terminal_ansi_black: Some(rgba(0x1b1918ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x746c69ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf1efeeff).into()),
                         terminal_ansi_red: Some(rgba(0xf22d40ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x8c1223ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xffa29aff).into()),
                         terminal_ansi_green: Some(rgba(0x7b9727ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x3e491aff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xbfca93ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xc38419ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x674115ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xe9c08eff).into()),
                         terminal_ansi_blue: Some(rgba(0x417ee6ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x213f78ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xaebcf4ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xc340f2ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x662186ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xe7a6fbff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3e97b8ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x264958ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xa6cadbff).into()),
                         terminal_ansi_white: Some(rgba(0xf1efeeff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf1efeeff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x9e9693ff).into()),
                         link_text_hover: Some(rgba(0x417ee6ff).into()),
                         ..Default::default()
                     },
@@ -3331,22 +3408,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x417ee61a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x89817e66).into()),
                         terminal_background: Some(rgba(0xf1efeeff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x9e9693ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xffa29aff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xbfca93ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe9c08eff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xaebcf4ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xe7a6fbff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xa6cadbff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x1b1918ff).into()),
+                        terminal_foreground: Some(rgba(0x1b1918ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x1b1918ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf1efeeff).into()),
                         terminal_ansi_black: Some(rgba(0xf1efeeff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x9e9693ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x1b1918ff).into()),
                         terminal_ansi_red: Some(rgba(0xf22e41ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xffa29aff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x8c1223ff).into()),
                         terminal_ansi_green: Some(rgba(0x7b9728ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xbfca93ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x3e491aff).into()),
                         terminal_ansi_yellow: Some(rgba(0xc3841aff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe9c08eff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x674115ff).into()),
                         terminal_ansi_blue: Some(rgba(0x417ee6ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xaebcf4ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x213f78ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xc340f2ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xe7a6fbff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x662186ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3f97b8ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xa6cadbff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x264958ff).into()),
                         terminal_ansi_white: Some(rgba(0x1b1918ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x1b1918ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x746c69ff).into()),
                         link_text_hover: Some(rgba(0x417ee6ff).into()),
                         ..Default::default()
                     },
@@ -3796,22 +3884,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x526aeb1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x8b7c8b66).into()),
                         terminal_background: Some(rgba(0x1b181bff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x756775ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x6d221aff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x474422ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x5e441fff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x26367eff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x6c1e67ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x1a4848ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_foreground: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x1b181bff).into()),
                         terminal_ansi_black: Some(rgba(0x1b181bff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x756775ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf7f3f7ff).into()),
                         terminal_ansi_red: Some(rgba(0xca402cff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x6d221aff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xf0a28fff).into()),
                         terminal_ansi_green: Some(rgba(0x918b3bff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x474422ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xcac49aff).into()),
                         terminal_ansi_yellow: Some(rgba(0xbb8a36ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x5e441fff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xe2c398ff).into()),
                         terminal_ansi_blue: Some(rgba(0x526aebff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x26367eff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xb4b2f7ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xcc34ccff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x6c1e67ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xeba2e6ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x189393ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x1a4848ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9ac9c8ff).into()),
                         terminal_ansi_white: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0xa091a0ff).into()),
                         link_text_hover: Some(rgba(0x526aebff).into()),
                         ..Default::default()
                     },
@@ -4261,22 +4360,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x526aeb1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x8b7c8b66).into()),
                         terminal_background: Some(rgba(0xf7f3f7ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xa091a0ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xf0a28fff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xcac49aff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe2c398ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xb4b2f7ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xeba2e6ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9ac9c8ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x1b181bff).into()),
+                        terminal_foreground: Some(rgba(0x1b181bff).into()),
+                        terminal_bright_foreground: Some(rgba(0x1b181bff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf7f3f7ff).into()),
                         terminal_ansi_black: Some(rgba(0xf7f3f7ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xa091a0ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x1b181bff).into()),
                         terminal_ansi_red: Some(rgba(0xca412cff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xf0a28fff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x6d221aff).into()),
                         terminal_ansi_green: Some(rgba(0x918b3cff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xcac49aff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x474422ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xbb8a36ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe2c398ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x5e441fff).into()),
                         terminal_ansi_blue: Some(rgba(0x526aebff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xb4b2f7ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x26367eff).into()),
                         terminal_ansi_magenta: Some(rgba(0xcc35ccff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xeba2e6ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x6c1e67ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x199393ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9ac9c8ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1a4848ff).into()),
                         terminal_ansi_white: Some(rgba(0x1b181bff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x1b181bff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x756775ff).into()),
                         link_text_hover: Some(rgba(0x526aebff).into()),
                         ..Default::default()
                     },
@@ -4726,22 +4836,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x277fad1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x66889a66).into()),
                         terminal_background: Some(rgba(0x161b1dff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x587989ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x6f1c3aff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x2e4522ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x454413ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x1e3f53ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x5c1e6bff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x1f4638ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xebf8ffff).into()),
+                        terminal_foreground: Some(rgba(0xebf8ffff).into()),
+                        terminal_bright_foreground: Some(rgba(0xebf8ffff).into()),
+                        terminal_dim_foreground: Some(rgba(0x161b1dff).into()),
                         terminal_ansi_black: Some(rgba(0x161b1dff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x587989ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xebf8ffff).into()),
                         terminal_ansi_red: Some(rgba(0xd22e72ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x6f1c3aff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xf09fb6ff).into()),
                         terminal_ansi_green: Some(rgba(0x568c3bff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x2e4522ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xabc59aff).into()),
                         terminal_ansi_yellow: Some(rgba(0x8a8a11ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x454413ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xc8c38bff).into()),
                         terminal_ansi_blue: Some(rgba(0x277fadff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x1e3f53ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x9ebdd6ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xb72ed2ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x5c1e6bff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xe09fe9ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x2e8f6fff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x1f4638ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9bc7b5ff).into()),
                         terminal_ansi_white: Some(rgba(0xebf8ffff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xebf8ffff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x7397aaff).into()),
                         link_text_hover: Some(rgba(0x277fadff).into()),
                         ..Default::default()
                     },
@@ -5191,22 +5312,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x277fad1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x66889a66).into()),
                         terminal_background: Some(rgba(0xebf8ffff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x7397aaff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xf09fb6ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xabc59aff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xc8c38bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x9ebdd6ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xe09fe9ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9bc7b5ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x161b1dff).into()),
+                        terminal_foreground: Some(rgba(0x161b1dff).into()),
+                        terminal_bright_foreground: Some(rgba(0x161b1dff).into()),
+                        terminal_dim_foreground: Some(rgba(0xebf8ffff).into()),
                         terminal_ansi_black: Some(rgba(0xebf8ffff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x7397aaff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x161b1dff).into()),
                         terminal_ansi_red: Some(rgba(0xd22f72ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xf09fb6ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x6f1c3aff).into()),
                         terminal_ansi_green: Some(rgba(0x578c3cff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xabc59aff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x2e4522ff).into()),
                         terminal_ansi_yellow: Some(rgba(0x8a8a11ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xc8c38bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x454413ff).into()),
                         terminal_ansi_blue: Some(rgba(0x277fadff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x9ebdd6ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x1e3f53ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xb72fd2ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xe09fe9ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x5c1e6bff).into()),
                         terminal_ansi_cyan: Some(rgba(0x2f8f6fff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9bc7b5ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1f4638ff).into()),
                         terminal_ansi_white: Some(rgba(0x161b1dff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x161b1dff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x587989ff).into()),
                         link_text_hover: Some(rgba(0x277fadff).into()),
                         ..Default::default()
                     },
@@ -5656,22 +5788,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x7272ca1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x726a6a66).into()),
                         terminal_background: Some(rgba(0x1b1818ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x635b5bff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x692727ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x2a4444ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x3b3960ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x5b2c42ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x2e4257ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf4ececff).into()),
+                        terminal_foreground: Some(rgba(0xf4ececff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf4ececff).into()),
+                        terminal_dim_foreground: Some(rgba(0x1b1818ff).into()),
                         terminal_ansi_black: Some(rgba(0x1b1818ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x635b5bff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf4ececff).into()),
                         terminal_ansi_red: Some(rgba(0xca4949ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x692727ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xeda69fff).into()),
                         terminal_ansi_green: Some(rgba(0x4b8b8bff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x2a4444ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xa6c4c4ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa06e3bff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xd4b499ff).into()),
                         terminal_ansi_blue: Some(rgba(0x7272caff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x3b3960ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xbbb6e5ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xbd5187ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x5b2c42ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xe2a9c2ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x5485b6ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x2e4257ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xacc0daff).into()),
                         terminal_ansi_white: Some(rgba(0xf4ececff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf4ececff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x807979ff).into()),
                         link_text_hover: Some(rgba(0x7272caff).into()),
                         ..Default::default()
                     },
@@ -6121,22 +6264,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x7372ca1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x726a6a66).into()),
                         terminal_background: Some(rgba(0xf4ececff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x807979ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xeda69fff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xa6c4c4ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xbbb6e5ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xe2a9c2ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xacc0daff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x1b1818ff).into()),
+                        terminal_foreground: Some(rgba(0x1b1818ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x1b1818ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf4ececff).into()),
                         terminal_ansi_black: Some(rgba(0xf4ececff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x807979ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x1b1818ff).into()),
                         terminal_ansi_red: Some(rgba(0xca4a4aff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xeda69fff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x692727ff).into()),
                         terminal_ansi_green: Some(rgba(0x4c8b8bff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xa6c4c4ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x2a4444ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa06e3cff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x4e3821ff).into()),
                         terminal_ansi_blue: Some(rgba(0x7372caff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xbbb6e5ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x3b3960ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xbd5287ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xe2a9c2ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x5b2c42ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x5585b6ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xacc0daff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x2e4257ff).into()),
                         terminal_ansi_white: Some(rgba(0x1b1818ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x1b1818ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x635b5bff).into()),
                         link_text_hover: Some(rgba(0x7372caff).into()),
                         ..Default::default()
                     },
@@ -6586,22 +6740,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x478c901a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x6c7a7166).into()),
                         terminal_background: Some(rgba(0x171c19ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x5d6b62ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x563220ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x294a33ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x284546ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x423a36ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x1d4b4dff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xecf4eeff).into()),
+                        terminal_foreground: Some(rgba(0xecf4eeff).into()),
+                        terminal_bright_foreground: Some(rgba(0xecf4eeff).into()),
+                        terminal_dim_foreground: Some(rgba(0x171c19ff).into()),
                         terminal_ansi_black: Some(rgba(0x171c19ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x5d6b62ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xecf4eeff).into()),
                         terminal_ansi_red: Some(rgba(0xb16139ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x563220ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xdeae97ff).into()),
                         terminal_ansi_green: Some(rgba(0x489963ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x294a33ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xa5ccafff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa07e3bff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xd3bd9aff).into()),
                         terminal_ansi_blue: Some(rgba(0x478c90ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x284546ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xa5c5c6ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x867469ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x423a36ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xc2b7b1ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x1e9aa0ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x1d4b4dff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9dcdcfff).into()),
                         terminal_ansi_white: Some(rgba(0xecf4eeff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xecf4eeff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x7b897fff).into()),
                         link_text_hover: Some(rgba(0x478c90ff).into()),
                         ..Default::default()
                     },
@@ -7051,22 +7216,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x488c901a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x6c7a7166).into()),
                         terminal_background: Some(rgba(0xecf4eeff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x7b897fff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xdeae97ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xa5ccafff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xd3bd9aff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xa5c5c6ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xc2b7b1ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9dcdcfff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x171c19ff).into()),
+                        terminal_foreground: Some(rgba(0x171c19ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x171c19ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xecf4eeff).into()),
                         terminal_ansi_black: Some(rgba(0xecf4eeff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x7b897fff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x171c19ff).into()),
                         terminal_ansi_red: Some(rgba(0xb1623aff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xdeae97ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x563220ff).into()),
                         terminal_ansi_green: Some(rgba(0x499963ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xa5ccafff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x294a33ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xa07e3cff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xd3bd9aff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x4e3f22ff).into()),
                         terminal_ansi_blue: Some(rgba(0x488c90ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xa5c5c6ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x284546ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x867469ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xc2b7b1ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x423a36ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x1f9aa0ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9dcdcfff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1d4b4dff).into()),
                         terminal_ansi_white: Some(rgba(0x171c19ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x171c19ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x5d6b62ff).into()),
                         link_text_hover: Some(rgba(0x488c90ff).into()),
                         ..Default::default()
                     },
@@ -7516,22 +7692,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x3e62f41a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x748b7466).into()),
                         terminal_background: Some(rgba(0x131513ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x667a66ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x840b21ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x204f1bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x4b4a17ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x193385ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x810e60ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x1d4a56ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_foreground: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x131513ff).into()),
                         terminal_ansi_black: Some(rgba(0x131513ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x667a66ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf4fbf4ff).into()),
                         terminal_ansi_red: Some(rgba(0xe61c3cff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x840b21ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xff9d98ff).into()),
                         terminal_ansi_green: Some(rgba(0x2ba32aff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x204f1bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xa0d294ff).into()),
                         terminal_ansi_yellow: Some(rgba(0x98981cff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x4b4a17ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xd0ca90ff).into()),
                         terminal_ansi_blue: Some(rgba(0x3e62f4ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x193385ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xb1adfcff).into()),
                         terminal_ansi_magenta: Some(rgba(0xe61cc3ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x810e60ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xf9a1e1ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x1c99b3ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x1d4a56ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9fccd9ff).into()),
                         terminal_ansi_white: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x829b82ff).into()),
                         link_text_hover: Some(rgba(0x3e62f4ff).into()),
                         ..Default::default()
                     },
@@ -7981,22 +8168,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x3f62f41a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x748b7466).into()),
                         terminal_background: Some(rgba(0xf4fbf4ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x829b82ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xff9d98ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xa0d294ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xd0ca90ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xb1adfcff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xf9a1e1ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9fccd9ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x131513ff).into()),
+                        terminal_foreground: Some(rgba(0x131513ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x131513ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf4fbf4ff).into()),
                         terminal_ansi_black: Some(rgba(0xf4fbf4ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x829b82ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x131513ff).into()),
                         terminal_ansi_red: Some(rgba(0xe61c3dff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xff9d98ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x840b21ff).into()),
                         terminal_ansi_green: Some(rgba(0x2ba32bff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xa0d294ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x204f1bff).into()),
                         terminal_ansi_yellow: Some(rgba(0x98981dff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xd0ca90ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x4b4a17ff).into()),
                         terminal_ansi_blue: Some(rgba(0x3f62f4ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xb1adfcff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x193385ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xe61dc3ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xf9a1e1ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x810e60ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x1d99b3ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9fccd9ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1d4a56ff).into()),
                         terminal_ansi_white: Some(rgba(0x131513ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x131513ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x667a66ff).into()),
                         link_text_hover: Some(rgba(0x3f62f4ff).into()),
                         ..Default::default()
                     },
@@ -8446,22 +8644,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x3e8fd01a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x7a819c66).into()),
                         terminal_background: Some(rgba(0x202746ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x697192ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x6d2616ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x534921ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x63441eff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x274664ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x4c333dff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x214e5fff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xf5f7ffff).into()),
+                        terminal_foreground: Some(rgba(0xf5f7ffff).into()),
+                        terminal_bright_foreground: Some(rgba(0xf5f7ffff).into()),
+                        terminal_dim_foreground: Some(rgba(0x202746ff).into()),
                         terminal_ansi_black: Some(rgba(0x202746ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x697192ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xf5f7ffff).into()),
                         terminal_ansi_red: Some(rgba(0xc94923ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x6d2616ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xefa58cff).into()),
                         terminal_ansi_green: Some(rgba(0xac973aff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x534921ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xd9ca9bff).into()),
                         terminal_ansi_yellow: Some(rgba(0xc08b31ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x63441eff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xe5c497ff).into()),
                         terminal_ansi_blue: Some(rgba(0x3e8fd0ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x274664ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xa9c6e8ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x9c637aff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x4c333dff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xcfafbbff).into()),
                         terminal_ansi_cyan: Some(rgba(0x25a2c9ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x214e5fff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xa4d0e4ff).into()),
                         terminal_ansi_white: Some(rgba(0xf5f7ffff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xf5f7ffff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x8b91a7ff).into()),
                         link_text_hover: Some(rgba(0x3e8fd0ff).into()),
                         ..Default::default()
                     },
@@ -8911,22 +9120,33 @@ pub fn atelier() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x3f8fd01a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x7a819c66).into()),
                         terminal_background: Some(rgba(0xf5f7ffff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x8b91a7ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xefa58cff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xd9ca9bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe5c497ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xa9c6e8ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xcfafbbff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xa4d0e4ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x202746ff).into()),
+                        terminal_foreground: Some(rgba(0x202746ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x202746ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf5f7ffff).into()),
                         terminal_ansi_black: Some(rgba(0xf5f7ffff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x8b91a7ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x202746ff).into()),
                         terminal_ansi_red: Some(rgba(0xc94a23ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xefa58cff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x6d2616ff).into()),
                         terminal_ansi_green: Some(rgba(0xac973aff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xd9ca9bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x534921ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xc08b31ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe5c497ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x63441eff).into()),
                         terminal_ansi_blue: Some(rgba(0x3f8fd0ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xa9c6e8ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x274664ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x9c637aff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xcfafbbff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x4c333dff).into()),
                         terminal_ansi_cyan: Some(rgba(0x25a2c9ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xa4d0e4ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x214e5fff).into()),
                         terminal_ansi_white: Some(rgba(0x202746ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x202746ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x697192ff).into()),
                         link_text_hover: Some(rgba(0x3f8fd0ff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/ayu.rs 🔗

@@ -76,22 +76,33 @@ pub fn ayu() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x5ac2fe1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x66676766).into()),
                         terminal_background: Some(rgba(0x0d1017ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x545557ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x83363cff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x567627ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x92592cff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x28628cff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x205b78ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xbfbdb6ff).into()),
+                        terminal_foreground: Some(rgba(0xbfbdb6ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xbfbdb6ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x0d1017ff).into()),
                         terminal_ansi_black: Some(rgba(0x0d1017ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x545557ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xbfbdb6ff).into()),
                         terminal_ansi_red: Some(rgba(0xef7178ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x83363cff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xfebab9ff).into()),
                         terminal_ansi_green: Some(rgba(0xaad84cff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x567627ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xd8eca8ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xfeb454ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x92592cff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xffd9aaff).into()),
                         terminal_ansi_blue: Some(rgba(0x5ac2feff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x28628cff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xb8e0ffff).into()),
                         terminal_ansi_magenta: Some(rgba(0x3abae5ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x205b78ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xaddcf3ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x95e5cbff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xccf3e5ff).into()),
                         terminal_ansi_white: Some(rgba(0xbfbdb6ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xbfbdb6ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x787876ff).into()),
                         link_text_hover: Some(rgba(0x5ac2feff).into()),
                         ..Default::default()
                     },
@@ -520,22 +531,33 @@ pub fn ayu() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x3b9ee51a).into()),
                         editor_document_highlight_write_background: Some(rgba(0xacafb166).into()),
                         terminal_background: Some(rgba(0xfcfcfcff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xbcbec0ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xfebab6ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xc7d98fff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xffd6a4ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xaccef3ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xb2d9e9ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xace0cbff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x5c6166ff).into()),
+                        terminal_foreground: Some(rgba(0x5c6166ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x5c6166ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfcfcfcff).into()),
                         terminal_ansi_black: Some(rgba(0xfcfcfcff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xbcbec0ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x5c6166ff).into()),
                         terminal_ansi_red: Some(rgba(0xef7271ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xfebab6ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x833639ff).into()),
                         terminal_ansi_green: Some(rgba(0x86b305ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xc7d98fff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x445614ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf1ae4aff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xffd6a4ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x8a5328ff).into()),
                         terminal_ansi_blue: Some(rgba(0x3b9ee5ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xaccef3ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x214d76ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x56b4d3ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xb2d9e9ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x2f5669ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x4dbf99ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xace0cbff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x2a5f4aff).into()),
                         terminal_ansi_white: Some(rgba(0x5c6166ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x5c6166ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x9c9fa2ff).into()),
                         link_text_hover: Some(rgba(0x3b9ee5ff).into()),
                         ..Default::default()
                     },
@@ -964,22 +986,33 @@ pub fn ayu() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x73cffe1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x787a7c66).into()),
                         terminal_background: Some(rgba(0x242936ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x67696eff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x83403dff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x76993dff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x937238ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x346e8dff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x2b6c7bff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xcccac2ff).into()),
+                        terminal_foreground: Some(rgba(0xcccac2ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xcccac2ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x242936ff).into()),
                         terminal_ansi_black: Some(rgba(0x242936ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x67696eff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xcccac2ff).into()),
                         terminal_ansi_red: Some(rgba(0xf18779ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x83403dff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xfec4baff).into()),
                         terminal_ansi_green: Some(rgba(0xd5fe80ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x76993dff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xecffc1ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xfed073ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x937238ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xffe7b9ff).into()),
                         terminal_ansi_blue: Some(rgba(0x73cffeff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x346e8dff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xc1e7ffff).into()),
                         terminal_ansi_magenta: Some(rgba(0x5ccee5ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x2b6c7bff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xb7e7f2ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x95e5cbff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xccf3e5ff).into()),
                         terminal_ansi_white: Some(rgba(0xcccac2ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xcccac2ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x898a8aff).into()),
                         link_text_hover: Some(rgba(0x73cffeff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/gruvbox.rs 🔗

@@ -76,22 +76,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0x282828ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x282828ff).into()),
                         terminal_ansi_black: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()),
                         terminal_ansi_red: Some(rgba(0xfb4a35ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()),
                         terminal_ansi_green: Some(rgba(0xb8bb27ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()),
                         terminal_ansi_blue: Some(rgba(0x83a598ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()),
                         terminal_ansi_magenta: Some(rgba(0xa89984ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()),
                         terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()),
                         link_text_hover: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
@@ -527,22 +538,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0x1d2021ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x1d2021ff).into()),
                         terminal_ansi_black: Some(rgba(0x1d2021ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()),
                         terminal_ansi_red: Some(rgba(0xfb4a35ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()),
                         terminal_ansi_green: Some(rgba(0xb8bb27ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()),
                         terminal_ansi_blue: Some(rgba(0x83a598ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()),
                         terminal_ansi_magenta: Some(rgba(0xa89984ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()),
                         terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()),
                         link_text_hover: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
@@ -978,22 +1000,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0x32302fff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x32302fff).into()),
                         terminal_ansi_black: Some(rgba(0x32302fff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x73675eff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()),
                         terminal_ansi_red: Some(rgba(0xfb4a35ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x93211eff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()),
                         terminal_ansi_green: Some(rgba(0xb8bb27ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()),
                         terminal_ansi_blue: Some(rgba(0x83a598ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()),
                         terminal_ansi_magenta: Some(rgba(0xa89984ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()),
                         terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()),
                         link_text_hover: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
@@ -1429,22 +1462,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0xfbf1c7ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfbf1c7ff).into()),
                         terminal_ansi_black: Some(rgba(0xfbf1c7ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x282828ff).into()),
                         terminal_ansi_red: Some(rgba(0x9d0408ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()),
                         terminal_ansi_green: Some(rgba(0x797410ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xb57616ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()),
                         terminal_ansi_blue: Some(rgba(0x0b6678ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()),
                         terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x437b59ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()),
                         terminal_ansi_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x73675eff).into()),
                         link_text_hover: Some(rgba(0x0b6678ff).into()),
                         ..Default::default()
                     },
@@ -1880,22 +1924,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0xf9f5d7ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf9f5d7ff).into()),
                         terminal_ansi_black: Some(rgba(0xf9f5d7ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x282828ff).into()),
                         terminal_ansi_red: Some(rgba(0x9d0408ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()),
                         terminal_ansi_green: Some(rgba(0x797410ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xb57616ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()),
                         terminal_ansi_blue: Some(rgba(0x0b6678ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()),
                         terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x437b59ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()),
                         terminal_ansi_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x73675eff).into()),
                         link_text_hover: Some(rgba(0x0b6678ff).into()),
                         ..Default::default()
                     },
@@ -2331,22 +2386,33 @@ pub fn gruvbox() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x92847466).into()),
                         terminal_background: Some(rgba(0xf2e5bcff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x282828ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xf2e5bcff).into()),
                         terminal_ansi_black: Some(rgba(0xf2e5bcff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x282828ff).into()),
                         terminal_ansi_red: Some(rgba(0x9d0408ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()),
                         terminal_ansi_green: Some(rgba(0x797410ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xb57616ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()),
                         terminal_ansi_blue: Some(rgba(0x0b6678ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()),
                         terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x437b59ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()),
                         terminal_ansi_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x282828ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x73675eff).into()),
                         link_text_hover: Some(rgba(0x0b6678ff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/one.rs 🔗

@@ -76,22 +76,33 @@ pub fn one() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x74ade81a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x555a6366).into()),
                         terminal_background: Some(rgba(0x282c34ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x525661ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x673a3cff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x4d6140ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x786441ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x385378ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x5e2b26ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x3a565bff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xc8ccd4ff).into()),
+                        terminal_foreground: Some(rgba(0xc8ccd4ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xc8ccd4ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x282c34ff).into()),
                         terminal_ansi_black: Some(rgba(0x282c34ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x525661ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xc8ccd4ff).into()),
                         terminal_ansi_red: Some(rgba(0xd07277ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x673a3cff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xebb8b9ff).into()),
                         terminal_ansi_green: Some(rgba(0xa1c181ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x4d6140ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xd1e0bfff).into()),
                         terminal_ansi_yellow: Some(rgba(0xdec184ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x786441ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xf1dfc1ff).into()),
                         terminal_ansi_blue: Some(rgba(0x74ade8ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x385378ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xbed5f4ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xbe5046ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x5e2b26ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xe6a79eff).into()),
                         terminal_ansi_cyan: Some(rgba(0x6fb4c0ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x3a565bff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xb9d9dfff).into()),
                         terminal_ansi_white: Some(rgba(0xc8ccd4ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xc8ccd4ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x575d65ff).into()),
                         link_text_hover: Some(rgba(0x74ade8ff).into()),
                         ..Default::default()
                     },
@@ -527,22 +538,33 @@ pub fn one() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x5c79e21a).into()),
                         editor_document_highlight_write_background: Some(rgba(0xa3a3a466).into()),
                         terminal_background: Some(rgba(0xfafafaff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xaaaaaaff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xf0b0a4ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xb2cfa9ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xf1dfc1ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xb5baf2ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xcea6d3ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0xa4bfdbff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x383a41ff).into()),
+                        terminal_foreground: Some(rgba(0x383a41ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x383a41ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfafafaff).into()),
                         terminal_ansi_black: Some(rgba(0xfafafaff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xaaaaaaff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x383a41ff).into()),
                         terminal_ansi_red: Some(rgba(0xd36151ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xf0b0a4ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x6f312aff).into()),
                         terminal_ansi_green: Some(rgba(0x669f59ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xb2cfa9ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x354d2eff).into()),
                         terminal_ansi_yellow: Some(rgba(0xdec184ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xf1dfc1ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x786441ff).into()),
                         terminal_ansi_blue: Some(rgba(0x5c79e2ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xb5baf2ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x2d3d75ff).into()),
                         terminal_ansi_magenta: Some(rgba(0x994fa6ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xcea6d3ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x4b2a50ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3b82b7ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0xa4bfdbff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x254058ff).into()),
                         terminal_ansi_white: Some(rgba(0x383a41ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x383a41ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x98989bff).into()),
                         link_text_hover: Some(rgba(0x5c79e2ff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/rose_pine.rs 🔗

@@ -76,22 +76,33 @@ pub fn rose_pine() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x9cced71a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x28253c66).into()),
                         terminal_background: Some(rgba(0x191724ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x403d55ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x31614fff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x4c3b47ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x203a46ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_foreground: Some(rgba(0xe0def4ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xe0def4ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x191724ff).into()),
                         terminal_ansi_black: Some(rgba(0x191724ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x403d55ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xe0def4ff).into()),
                         terminal_ansi_red: Some(rgba(0xea6f92ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xfab9c7ff).into()),
                         terminal_ansi_green: Some(rgba(0x5dc2a3ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x31614fff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xb3e1d1ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf5c177ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xfedfbbff).into()),
                         terminal_ansi_blue: Some(rgba(0x9cced7ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xcfe7ebff).into()),
                         terminal_ansi_magenta: Some(rgba(0x9d7691ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x4c3b47ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xceb9c7ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x32748fff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x203a46ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9cb7c6ff).into()),
                         terminal_ansi_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x514e68ff).into()),
                         link_text_hover: Some(rgba(0x9cced7ff).into()),
                         ..Default::default()
                     },
@@ -534,22 +545,33 @@ pub fn rose_pine() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x57949f1a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x9691a466).into()),
                         terminal_background: Some(rgba(0xfaf4edff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0xb8b2baff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xdcb0bbff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xa5d5c5ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xfccd9bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xacc9ceff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xbcb1bdff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x97b1c0ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x575279ff).into()),
+                        terminal_foreground: Some(rgba(0x575279ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x575279ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfaf4edff).into()),
                         terminal_ansi_black: Some(rgba(0xfaf4edff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0xb8b2baff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x575279ff).into()),
                         terminal_ansi_red: Some(rgba(0xb4647aff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xdcb0bbff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x57333dff).into()),
                         terminal_ansi_green: Some(rgba(0x3eaa8eff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xa5d5c5ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x265245ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xe99d35ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xfccd9bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x854a1fff).into()),
                         terminal_ansi_blue: Some(rgba(0x57949fff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xacc9ceff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x2f484dff).into()),
                         terminal_ansi_magenta: Some(rgba(0x7c697fff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xbcb1bdff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x3e353fff).into()),
                         terminal_ansi_cyan: Some(rgba(0x2a6983ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x97b1c0ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x1c3641ff).into()),
                         terminal_ansi_white: Some(rgba(0x575279ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x575279ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x827e98ff).into()),
                         link_text_hover: Some(rgba(0x57949fff).into()),
                         ..Default::default()
                     },
@@ -992,22 +1014,33 @@ pub fn rose_pine() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x9cced71a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x59557166).into()),
                         terminal_background: Some(rgba(0x232136ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x3f3b58ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x31614fff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x51414eff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x264654ff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_foreground: Some(rgba(0xe0def4ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xe0def4ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x232136ff).into()),
                         terminal_ansi_black: Some(rgba(0x232136ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x3f3b58ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xe0def4ff).into()),
                         terminal_ansi_red: Some(rgba(0xea6f92ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xfab9c7ff).into()),
                         terminal_ansi_green: Some(rgba(0x5dc2a3ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x31614fff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xb3e1d1ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xf5c177ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xfedfbbff).into()),
                         terminal_ansi_blue: Some(rgba(0x9cced7ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xcfe7ebff).into()),
                         terminal_ansi_magenta: Some(rgba(0xa784a1ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x51414eff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xd3c0cfff).into()),
                         terminal_ansi_cyan: Some(rgba(0x3f8fb0ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x264654ff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0xa5c6d7ff).into()),
                         terminal_ansi_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x75718eff).into()),
                         link_text_hover: Some(rgba(0x9cced7ff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/sandcastle.rs 🔗

@@ -75,22 +75,33 @@ pub fn sandcastle() -> UserThemeFamily {
                     editor_document_highlight_read_background: Some(rgba(0x528b8b1a).into()),
                     editor_document_highlight_write_background: Some(rgba(0x7c6f6466).into()),
                     terminal_background: Some(rgba(0x282c34ff).into()),
-                    terminal_ansi_bright_black: Some(rgba(0x5e5753ff).into()),
-                    terminal_ansi_bright_red: Some(rgba(0x57333dff).into()),
-                    terminal_ansi_bright_green: Some(rgba(0x414f4aff).into()),
-                    terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()),
-                    terminal_ansi_bright_blue: Some(rgba(0x2c4444ff).into()),
-                    terminal_ansi_bright_magenta: Some(rgba(0x523a18ff).into()),
-                    terminal_ansi_bright_cyan: Some(rgba(0x414f4aff).into()),
-                    terminal_ansi_bright_white: Some(rgba(0xfdf4c1ff).into()),
+                    terminal_foreground: Some(rgba(0xfdf4c1ff).into()),
+                    terminal_bright_foreground: Some(rgba(0xfdf4c1ff).into()),
+                    terminal_dim_foreground: Some(rgba(0x282c34ff).into()),
                     terminal_ansi_black: Some(rgba(0x282c34ff).into()),
+                    terminal_ansi_bright_black: Some(rgba(0x5e5753ff).into()),
+                    terminal_ansi_dim_black: Some(rgba(0xfdf4c1ff).into()),
                     terminal_ansi_red: Some(rgba(0xb4637aff).into()),
+                    terminal_ansi_bright_red: Some(rgba(0x57333dff).into()),
+                    terminal_ansi_dim_red: Some(rgba(0xdcb0bbff).into()),
                     terminal_ansi_green: Some(rgba(0x83a598ff).into()),
+                    terminal_ansi_bright_green: Some(rgba(0x414f4aff).into()),
+                    terminal_ansi_dim_green: Some(rgba(0xc0d2cbff).into()),
                     terminal_ansi_yellow: Some(rgba(0xa07e3bff).into()),
+                    terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()),
+                    terminal_ansi_dim_yellow: Some(rgba(0xd3bd9aff).into()),
                     terminal_ansi_blue: Some(rgba(0x528b8bff).into()),
+                    terminal_ansi_bright_blue: Some(rgba(0x2c4444ff).into()),
+                    terminal_ansi_dim_blue: Some(rgba(0xa8c4c4ff).into()),
                     terminal_ansi_magenta: Some(rgba(0xa87323ff).into()),
+                    terminal_ansi_bright_magenta: Some(rgba(0x523a18ff).into()),
+                    terminal_ansi_dim_magenta: Some(rgba(0xdab78eff).into()),
                     terminal_ansi_cyan: Some(rgba(0x83a598ff).into()),
+                    terminal_ansi_bright_cyan: Some(rgba(0x414f4aff).into()),
+                    terminal_ansi_dim_cyan: Some(rgba(0xc0d2cbff).into()),
                     terminal_ansi_white: Some(rgba(0xfdf4c1ff).into()),
+                    terminal_ansi_bright_white: Some(rgba(0xfdf4c1ff).into()),
+                    terminal_ansi_dim_white: Some(rgba(0x968777ff).into()),
                     link_text_hover: Some(rgba(0x528b8bff).into()),
                     ..Default::default()
                 },

crates/theme/src/themes/solarized.rs 🔗

@@ -76,22 +76,33 @@ pub fn solarized() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x288bd11a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x6d828866).into()),
                         terminal_background: Some(rgba(0x002b36ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x5c7279ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0x7d181cff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0x434a11ff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0x5d4310ff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0x214465ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0x6f1f40ff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x204e4aff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_foreground: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_bright_foreground: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_dim_foreground: Some(rgba(0x002b36ff).into()),
                         terminal_ansi_black: Some(rgba(0x002b36ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x5c7279ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0xfdf6e3ff).into()),
                         terminal_ansi_red: Some(rgba(0xdc3330ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0x7d181cff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0xfaa091ff).into()),
                         terminal_ansi_green: Some(rgba(0x859904ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0x434a11ff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0xc6cb8bff).into()),
                         terminal_ansi_yellow: Some(rgba(0xb58903ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0x5d4310ff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0xe1c28aff).into()),
                         terminal_ansi_blue: Some(rgba(0x288bd1ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0x214465ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0xa5c3e9ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xd33782ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0x6f1f40ff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0xf0a2bfff).into()),
                         terminal_ansi_cyan: Some(rgba(0x2ca198ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x204e4aff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x9fd0cbff).into()),
                         terminal_ansi_white: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x7b8e91ff).into()),
                         link_text_hover: Some(rgba(0x288bd1ff).into()),
                         ..Default::default()
                     },
@@ -520,22 +531,33 @@ pub fn solarized() -> UserThemeFamily {
                         editor_document_highlight_read_background: Some(rgba(0x298bd11a).into()),
                         editor_document_highlight_write_background: Some(rgba(0x6d828866).into()),
                         terminal_background: Some(rgba(0xfdf6e3ff).into()),
-                        terminal_ansi_bright_black: Some(rgba(0x7b8e91ff).into()),
-                        terminal_ansi_bright_red: Some(rgba(0xfaa091ff).into()),
-                        terminal_ansi_bright_green: Some(rgba(0xc6cb8bff).into()),
-                        terminal_ansi_bright_yellow: Some(rgba(0xe1c28aff).into()),
-                        terminal_ansi_bright_blue: Some(rgba(0xa5c3e9ff).into()),
-                        terminal_ansi_bright_magenta: Some(rgba(0xf0a2bfff).into()),
-                        terminal_ansi_bright_cyan: Some(rgba(0x9fd0cbff).into()),
-                        terminal_ansi_bright_white: Some(rgba(0x002b36ff).into()),
+                        terminal_foreground: Some(rgba(0x002b36ff).into()),
+                        terminal_bright_foreground: Some(rgba(0x002b36ff).into()),
+                        terminal_dim_foreground: Some(rgba(0xfdf6e3ff).into()),
                         terminal_ansi_black: Some(rgba(0xfdf6e3ff).into()),
+                        terminal_ansi_bright_black: Some(rgba(0x7b8e91ff).into()),
+                        terminal_ansi_dim_black: Some(rgba(0x002b36ff).into()),
                         terminal_ansi_red: Some(rgba(0xdc3330ff).into()),
+                        terminal_ansi_bright_red: Some(rgba(0xfaa091ff).into()),
+                        terminal_ansi_dim_red: Some(rgba(0x7d181cff).into()),
                         terminal_ansi_green: Some(rgba(0x859904ff).into()),
+                        terminal_ansi_bright_green: Some(rgba(0xc6cb8bff).into()),
+                        terminal_ansi_dim_green: Some(rgba(0x434a11ff).into()),
                         terminal_ansi_yellow: Some(rgba(0xb58904ff).into()),
+                        terminal_ansi_bright_yellow: Some(rgba(0xe1c28aff).into()),
+                        terminal_ansi_dim_yellow: Some(rgba(0x5d4310ff).into()),
                         terminal_ansi_blue: Some(rgba(0x298bd1ff).into()),
+                        terminal_ansi_bright_blue: Some(rgba(0xa5c3e9ff).into()),
+                        terminal_ansi_dim_blue: Some(rgba(0x214465ff).into()),
                         terminal_ansi_magenta: Some(rgba(0xd33882ff).into()),
+                        terminal_ansi_bright_magenta: Some(rgba(0xf0a2bfff).into()),
+                        terminal_ansi_dim_magenta: Some(rgba(0x6f1f40ff).into()),
                         terminal_ansi_cyan: Some(rgba(0x2ca198ff).into()),
+                        terminal_ansi_bright_cyan: Some(rgba(0x9fd0cbff).into()),
+                        terminal_ansi_dim_cyan: Some(rgba(0x204e4aff).into()),
                         terminal_ansi_white: Some(rgba(0x002b36ff).into()),
+                        terminal_ansi_bright_white: Some(rgba(0x002b36ff).into()),
+                        terminal_ansi_dim_white: Some(rgba(0x5c7279ff).into()),
                         link_text_hover: Some(rgba(0x298bd1ff).into()),
                         ..Default::default()
                     },

crates/theme/src/themes/summercamp.rs 🔗

@@ -75,22 +75,33 @@ pub fn summercamp() -> UserThemeFamily {
                     editor_document_highlight_read_background: Some(rgba(0x499bef1a).into()),
                     editor_document_highlight_write_background: Some(rgba(0x49443366).into()),
                     terminal_background: Some(rgba(0x1c1810ff).into()),
-                    terminal_ansi_bright_black: Some(rgba(0x3b3627ff).into()),
-                    terminal_ansi_bright_red: Some(rgba(0x7f2724ff).into()),
-                    terminal_ansi_bright_green: Some(rgba(0x28842cff).into()),
-                    terminal_ansi_bright_yellow: Some(rgba(0x8c9a10ff).into()),
-                    terminal_ansi_bright_blue: Some(rgba(0x234b7fff).into()),
-                    terminal_ansi_bright_magenta: Some(rgba(0x88487eff).into()),
-                    terminal_ansi_bright_cyan: Some(rgba(0x298462ff).into()),
-                    terminal_ansi_bright_white: Some(rgba(0xf8f5deff).into()),
+                    terminal_foreground: Some(rgba(0xf8f5deff).into()),
+                    terminal_bright_foreground: Some(rgba(0xf8f5deff).into()),
+                    terminal_dim_foreground: Some(rgba(0x1c1810ff).into()),
                     terminal_ansi_black: Some(rgba(0x1c1810ff).into()),
+                    terminal_ansi_bright_black: Some(rgba(0x3b3627ff).into()),
+                    terminal_ansi_dim_black: Some(rgba(0xf8f5deff).into()),
                     terminal_ansi_red: Some(rgba(0xe35142ff).into()),
+                    terminal_ansi_bright_red: Some(rgba(0x7f2724ff).into()),
+                    terminal_ansi_dim_red: Some(rgba(0xfbab9cff).into()),
                     terminal_ansi_green: Some(rgba(0x5dea5aff).into()),
+                    terminal_ansi_bright_green: Some(rgba(0x28842cff).into()),
+                    terminal_ansi_dim_green: Some(rgba(0xb9f7aeff).into()),
                     terminal_ansi_yellow: Some(rgba(0xf1fe29ff).into()),
+                    terminal_ansi_bright_yellow: Some(rgba(0x8c9a10ff).into()),
+                    terminal_ansi_dim_yellow: Some(rgba(0xffffa2ff).into()),
                     terminal_ansi_blue: Some(rgba(0x499befff).into()),
+                    terminal_ansi_bright_blue: Some(rgba(0x234b7fff).into()),
+                    terminal_ansi_dim_blue: Some(rgba(0xb1ccf8ff).into()),
                     terminal_ansi_magenta: Some(rgba(0xf59be6ff).into()),
+                    terminal_ansi_bright_magenta: Some(rgba(0x88487eff).into()),
+                    terminal_ansi_dim_magenta: Some(rgba(0xfccef3ff).into()),
                     terminal_ansi_cyan: Some(rgba(0x5beabcff).into()),
+                    terminal_ansi_bright_cyan: Some(rgba(0x298462ff).into()),
+                    terminal_ansi_dim_cyan: Some(rgba(0xb7f6ddff).into()),
                     terminal_ansi_white: Some(rgba(0xf8f5deff).into()),
+                    terminal_ansi_bright_white: Some(rgba(0xf8f5deff).into()),
+                    terminal_ansi_dim_white: Some(rgba(0x57533fff).into()),
                     link_text_hover: Some(rgba(0x499befff).into()),
                     ..Default::default()
                 },

crates/theme_importer/src/theme_printer.rs 🔗

@@ -244,43 +244,60 @@ impl<'a> Debug for ThemeColorsRefinementPrinter<'a> {
                 self.0.editor_document_highlight_write_background,
             ),
             ("terminal_background", self.0.terminal_background),
+            ("terminal_foreground", self.0.terminal_foreground),
+            (
+                "terminal_bright_foreground",
+                self.0.terminal_bright_foreground,
+            ),
+            ("terminal_dim_foreground", self.0.terminal_dim_foreground),
+            ("terminal_ansi_black", self.0.terminal_ansi_black),
             (
                 "terminal_ansi_bright_black",
                 self.0.terminal_ansi_bright_black,
             ),
+            ("terminal_ansi_dim_black", self.0.terminal_ansi_dim_black),
+            ("terminal_ansi_red", self.0.terminal_ansi_red),
             ("terminal_ansi_bright_red", self.0.terminal_ansi_bright_red),
+            ("terminal_ansi_dim_red", self.0.terminal_ansi_dim_red),
+            ("terminal_ansi_green", self.0.terminal_ansi_green),
             (
                 "terminal_ansi_bright_green",
                 self.0.terminal_ansi_bright_green,
             ),
+            ("terminal_ansi_dim_green", self.0.terminal_ansi_dim_green),
+            ("terminal_ansi_yellow", self.0.terminal_ansi_yellow),
             (
                 "terminal_ansi_bright_yellow",
                 self.0.terminal_ansi_bright_yellow,
             ),
+            ("terminal_ansi_dim_yellow", self.0.terminal_ansi_dim_yellow),
+            ("terminal_ansi_blue", self.0.terminal_ansi_blue),
             (
                 "terminal_ansi_bright_blue",
                 self.0.terminal_ansi_bright_blue,
             ),
+            ("terminal_ansi_dim_blue", self.0.terminal_ansi_dim_blue),
+            ("terminal_ansi_magenta", self.0.terminal_ansi_magenta),
             (
                 "terminal_ansi_bright_magenta",
                 self.0.terminal_ansi_bright_magenta,
             ),
+            (
+                "terminal_ansi_dim_magenta",
+                self.0.terminal_ansi_dim_magenta,
+            ),
+            ("terminal_ansi_cyan", self.0.terminal_ansi_cyan),
             (
                 "terminal_ansi_bright_cyan",
                 self.0.terminal_ansi_bright_cyan,
             ),
+            ("terminal_ansi_dim_cyan", self.0.terminal_ansi_dim_cyan),
+            ("terminal_ansi_white", self.0.terminal_ansi_white),
             (
                 "terminal_ansi_bright_white",
                 self.0.terminal_ansi_bright_white,
             ),
-            ("terminal_ansi_black", self.0.terminal_ansi_black),
-            ("terminal_ansi_red", self.0.terminal_ansi_red),
-            ("terminal_ansi_green", self.0.terminal_ansi_green),
-            ("terminal_ansi_yellow", self.0.terminal_ansi_yellow),
-            ("terminal_ansi_blue", self.0.terminal_ansi_blue),
-            ("terminal_ansi_magenta", self.0.terminal_ansi_magenta),
-            ("terminal_ansi_cyan", self.0.terminal_ansi_cyan),
-            ("terminal_ansi_white", self.0.terminal_ansi_white),
+            ("terminal_ansi_dim_white", self.0.terminal_ansi_dim_white),
             ("link_text_hover", self.0.link_text_hover),
         ];
 

crates/theme_importer/src/zed1/converter.rs 🔗

@@ -250,22 +250,33 @@ impl Zed1ThemeConverter {
                 editor.document_highlight_write_background,
             ),
             terminal_background: convert(terminal.background),
-            terminal_ansi_bright_black: convert(terminal.bright_black),
-            terminal_ansi_bright_red: convert(terminal.bright_red),
-            terminal_ansi_bright_green: convert(terminal.bright_green),
-            terminal_ansi_bright_yellow: convert(terminal.bright_yellow),
-            terminal_ansi_bright_blue: convert(terminal.bright_blue),
-            terminal_ansi_bright_magenta: convert(terminal.bright_magenta),
-            terminal_ansi_bright_cyan: convert(terminal.bright_cyan),
-            terminal_ansi_bright_white: convert(terminal.bright_white),
+            terminal_foreground: convert(terminal.foreground),
+            terminal_bright_foreground: convert(terminal.bright_foreground),
+            terminal_dim_foreground: convert(terminal.dim_foreground),
             terminal_ansi_black: convert(terminal.black),
+            terminal_ansi_bright_black: convert(terminal.bright_black),
+            terminal_ansi_dim_black: convert(terminal.dim_black),
             terminal_ansi_red: convert(terminal.red),
+            terminal_ansi_bright_red: convert(terminal.bright_red),
+            terminal_ansi_dim_red: convert(terminal.dim_red),
             terminal_ansi_green: convert(terminal.green),
+            terminal_ansi_bright_green: convert(terminal.bright_green),
+            terminal_ansi_dim_green: convert(terminal.dim_green),
             terminal_ansi_yellow: convert(terminal.yellow),
+            terminal_ansi_bright_yellow: convert(terminal.bright_yellow),
+            terminal_ansi_dim_yellow: convert(terminal.dim_yellow),
             terminal_ansi_blue: convert(terminal.blue),
+            terminal_ansi_bright_blue: convert(terminal.bright_blue),
+            terminal_ansi_dim_blue: convert(terminal.dim_blue),
             terminal_ansi_magenta: convert(terminal.magenta),
+            terminal_ansi_bright_magenta: convert(terminal.bright_magenta),
+            terminal_ansi_dim_magenta: convert(terminal.dim_magenta),
             terminal_ansi_cyan: convert(terminal.cyan),
+            terminal_ansi_bright_cyan: convert(terminal.bright_cyan),
+            terminal_ansi_dim_cyan: convert(terminal.dim_cyan),
             terminal_ansi_white: convert(terminal.white),
+            terminal_ansi_bright_white: convert(terminal.bright_white),
+            terminal_ansi_dim_white: convert(terminal.dim_white),
             link_text_hover: convert(highest.accent.default.foreground),
         })
     }

crates/ui/src/components/label/label.rs 🔗

@@ -37,7 +37,7 @@ pub struct Label {
 }
 
 impl Label {
-    /// Create a new [`Label`] with the given text.
+    /// Creates a new [`Label`] with the given text.
     ///
     /// # Examples
     ///

crates/ui/src/components/list/list_item.rs 🔗

@@ -222,17 +222,19 @@ impl RenderOnce for ListItem {
                     }))
                     .child(
                         h_flex()
-                            // HACK: We need to set *any* width value here in order for this container to size correctly.
-                            // Without this the `h_flex` will overflow the parent `inner_list_item`.
-                            .w_px()
-                            .flex_1()
+                            .flex_grow()
+                            .flex_shrink_0()
+                            .flex_basis(relative(0.25))
                             .gap_1()
+                            .overflow_hidden()
                             .children(self.start_slot)
                             .children(self.children),
                     )
                     .when_some(self.end_slot, |this, end_slot| {
                         this.justify_between().child(
                             h_flex()
+                                .flex_shrink()
+                                .overflow_hidden()
                                 .when(self.end_hover_slot.is_some(), |this| {
                                     this.visible()
                                         .group_hover("list_item", |this| this.invisible())

crates/ui/src/components/stories/list_item.rs 🔗

@@ -4,6 +4,8 @@ use story::Story;
 use crate::{prelude::*, Avatar};
 use crate::{IconName, ListItem};
 
+const OVERFLOWING_TEXT: &'static str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean mauris ligula, luctus vel dignissim eu, vestibulum sed libero. Sed at convallis velit.";
+
 pub struct ListItemStory;
 
 impl Render for ListItemStory {
@@ -98,5 +100,29 @@ impl Render for ListItemStory {
                         println!("Right mouse down!");
                     }),
             )
+            .child(Story::label("With overflowing content in the `end_slot`"))
+            .child(
+                ListItem::new("with_overflowing_content_in_end_slot")
+                    .child("An excerpt")
+                    .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)),
+            )
+            .child(Story::label(
+                "`inset` with overflowing content in the `end_slot`",
+            ))
+            .child(
+                ListItem::new("inset_with_overflowing_content_in_end_slot")
+                    .inset(true)
+                    .child("An excerpt")
+                    .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)),
+            )
+            .child(Story::label(
+                "`inset` with overflowing content in `children` and `end_slot`",
+            ))
+            .child(
+                ListItem::new("inset_with_overflowing_content_in_children_and_end_slot")
+                    .inset(true)
+                    .child(Label::new(OVERFLOWING_TEXT))
+                    .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)),
+            )
     }
 }

crates/vim/src/motion.rs 🔗

@@ -11,6 +11,7 @@ use workspace::Workspace;
 use crate::{
     normal::normal_motion,
     state::{Mode, Operator},
+    utils::coerce_punctuation,
     visual::visual_motion,
     Vim,
 };
@@ -680,8 +681,8 @@ pub(crate) fn next_word_start(
     for _ in 0..times {
         let mut crossed_newline = false;
         point = movement::find_boundary(map, point, FindRange::MultiLine, |left, right| {
-            let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation);
-            let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation);
+            let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation);
+            let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation);
             let at_newline = right == '\n';
 
             let found = (left_kind != right_kind && right_kind != CharKind::Whitespace)
@@ -710,8 +711,8 @@ fn next_word_end(
             *point.column_mut() = 0;
         }
         point = movement::find_boundary(map, point, FindRange::MultiLine, |left, right| {
-            let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation);
-            let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation);
+            let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation);
+            let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation);
 
             left_kind != right_kind && left_kind != CharKind::Whitespace
         });
@@ -743,8 +744,8 @@ fn previous_word_start(
         // cursor because the newline is checked only once.
         point =
             movement::find_preceding_boundary(map, point, FindRange::MultiLine, |left, right| {
-                let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation);
-                let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation);
+                let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation);
+                let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation);
 
                 (left_kind != right_kind && !right.is_whitespace()) || left == '\n'
             });

crates/vim/src/normal/change.rs 🔗

@@ -1,4 +1,10 @@
-use crate::{motion::Motion, object::Object, state::Mode, utils::copy_selections_content, Vim};
+use crate::{
+    motion::Motion,
+    object::Object,
+    state::Mode,
+    utils::{coerce_punctuation, copy_selections_content},
+    Vim,
+};
 use editor::{
     display_map::DisplaySnapshot,
     movement::{self, FindRange, TextLayoutDetails},
@@ -102,9 +108,9 @@ fn expand_changed_word_selection(
         if in_word {
             selection.end =
                 movement::find_boundary(map, selection.end, FindRange::MultiLine, |left, right| {
-                    let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation);
+                    let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation);
                     let right_kind =
-                        char_kind(&scope, right).coerce_punctuation(ignore_punctuation);
+                        coerce_punctuation(char_kind(&scope, right), ignore_punctuation);
 
                     left_kind != right_kind && left_kind != CharKind::Whitespace
                 });

crates/vim/src/object.rs 🔗

@@ -10,7 +10,10 @@ use language::{char_kind, CharKind, Selection};
 use serde::Deserialize;
 use workspace::Workspace;
 
-use crate::{motion::right, normal::normal_object, state::Mode, visual::visual_object, Vim};
+use crate::{
+    motion::right, normal::normal_object, state::Mode, utils::coerce_punctuation,
+    visual::visual_object, Vim,
+};
 
 #[derive(Copy, Clone, Debug, PartialEq)]
 pub enum Object {
@@ -195,9 +198,10 @@ impl Object {
     }
 }
 
-/// Return a range that surrounds the word relative_to is in
-/// If relative_to is at the start of a word, return the word.
-/// If relative_to is between words, return the space between
+/// Returns a range that surrounds the word `relative_to` is in.
+///
+/// If `relative_to` is at the start of a word, return the word.
+/// If `relative_to` is between words, return the space between.
 fn in_word(
     map: &DisplaySnapshot,
     relative_to: DisplayPoint,
@@ -212,24 +216,25 @@ fn in_word(
         right(map, relative_to, 1),
         movement::FindRange::SingleLine,
         |left, right| {
-            char_kind(&scope, left).coerce_punctuation(ignore_punctuation)
-                != char_kind(&scope, right).coerce_punctuation(ignore_punctuation)
+            coerce_punctuation(char_kind(&scope, left), ignore_punctuation)
+                != coerce_punctuation(char_kind(&scope, right), ignore_punctuation)
         },
     );
 
     let end = movement::find_boundary(map, relative_to, FindRange::SingleLine, |left, right| {
-        char_kind(&scope, left).coerce_punctuation(ignore_punctuation)
-            != char_kind(&scope, right).coerce_punctuation(ignore_punctuation)
+        coerce_punctuation(char_kind(&scope, left), ignore_punctuation)
+            != coerce_punctuation(char_kind(&scope, right), ignore_punctuation)
     });
 
     Some(start..end)
 }
 
-/// Return a range that surrounds the word and following whitespace
+/// Returns a range that surrounds the word and following whitespace
 /// relative_to is in.
-/// If relative_to is at the start of a word, return the word and following whitespace.
-/// If relative_to is between words, return the whitespace back and the following word
-
+///
+/// If `relative_to` is at the start of a word, return the word and following whitespace.
+/// If `relative_to` is between words, return the whitespace back and the following word.
+///
 /// if in word
 ///   delete that word
 ///   if there is whitespace following the word, delete that as well
@@ -281,15 +286,15 @@ fn around_next_word(
         right(map, relative_to, 1),
         FindRange::SingleLine,
         |left, right| {
-            char_kind(&scope, left).coerce_punctuation(ignore_punctuation)
-                != char_kind(&scope, right).coerce_punctuation(ignore_punctuation)
+            coerce_punctuation(char_kind(&scope, left), ignore_punctuation)
+                != coerce_punctuation(char_kind(&scope, right), ignore_punctuation)
         },
     );
 
     let mut word_found = false;
     let end = movement::find_boundary(map, relative_to, FindRange::MultiLine, |left, right| {
-        let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation);
-        let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation);
+        let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation);
+        let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation);
 
         let found = (word_found && left_kind != right_kind) || right == '\n' && left == '\n';
 

crates/vim/src/utils.rs 🔗

@@ -1,6 +1,6 @@
 use editor::{ClipboardSelection, Editor};
 use gpui::{AppContext, ClipboardItem};
-use language::Point;
+use language::{CharKind, Point};
 
 pub fn copy_selections_content(editor: &mut Editor, linewise: bool, cx: &mut AppContext) {
     let selections = editor.selections.all_adjusted(cx);
@@ -48,3 +48,11 @@ pub fn copy_selections_content(editor: &mut Editor, linewise: bool, cx: &mut App
 
     cx.write_to_clipboard(ClipboardItem::new(text).with_metadata(clipboard_selections));
 }
+
+pub fn coerce_punctuation(kind: CharKind, treat_punctuation_as_word: bool) -> CharKind {
+    if treat_punctuation_as_word && kind == CharKind::Punctuation {
+        CharKind::Word
+    } else {
+        kind
+    }
+}

script/deploy-collab 🔗

@@ -19,5 +19,6 @@ export ZED_IMAGE_ID=${image_id}
 
 target_zed_kube_cluster
 envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f -
+kubectl -n "$environment" rollout status deployment/collab --watch
 
 echo "deployed collab v${version} to ${environment}"