Allowing users to specify environment variables in their embedded terminal sessions

This commit is contained in:
sblundy
2015-05-23 15:35:12 -07:00
parent 47ea2ff73e
commit e345505571
5 changed files with 75 additions and 9 deletions
@@ -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<PtyProcess
@Override
protected PtyProcess createProcess(@Nullable String directory) throws ExecutionException {
Map<String, String> envs = new HashMap<String, String>(System.getenv());
envs.put("TERM", "xterm-256color");
EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(envs, myDefaultCharset);
Map<String, String> envs = getTerminalEnvironment();
try {
return PtyProcess.exec(getCommand(), envs, directory != null ? directory : currentProjectFolder());
}
@@ -98,6 +97,23 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess
}
}
private Map<String, String> getTerminalEnvironment() {
Map<String, String> envs = new HashMap<String, String>();
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<String, String> env : TerminalOptionsProvider.getInstance().getUserSpecifiedEnvs().entrySet()) {
envs.put(env.getKey(), macroManager.expandPath(env.getValue()));
}
return envs;
}
private String currentProjectFolder() {
final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject);
@@ -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<Termina
myState.myCopyOnSelection = state.myCopyOnSelection;
myState.myPasteOnMiddleMouseButton = state.myPasteOnMiddleMouseButton;
myState.myOverrideIdeShortcuts = state.myOverrideIdeShortcuts;
myState.myPassParentEnvs = state.myPassParentEnvs;
myState.myUserSpecifiedEnvs = state.myUserSpecifiedEnvs == null ? new HashMap<String, String>() : state.myUserSpecifiedEnvs;
}
public boolean closeSessionOnLogout() {
@@ -90,6 +94,8 @@ public class TerminalOptionsProvider implements PersistentStateComponent<Termina
public boolean myCopyOnSelection = true;
public boolean myPasteOnMiddleMouseButton = true;
public boolean myOverrideIdeShortcuts = true;
public Map<String, String> myUserSpecifiedEnvs = getDefaultExtraEnvironmentVars();
public boolean myPassParentEnvs = true;
}
public String getShellPath() {
@@ -111,6 +117,12 @@ public class TerminalOptionsProvider implements PersistentStateComponent<Termina
}
}
private static Map<String, String> getDefaultExtraEnvironmentVars() {
Map<String, String> defaultEnvs = new HashMap<String, String>();
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<Termina
myState.myPasteOnMiddleMouseButton = pasteOnMiddleMouseButton;
}
public Map<String, String> getUserSpecifiedEnvs() {
return myState.myUserSpecifiedEnvs;
}
public void setUserSpecifiedEnvs(Map<String, String> userSpecifiedEnvs) {
myState.myUserSpecifiedEnvs = userSpecifiedEnvs;
}
public void setPassParentEnvs(boolean passParentEnvs) {
myState.myPassParentEnvs = passParentEnvs;
}
public boolean passParentEnvs() {
return myState.myPassParentEnvs;
}
@Override
public void initComponent() {
}
@@ -14,12 +14,9 @@
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value=""/>
</clientProperties>
<border type="none"/>
<children>
<grid id="57ec0" layout-manager="GridLayoutManager" row-count="2" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="57ec0" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="3" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -59,6 +56,22 @@
</constraints>
<properties/>
</component>
<component id="a7470" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Environment Variables"/>
</properties>
</component>
<component id="9454c" class="com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton" binding="myEnvVarField">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
</children>
</grid>
<vspacer id="d777c">
@@ -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());
}
}
+3 -2
View File
@@ -10,6 +10,8 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="lang-api" />
<orderEntry type="module" module-name="platform-impl" />
<orderEntry type="module" module-name="projectModel-impl" />
<orderEntry type="module" module-name="lang-impl" />
<orderEntry type="module-library">
<library name="jediterm-pty">
<CLASSES>
@@ -24,5 +26,4 @@
<orderEntry type="library" name="jna" level="project" />
<orderEntry type="library" name="purejavacomm" level="project" />
</component>
</module>
</module>