Setting to show/hide terminal title (#8559)

Andrew Lygin created

This PR adds settings for hiding title (breadcrumbs) from the terminal
toolbar. If the title is hidden, the toolbar disappears completely.

Example:

```json
"terminal": {
  "toolbar": {
    "title": true,
  }
}
```

[The PR that added the "toolbar"
setting](https://github.com/zed-industries/zed/pull/7338) didn't affect
toolbars of the terminals that are placed in the editor pane. This PR
fixes that.


Release Notes:

- Added support for configuring the terminal toolbar ([8125](https://github.com/zed-industries/zed/issues/8125))

Change summary

assets/settings/default.json              |  4 ++++
crates/terminal/src/terminal_settings.rs  | 17 +++++++++++++++++
crates/terminal_view/src/terminal_view.rs | 21 +++++++++++++++++++--
docs/src/configuring_zed.md               | 19 +++++++++++++++++++
4 files changed, 59 insertions(+), 2 deletions(-)

Detailed changes

assets/settings/default.json 🔗

@@ -472,6 +472,10 @@
         // Can also be 'csh', 'fish', and `nushell`
         "activate_script": "default"
       }
+    },
+    "toolbar": {
+      // Whether to display the terminal title in its toolbar.
+      "title": true
     }
     // Set the terminal's font size. If this option is not included,
     // the terminal will default to matching the buffer's font size.

crates/terminal/src/terminal_settings.rs 🔗

@@ -18,6 +18,11 @@ pub enum TerminalDockPosition {
     Right,
 }
 
+#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
+pub struct Toolbar {
+    pub title: bool,
+}
+
 #[derive(Deserialize)]
 pub struct TerminalSettings {
     pub shell: Shell,
@@ -36,6 +41,7 @@ pub struct TerminalSettings {
     pub default_height: Pixels,
     pub detect_venv: VenvSettings,
     pub max_scroll_history_lines: Option<usize>,
+    pub toolbar: Toolbar,
 }
 
 #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
@@ -155,6 +161,8 @@ pub struct TerminalSettingsContent {
     ///
     /// Default: 10_000
     pub max_scroll_history_lines: Option<usize>,
+    /// Toolbar related settings
+    pub toolbar: Option<ToolbarContent>,
 }
 
 impl settings::Settings for TerminalSettings {
@@ -274,3 +282,12 @@ pub enum WorkingDirectory {
     /// this platform's home directory  (if it can be found).
     Always { directory: String },
 }
+
+// Toolbar related settings
+#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
+pub struct ToolbarContent {
+    /// Whether to display the terminal title in its toolbar.
+    ///
+    /// Default: true
+    pub title: Option<bool>,
+}

crates/terminal_view/src/terminal_view.rs 🔗

@@ -13,6 +13,7 @@ use gpui::{
 use language::Bias;
 use persistence::TERMINAL_DB;
 use project::{search::SearchQuery, Fs, LocalWorktree, Metadata, Project};
+use settings::SettingsStore;
 use terminal::{
     alacritty_terminal::{
         index::Point,
@@ -90,6 +91,7 @@ pub struct TerminalView {
     blink_epoch: usize,
     can_navigate_to_selected_word: bool,
     workspace_id: WorkspaceId,
+    show_title: bool,
     _subscriptions: Vec<Subscription>,
     _terminal_subscriptions: Vec<Subscription>,
 }
@@ -165,7 +167,12 @@ impl TerminalView {
             blink_epoch: 0,
             can_navigate_to_selected_word: false,
             workspace_id,
-            _subscriptions: vec![focus_in, focus_out],
+            show_title: TerminalSettings::get_global(cx).toolbar.title,
+            _subscriptions: vec![
+                focus_in,
+                focus_out,
+                cx.observe_global::<SettingsStore>(Self::settings_changed),
+            ],
             _terminal_subscriptions: terminal_subscriptions,
         }
     }
@@ -208,6 +215,12 @@ impl TerminalView {
         self.context_menu = Some((context_menu, position, subscription));
     }
 
+    fn settings_changed(&mut self, cx: &mut ViewContext<Self>) {
+        let settings = TerminalSettings::get_global(cx);
+        self.show_title = settings.toolbar.title;
+        cx.notify();
+    }
+
     fn show_character_palette(&mut self, _: &ShowCharacterPalette, cx: &mut ViewContext<Self>) {
         if !self
             .terminal
@@ -832,7 +845,11 @@ impl Item for TerminalView {
     }
 
     fn breadcrumb_location(&self) -> ToolbarItemLocation {
-        ToolbarItemLocation::PrimaryLeft
+        if self.show_title {
+            ToolbarItemLocation::PrimaryLeft
+        } else {
+            ToolbarItemLocation::Hidden
+        }
     }
 
     fn breadcrumbs(&self, _: &theme::Theme, cx: &AppContext) -> Option<Vec<BreadcrumbText>> {

docs/src/configuring_zed.md 🔗

@@ -681,6 +681,9 @@ These values take in the same options as the root-level settings with the same n
   "font_size": null,
   "option_as_meta": false,
   "shell": {},
+  "toolbar": {
+    "title": true
+  },
   "working_directory": "current_project_directory"
 }
 ```
@@ -839,6 +842,22 @@ See Buffer Font Features
 }
 ```
 
+## Terminal Toolbar
+
+- Description: Whether or not to show various elements in the terminal toolbar. It only affects terminals placed in the editor pane.
+- Setting: `toolbar`
+- Default:
+
+```json
+"toolbar": {
+  "title": true,
+},
+```
+
+**Options**
+
+At the moment, only the `title` option is available, it controls displaying of the terminal title that can be changed via `PROMPT_COMMAND`. If the title is hidden, the terminal toolbar is not displayed.
+
 ### Working Directory
 
 - Description: What working directory to use when launching the terminal.