diff --git a/plugins/terminal/intellij.terminal.iml b/plugins/terminal/intellij.terminal.iml
index 1b92168b4abe..0419813133a2 100644
--- a/plugins/terminal/intellij.terminal.iml
+++ b/plugins/terminal/intellij.terminal.iml
@@ -19,5 +19,6 @@
+
\ No newline at end of file
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java
index befb825900cb..572384fde0b0 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java
@@ -17,11 +17,17 @@ package org.jetbrains.plugins.terminal;
import com.google.common.collect.Lists;
import com.intellij.execution.TaskExecutor;
+
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessWaitFor;
import com.intellij.internal.statistic.service.fus.collectors.FUSUsageContext;
+import com.intellij.execution.configurations.EncodingEnvironmentUtil;
+import com.intellij.execution.process.*;
+import com.intellij.openapi.application.Application;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
@@ -46,6 +52,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.nio.charset.Charset;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@@ -117,14 +124,29 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner getTerminalEnvironment() {
+
+
+ Map envs = new HashMap();
+
+ if (TerminalOptionsProvider.Companion.getInstance().passParentEnvs()) {
+ envs.putAll(System.getenv());
+ }
+
+ envs.put("TERM", "xterm-256color");
+ EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(envs, myDefaultCharset);
+
+ PathMacroManager macroManager = PathMacroManager.getInstance(myProject);
+ for (Map.Entry env : TerminalOptionsProvider.Companion.getInstance().getUserSpecifiedEnvs().entrySet()) {
+ envs.put(env.getKey(), macroManager.expandPath(env.getValue()));
+ }
+ return envs;
+ }
+
@Override
protected PtyProcess createProcess(@Nullable String directory) throws ExecutionException {
- Map envs = new THashMap<>(SystemInfo.isWindows ? CaseInsensitiveStringHashingStrategy.INSTANCE
- : ContainerUtil.canonicalStrategy());
- envs.putAll(System.getenv());
- if (!SystemInfo.isWindows) {
- envs.put("TERM", "xterm-256color");
- }
+ Map envs = getTerminalEnvironment();
if (SystemInfo.isMac) {
EnvironmentUtil.setLocaleEnv(envs, myDefaultCharset);
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt
index 7d8fba476ffa..25003f19e44d 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.kt
@@ -7,6 +7,7 @@ import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.openapi.util.SystemInfo
import java.io.File
+import java.util.HashMap
/**
* @author traff
@@ -80,6 +81,8 @@ class TerminalOptionsProvider : PersistentStateComponent = hashMapOf("PROJECT_DIR" to "\$PROJECT_DIR$")
+ var myPassParentEnvs = true
}
fun setCloseSessionOnLogout(closeSessionOnLogout: Boolean) {
@@ -118,6 +121,22 @@ class TerminalOptionsProvider : PersistentStateComponent {
+ return myState.myUserSpecifiedEnvs
+ }
+
+ fun setUserSpecifiedEnvs(userSpecifiedEnvs: Map) {
+ myState.myUserSpecifiedEnvs = userSpecifiedEnvs
+ }
+
+ fun setPassParentEnvs(passParentEnvs: Boolean) {
+ myState.myPassParentEnvs = passParentEnvs
+ }
+
+ fun passParentEnvs(): Boolean {
+ return myState.myPassParentEnvs
+ }
+
val defaultShellPath: String
get() {
val shell = System.getenv("SHELL")
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form
index 8d12d38cecff..529c5864fb3e 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form
@@ -14,9 +14,6 @@
-
-
-
@@ -24,7 +21,7 @@
-
+
@@ -47,6 +44,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java
index afd955d08943..353474d93721 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java
@@ -2,6 +2,7 @@
package org.jetbrains.plugins.terminal;
import com.google.common.collect.Lists;
+import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.UnnamedConfigurable;
@@ -32,12 +33,16 @@ public class TerminalSettingsPanel {
private JBCheckBox myPasteOnMiddleButtonCheckBox;
private JBCheckBox myCopyOnSelectionCheckBox;
private JBCheckBox myOverrideIdeShortcuts;
+
private JBCheckBox myShellIntegration;
private TextFieldWithBrowseButton myStartDirectoryField;
private JPanel myProjectSettingsPanel;
private JPanel myGlobalSettingsPanel;
private JPanel myConfigurablesPanel;
private JBCheckBox myHighlightHyperlinks;
+
+ private EnvironmentVariablesTextFieldWithBrowseButton myEnvVarField;
+
private TerminalOptionsProvider myOptionsProvider;
private TerminalProjectOptionsProvider myProjectOptionsProvider;
@@ -113,7 +118,9 @@ public class TerminalSettingsPanel {
|| (myOverrideIdeShortcuts.isSelected() != myOptionsProvider.overrideIdeShortcuts())
|| (myShellIntegration.isSelected() != myOptionsProvider.shellIntegration())
|| (myHighlightHyperlinks.isSelected() != myOptionsProvider.highlightHyperlinks()) ||
- myConfigurables.stream().anyMatch(c -> c.isModified());
+ myConfigurables.stream().anyMatch(c -> c.isModified())
+ || !Comparing.equal(myEnvVarField.getEnvs(), myOptionsProvider.getUserSpecifiedEnvs())
+ || (myEnvVarField.isPassParentEnvs() != myOptionsProvider.passParentEnvs());
}
public void apply() {
@@ -136,6 +143,8 @@ public class TerminalSettingsPanel {
//pass
}
});
+ myOptionsProvider.setUserSpecifiedEnvs(myEnvVarField.getEnvs());
+ myOptionsProvider.setPassParentEnvs(myEnvVarField.isPassParentEnvs());
}
public void reset() {
@@ -151,6 +160,8 @@ public class TerminalSettingsPanel {
myShellIntegration.setSelected(myOptionsProvider.shellIntegration());
myHighlightHyperlinks.setSelected(myOptionsProvider.highlightHyperlinks());
myConfigurables.forEach(c -> c.reset());
+ myEnvVarField.setEnvs(myOptionsProvider.getUserSpecifiedEnvs());
+ myEnvVarField.setPassParentEnvs(myOptionsProvider.passParentEnvs());
}
public Color getDefaultValueColor() {