terminal: Set `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` environment variables in integrated terminal (#14213)

Donough Liu created

![image](https://github.com/zed-industries/zed/assets/31354274/9d1c5410-897b-40a1-8256-2d7e207f69ff)

These two environment variables are essential when people need to detect
terminal type and do something. Many popular terminals set them.

fixes https://github.com/zed-industries/zed/issues/4571

Release Notes:

- Set `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` environment variables in
the integrated terminal
([#4571](https://github.com/zed-industries/zed/issues/4571)).

Change summary

Cargo.lock                      | 1 +
crates/project/src/terminals.rs | 1 +
crates/terminal/Cargo.toml      | 3 ++-
crates/terminal/src/terminal.rs | 6 ++++++
4 files changed, 10 insertions(+), 1 deletion(-)

Detailed changes

Cargo.lock 🔗

@@ -10737,6 +10737,7 @@ dependencies = [
  "gpui",
  "libc",
  "rand 0.8.5",
+ "release_channel",
  "schemars",
  "serde",
  "serde_derive",

crates/project/src/terminals.rs 🔗

@@ -180,6 +180,7 @@ impl Project {
             settings.max_scroll_history_lines,
             window,
             completion_tx,
+            cx,
         )
         .map(|builder| {
             let terminal_handle = cx.new_model(|cx| builder.subscribe(cx));

crates/terminal/Cargo.toml 🔗

@@ -21,7 +21,7 @@ dirs.workspace = true
 futures.workspace = true
 gpui.workspace = true
 libc.workspace = true
-task.workspace = true
+release_channel.workspace = true
 schemars.workspace = true
 serde.workspace = true
 serde_derive.workspace = true
@@ -29,6 +29,7 @@ serde_json.workspace = true
 settings.workspace = true
 sysinfo.workspace = true
 smol.workspace = true
+task.workspace = true
 theme.workspace = true
 thiserror.workspace = true
 util.workspace = true

crates/terminal/src/terminal.rs 🔗

@@ -319,12 +319,18 @@ impl TerminalBuilder {
         max_scroll_history_lines: Option<usize>,
         window: AnyWindowHandle,
         completion_tx: Sender<()>,
+        cx: &mut AppContext,
     ) -> Result<TerminalBuilder> {
         // TODO: Properly set the current locale,
         env.entry("LC_ALL".to_string())
             .or_insert_with(|| "en_US.UTF-8".to_string());
 
         env.insert("ZED_TERM".to_string(), "true".to_string());
+        env.insert("TERM_PROGRAM".to_string(), "zed".to_string());
+        env.insert(
+            "TERM_PROGRAM_VERSION".to_string(),
+            release_channel::AppVersion::global(cx).to_string(),
+        );
 
         let pty_options = {
             let alac_shell = match shell.clone() {