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() {