From e3455055716325aa229fb6365c8a56c84c3da1e2 Mon Sep 17 00:00:00 2001 From: sblundy Date: Sat, 23 May 2015 15:35:12 -0700 Subject: [PATCH] Allowing users to specify environment variables in their embedded terminal sessions --- .../terminal/LocalTerminalDirectRunner.java | 22 +++++++++++++-- .../terminal/TerminalOptionsProvider.java | 28 +++++++++++++++++++ .../terminal/TerminalSettingsPanel.form | 21 +++++++++++--- .../terminal/TerminalSettingsPanel.java | 8 ++++++ plugins/terminal/terminal.iml | 5 ++-- 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java index 8521de83d42e..590ff1443649 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java @@ -20,6 +20,7 @@ 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.roots.ProjectRootManager; @@ -87,9 +88,7 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner envs = new HashMap(System.getenv()); - envs.put("TERM", "xterm-256color"); - EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(envs, myDefaultCharset); + Map envs = getTerminalEnvironment(); try { return PtyProcess.exec(getCommand(), envs, directory != null ? directory : currentProjectFolder()); } @@ -98,6 +97,23 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner getTerminalEnvironment() { + Map envs = new HashMap(); + + if (TerminalOptionsProvider.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.getInstance().getUserSpecifiedEnvs().entrySet()) { + envs.put(env.getKey(), macroManager.expandPath(env.getValue())); + } + return envs; + } + private String currentProjectFolder() { final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject); diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.java index 8bf9850c4cf6..77c14477d1d9 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsProvider.java @@ -22,6 +22,8 @@ import com.intellij.openapi.util.SystemInfo; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.HashMap; +import java.util.Map; /** * @author traff @@ -55,6 +57,8 @@ public class TerminalOptionsProvider implements PersistentStateComponent() : state.myUserSpecifiedEnvs; } public boolean closeSessionOnLogout() { @@ -90,6 +94,8 @@ public class TerminalOptionsProvider implements PersistentStateComponent myUserSpecifiedEnvs = getDefaultExtraEnvironmentVars(); + public boolean myPassParentEnvs = true; } public String getShellPath() { @@ -111,6 +117,12 @@ public class TerminalOptionsProvider implements PersistentStateComponent getDefaultExtraEnvironmentVars() { + Map defaultEnvs = new HashMap(); + defaultEnvs.put("PROJECT_DIR", "$PROJECT_DIR$"); + return defaultEnvs; + } + public void setShellPath(String shellPath) { myState.myShellPath = shellPath; } @@ -147,6 +159,22 @@ public class TerminalOptionsProvider implements PersistentStateComponent getUserSpecifiedEnvs() { + return myState.myUserSpecifiedEnvs; + } + + public void setUserSpecifiedEnvs(Map userSpecifiedEnvs) { + myState.myUserSpecifiedEnvs = userSpecifiedEnvs; + } + + public void setPassParentEnvs(boolean passParentEnvs) { + myState.myPassParentEnvs = passParentEnvs; + } + + public boolean passParentEnvs() { + return myState.myPassParentEnvs; + } + @Override public void initComponent() { } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form index f7a6ca92b311..4e998f174340 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.form @@ -14,12 +14,9 @@ - - - - + @@ -59,6 +56,22 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java index a1f20779f979..4275697e1579 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.terminal; +import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.ui.TextFieldWithBrowseButton; @@ -37,6 +38,7 @@ public class TerminalSettingsPanel { private JBCheckBox myPasteOnMiddleButtonCheckBox; private JBCheckBox myCopyOnSelectionCheckBox; private JBCheckBox myOverrideIdeShortcuts; + private EnvironmentVariablesTextFieldWithBrowseButton myEnvVarField; private TerminalOptionsProvider myOptionsProvider; public JComponent createPanel(@NotNull TerminalOptionsProvider provider) { @@ -65,6 +67,8 @@ public class TerminalSettingsPanel { || (myCopyOnSelectionCheckBox.isSelected() != myOptionsProvider.copyOnSelection()) || (myPasteOnMiddleButtonCheckBox.isSelected() != myOptionsProvider.pasteOnMiddleMouseButton()) || (myOverrideIdeShortcuts.isSelected() != myOptionsProvider.overrideIdeShortcuts()) + || !Comparing.equal(myEnvVarField.getEnvs(), myOptionsProvider.getUserSpecifiedEnvs()) + || (myEnvVarField.isPassParentEnvs() != myOptionsProvider.passParentEnvs()) ; } @@ -77,6 +81,8 @@ public class TerminalSettingsPanel { myOptionsProvider.setCopyOnSelection(myCopyOnSelectionCheckBox.isSelected()); myOptionsProvider.setPasteOnMiddleMouseButton(myPasteOnMiddleButtonCheckBox.isSelected()); myOptionsProvider.setOverrideIdeShortcuts(myOverrideIdeShortcuts.isSelected()); + myOptionsProvider.setUserSpecifiedEnvs(myEnvVarField.getEnvs()); + myOptionsProvider.setPassParentEnvs(myEnvVarField.isPassParentEnvs()); } public void reset() { @@ -88,5 +94,7 @@ public class TerminalSettingsPanel { myCopyOnSelectionCheckBox.setSelected(myOptionsProvider.copyOnSelection()); myPasteOnMiddleButtonCheckBox.setSelected(myOptionsProvider.pasteOnMiddleMouseButton()); myOverrideIdeShortcuts.setSelected(myOptionsProvider.overrideIdeShortcuts()); + myEnvVarField.setEnvs(myOptionsProvider.getUserSpecifiedEnvs()); + myEnvVarField.setPassParentEnvs(myOptionsProvider.passParentEnvs()); } } diff --git a/plugins/terminal/terminal.iml b/plugins/terminal/terminal.iml index 7b4c13d4c09f..fe7f2104c342 100644 --- a/plugins/terminal/terminal.iml +++ b/plugins/terminal/terminal.iml @@ -10,6 +10,8 @@ + + @@ -24,5 +26,4 @@ - - + \ No newline at end of file