mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Allowing users to specify environment variables in their embedded terminal sessions
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user