repl: Make the terminal background transparent (#15022)

Kyle Kelley , Nathan Sobo , and Antonio Scandurra created

Keeps the background the same as the output area background by making
the terminal background be `Hsla::transparent_black()`.

Release Notes:

- N/A

---------

Co-authored-by: Nathan Sobo <nathan@zed.dev>
Co-authored-by: Antonio Scandurra <me@as-cii.com>

Change summary

crates/repl/src/stdio.rs |  42 +++++-----------
docs/src/repl.md         | 109 ++++++++++++++++-------------------------
2 files changed, 57 insertions(+), 94 deletions(-)

Detailed changes

crates/repl/src/stdio.rs 🔗

@@ -61,11 +61,13 @@ impl TerminalOutput {
             .iter()
             .chain(Some(&self.handler.current_text_run))
             .map(|ansi_run| {
-                let color = terminal_view::terminal_element::convert_color(&ansi_run.fg, theme);
-                let background_color = Some(terminal_view::terminal_element::convert_color(
-                    &ansi_run.bg,
+                let color = terminal_view::terminal_element::convert_color(
+                    &ansi_run.fg.unwrap_or(Color::Named(NamedColor::Foreground)),
                     theme,
-                ));
+                );
+                let background_color = ansi_run
+                    .bg
+                    .map(|bg| terminal_view::terminal_element::convert_color(&bg, theme));
 
                 TextRun {
                     len: ansi_run.len,
@@ -99,21 +101,11 @@ impl LineHeight for TerminalOutput {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Default)]
 struct AnsiTextRun {
     len: usize,
-    fg: alacritty_terminal::vte::ansi::Color,
-    bg: alacritty_terminal::vte::ansi::Color,
-}
-
-impl AnsiTextRun {
-    fn default() -> Self {
-        Self {
-            len: 0,
-            fg: Color::Named(NamedColor::Foreground),
-            bg: Color::Named(NamedColor::Background),
-        }
-    }
+    fg: Option<alacritty_terminal::vte::ansi::Color>,
+    bg: Option<alacritty_terminal::vte::ansi::Color>,
 }
 
 struct TerminalHandler {
@@ -126,11 +118,7 @@ impl TerminalHandler {
     fn new() -> Self {
         Self {
             text_runs: Vec::new(),
-            current_text_run: AnsiTextRun {
-                len: 0,
-                fg: Color::Named(NamedColor::Foreground),
-                bg: Color::Named(NamedColor::Background),
-            },
+            current_text_run: AnsiTextRun::default(),
             buffer: String::new(),
         }
     }
@@ -159,15 +147,11 @@ impl TerminalHandler {
             self.text_runs.push(self.current_text_run.clone());
         }
 
-        let mut text_run = AnsiTextRun {
-            len: 0,
-            fg: self.current_text_run.fg,
-            bg: self.current_text_run.bg,
-        };
+        let mut text_run = AnsiTextRun::default();
 
         match attr {
-            Attr::Foreground(color) => text_run.fg = color,
-            Attr::Background(color) => text_run.bg = color,
+            Attr::Foreground(color) => text_run.fg = Some(color),
+            Attr::Background(color) => text_run.bg = Some(color),
             _ => {}
         }
 

docs/src/repl.md 🔗

@@ -1,29 +1,11 @@
 # REPL
 
-Read. Eval. Print. Loop.
-
-<div class="warning">
-
-This feature is in active development. Details may change. We're delighted to get feedback as the REPL feature evolves.
-
-</div>
-
 ## Getting started
 
-Bring the power of [Jupyter kernels](https://docs.jupyter.org/en/latest/projects/kernels.html) to your editor! The built-in REPL for Zed allows you to run code interactively in your editor similarly to a notebook with your own text files.
+Bring the power of [Jupyter kernels](https://docs.jupyter.org/en/latest/projects/kernels.html) to your editor! The built--in REPL for Zed allows you to run code interactively in your editor similarly to a notebook with your own text files.
 
 <!-- TODO: Include GIF in action -->
 
-To start using the REPL, add the following to your Zed `settings.json`:
-
-```json
-{
-  "jupyter": {
-    "enabled": true
-  }
-}
-```
-
 ## Installation
 
 Zed supports running code in multiple languages. To get started, you need to install a kernel for the language you want to use.
@@ -33,7 +15,6 @@ Zed supports running code in multiple languages. To get started, you need to ins
 * [Python (ipykernel)](#python)
 * [TypeScript (Deno)](#typescript-deno)
 
-
 Once installed, you can start using the REPL in the respective language files, or other places those languages are supported, such as Markdown.
 
 <!-- TODO: Make markdown a link with an example -->
@@ -46,48 +27,6 @@ The `repl: run` command will be executed on your selection(s), and the result wi
 
 Outputs can be cleared with the `repl: clear outputs` command, or from the REPL menu in the toolbar.
 
-## Changing which kernel is used per language {#changing-kernels}
-
-Assign kernels by name to languages in your `settings.json`.
-
-```jsonc
-{
-  "jupyter": {
-    "kernel_selections": {
-      "python": "conda-env",
-      "typescript": "deno-debug"
-    }
-  }
-}
-```
-
-If you have `jupyter` installed, you can run `jupyter kernelspec list` to see the available kernels.
-
-```
-$ jupyter kernelspec list
-Available kernels:
-  ark                   /Users/z/Library/Jupyter/kernels/ark
-  conda-base            /Users/z/Library/Jupyter/kernels/conda-base
-  deno                  /Users/z/Library/Jupyter/kernels/deno
-  deno-debug            /Users/z/Library/Jupyter/kernels/deno-debug
-  deno-release          /Users/z/Library/Jupyter/kernels/deno-release
-  python-chatlab-dev    /Users/z/Library/Jupyter/kernels/python-chatlab-dev
-  python3               /Users/z/Library/Jupyter/kernels/python3
-  ruby                  /Users/z/Library/Jupyter/kernels/ruby
-  rust                  /Users/z/Library/Jupyter/kernels/rust
-```
-
-Note: Zed will not find kernels nested within your Python `sys.prefix`, shown here as `/Users/z/.pyenv/versions/miniconda3-latest/`.
-
-```
-$ jupyter kernelspec list
-Available kernels:
-  conda-base            /Users/z/Library/Jupyter/kernels/conda-base
-  python3               /Users/z/.pyenv/versions/miniconda3-latest/share/jupyter/kernels/python3
-```
-
-You must run `python -m ipykernel install --user` to install the kernel.
-
 ## Language specific instructions
 
 ### Python {#python}
@@ -100,7 +39,6 @@ On MacOS, your system Python will _not_ work. Either set up [pyenv](https://gith
 
 </div>
 
-
 To setup your current python to have an available kernel, run:
 
 ```
@@ -116,7 +54,6 @@ conda install ipykernel
 python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
 ```
 
-
 #### Virtualenv with pip
 
 ```
@@ -130,7 +67,7 @@ python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
 [Install Deno](https://docs.deno.com/runtime/manual/getting_started/installation/) and then install the Deno jupyter kernel:
 
 ```
-deno jupyter --unstable --install
+deno jupyter --install
 ```
 
 ### Other languages
@@ -142,3 +79,45 @@ The following languages and kernels are also supported. You can help us out by e
   - [Ark Kernel](https://github.com/posit-dev/ark) - via Positron, formerly RStudio
   - [Xeus-R](https://github.com/jupyter-xeus/xeus-r)
 * [Scala (almond)](https://almond.sh/docs/quick-start-install)
+
+## Changing which kernel is used per language {#changing-kernels}
+
+Zed automatically detects the available kernels on your system. If you need to configure a different default kernel for a
+language, you can assign a kernel for any supported language in your `settings.json`.
+
+```jsonc
+{
+  "jupyter": {
+    "kernel_selections": {
+      "python": "conda-env",
+      "typescript": "deno",
+      "javascript": "deno"
+    }
+  }
+}
+```
+
+If you have `jupyter` installed, you can run `jupyter kernelspec list` to see the available kernels.
+
+```
+$ jupyter kernelspec list
+Available kernels:
+  ark                   /Users/z/Library/Jupyter/kernels/ark
+  conda-base            /Users/z/Library/Jupyter/kernels/conda-base
+  deno                  /Users/z/Library/Jupyter/kernels/deno
+  python-chatlab-dev    /Users/z/Library/Jupyter/kernels/python-chatlab-dev
+  python3               /Users/z/Library/Jupyter/kernels/python3
+  ruby                  /Users/z/Library/Jupyter/kernels/ruby
+  rust                  /Users/z/Library/Jupyter/kernels/rust
+```
+
+Note: Zed will not find kernels nested within your Python `sys.prefix`, shown here as `/Users/z/.pyenv/versions/miniconda3-latest/`.
+
+```
+$ jupyter kernelspec list
+Available kernels:
+  conda-base            /Users/z/Library/Jupyter/kernels/conda-base
+  python3               /Users/z/.pyenv/versions/miniconda3-latest/share/jupyter/kernels/python3
+```
+
+You must run `python -m ipykernel install --user` to install the kernel.