Snapshot 5220ac5242aadc343c995ec9a49d09765db4a0c7 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I2494d92b34f89102885b2f39d7552747fafdafec
diff --git a/plugins/terminal/lib/JPty.jar b/plugins/terminal/lib/JPty.jar
new file mode 100644
index 0000000..1859fcf
--- /dev/null
+++ b/plugins/terminal/lib/JPty.jar
Binary files differ
diff --git a/plugins/terminal/lib/jediterm-pty-0.03.jar b/plugins/terminal/lib/jediterm-pty-0.03.jar
new file mode 100644
index 0000000..bd3fbb5
--- /dev/null
+++ b/plugins/terminal/lib/jediterm-pty-0.03.jar
Binary files differ
diff --git a/plugins/terminal/lib/jna.jar b/plugins/terminal/lib/jna.jar
new file mode 100644
index 0000000..4e05a4a
--- /dev/null
+++ b/plugins/terminal/lib/jna.jar
Binary files differ
diff --git a/plugins/terminal/lib/purejavacomm-0.0.16.jar b/plugins/terminal/lib/purejavacomm-0.0.16.jar
new file mode 100644
index 0000000..dc41f6e
--- /dev/null
+++ b/plugins/terminal/lib/purejavacomm-0.0.16.jar
Binary files differ
diff --git a/plugins/terminal/resources/META-INF/plugin.xml b/plugins/terminal/resources/META-INF/plugin.xml
new file mode 100644
index 0000000..0d6ad05
--- /dev/null
+++ b/plugins/terminal/resources/META-INF/plugin.xml
@@ -0,0 +1,13 @@
+<idea-plugin version="2" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <name>Terminal</name>
+ <id>org.jetbrains.plugins.terminal</id>
+ <version>0.1</version>
+ <vendor>JetBrains</vendor>
+ <description>Embedded Terminal</description>
+
+ <xi:include href="/META-INF/terminal.xml" xpointer="xpointer(/idea-plugin/*)"/>
+
+ <extensions defaultExtensionNs="com.intellij">
+ <errorHandler implementation="com.intellij.diagnostic.ITNReporter"/>
+ </extensions>
+</idea-plugin>
diff --git a/plugins/terminal/resources/META-INF/terminal.xml b/plugins/terminal/resources/META-INF/terminal.xml
new file mode 100644
index 0000000..9e9addb
--- /dev/null
+++ b/plugins/terminal/resources/META-INF/terminal.xml
@@ -0,0 +1,9 @@
+<idea-plugin version="2">
+ <actions>
+ <action id="org.jetbrains.plugins.terminal.RunLocalTerminalAction"
+ class="org.jetbrains.plugins.terminal.RunLocalTerminalAction"
+ text="Open Terminal..." description="Open terminal locally">
+ <add-to-group group-id="ToolsMenu" anchor="last"/>
+ </action>
+ </actions>
+</idea-plugin>
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java
new file mode 100644
index 0000000..4de14e4
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java
@@ -0,0 +1,130 @@
+package org.jetbrains.plugins.terminal;
+
+import com.intellij.execution.ExecutionManager;
+import com.intellij.execution.Executor;
+import com.intellij.execution.ExecutorRegistry;
+import com.intellij.execution.executors.DefaultRunExecutor;
+import com.intellij.execution.process.ProcessHandler;
+import com.intellij.execution.ui.RunContentDescriptor;
+import com.intellij.execution.ui.actions.CloseAction;
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.progress.Task;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.wm.IdeFocusManager;
+import com.intellij.openapi.wm.ToolWindow;
+import com.intellij.openapi.wm.ToolWindowManager;
+import com.intellij.util.ui.UIUtil;
+import com.jediterm.emulator.TtyConnector;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author traff
+ */
+public abstract class AbstractTerminalRunner<T extends Process> {
+ private static final Logger LOG = Logger.getInstance(AbstractTerminalRunner.class.getName());
+ @NotNull
+ protected final Project myProject;
+
+ public AbstractTerminalRunner(@NotNull Project project) {
+ myProject = project;
+ }
+
+ public void run() {
+ ProgressManager.getInstance().run(new Task.Backgroundable(myProject, "Connecting to terminal", false) {
+ public void run(@NotNull final ProgressIndicator indicator) {
+ indicator.setText("Connecting to terminal...");
+ try {
+ doRun();
+ }
+ catch (Exception e) {
+ LOG.warn("Error running terminal", e);
+ Messages.showErrorDialog(AbstractTerminalRunner.this.getProject(), getTitle(), e.getMessage());
+ }
+ }
+ });
+ }
+
+ private void doRun() {
+ // Create Server process
+ try {
+ final T process = createProcess();
+
+ UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ initConsoleUI(process);
+ }
+ });
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ protected abstract T createProcess() throws ExecutionException;
+
+ protected abstract ProcessHandler createProcessHandler(T process);
+
+ private void initConsoleUI(final T process) {
+ final Executor defaultExecutor = ExecutorRegistry.getInstance().getExecutorById(DefaultRunExecutor.EXECUTOR_ID);
+ final DefaultActionGroup toolbarActions = new DefaultActionGroup();
+ final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, toolbarActions, false);
+
+ final JBTerminal term = new JBTerminal();
+
+ term.setTtyConnector(createTtyConnector(process));
+
+ final JPanel panel = new JPanel(new BorderLayout());
+ panel.add(actionToolbar.getComponent(), BorderLayout.WEST);
+
+ panel.add(term, BorderLayout.CENTER);
+ term.start();
+
+ actionToolbar.setTargetComponent(panel);
+
+ ProcessHandler processHandler = createProcessHandler(process);
+
+ final RunContentDescriptor contentDescriptor =
+ new RunContentDescriptor(null, processHandler, panel, getTerminalConnectionName(process));
+
+ toolbarActions.add(createCloseAction(defaultExecutor, contentDescriptor));
+
+ showConsole(defaultExecutor, contentDescriptor, term.getTermPanel());
+
+ processHandler.startNotify();
+ }
+
+ protected abstract String getTerminalConnectionName(T process);
+
+ protected abstract TtyConnector createTtyConnector(T process);
+
+ protected AnAction createCloseAction(final Executor defaultExecutor, final RunContentDescriptor myDescriptor) {
+ return new CloseAction(defaultExecutor, myDescriptor, myProject);
+ }
+
+
+ protected void showConsole(Executor defaultExecutor, RunContentDescriptor myDescriptor, final Component toFocus) {
+ // Show in run toolwindow
+ ExecutionManager.getInstance(myProject).getContentManager().showRunContent(defaultExecutor, myDescriptor);
+
+// Request focus
+ final ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(defaultExecutor.getId());
+ window.activate(new Runnable() {
+ public void run() {
+ IdeFocusManager.getInstance(myProject).requestFocus(toFocus, true);
+ }
+ });
+ }
+
+ protected Project getProject() {
+ return myProject;
+ }
+}
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminal.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminal.java
new file mode 100644
index 0000000..982c06b
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminal.java
@@ -0,0 +1,269 @@
+package org.jetbrains.plugins.terminal;
+
+import com.intellij.application.options.OptionsConstants;
+import com.intellij.openapi.editor.colors.*;
+import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.options.FontSize;
+import com.intellij.openapi.util.InvalidDataException;
+import com.intellij.openapi.util.WriteExternalException;
+import com.intellij.ui.components.JBScrollBar;
+import com.intellij.util.containers.HashMap;
+import com.jediterm.emulator.display.BackBuffer;
+import com.jediterm.emulator.display.LinesBuffer;
+import com.jediterm.emulator.display.StyleState;
+import com.jediterm.emulator.ui.SwingJediTerminal;
+import com.jediterm.emulator.ui.SwingTerminalPanel;
+import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.EnumMap;
+import java.util.Map;
+
+public class JBTerminal extends SwingJediTerminal {
+ public JBTerminal() {
+ }
+
+ @Override
+ protected SwingTerminalPanel createTerminalPanel(StyleState styleState, BackBuffer backBuffer, LinesBuffer scrollBuffer) {
+ return new JBTerminalPanel(backBuffer, scrollBuffer, styleState, createBoundColorSchemeDelegate(null));
+ }
+
+ @Override
+ protected JScrollBar createScrollBar() {
+ return new JBScrollBar();
+ }
+
+ @NotNull
+ public EditorColorsScheme createBoundColorSchemeDelegate(@Nullable final EditorColorsScheme customGlobalScheme) {
+ return new MyColorSchemeDelegate(customGlobalScheme);
+ }
+
+ private static class MyColorSchemeDelegate implements EditorColorsScheme {
+
+ private final FontPreferences myFontPreferences = new FontPreferences();
+ private final HashMap<TextAttributesKey, TextAttributes> myOwnAttributes = new HashMap<TextAttributesKey, TextAttributes>();
+ private final HashMap<ColorKey, Color> myOwnColors = new HashMap<ColorKey, Color>();
+ private final EditorColorsScheme myCustomGlobalScheme;
+ private Map<EditorFontType, Font> myFontsMap = null;
+ private int myMaxFontSize = OptionsConstants.MAX_EDITOR_FONT_SIZE;
+ private int myFontSize = -1;
+ private String myFaceName = null;
+ private EditorColorsScheme myGlobalScheme;
+
+ private MyColorSchemeDelegate(@Nullable final EditorColorsScheme globalScheme) {
+ myCustomGlobalScheme = globalScheme;
+ updateGlobalScheme();
+ }
+
+ private EditorColorsScheme getGlobal() {
+ return myGlobalScheme;
+ }
+
+ @Override
+ public String getName() {
+ return getGlobal().getName();
+ }
+
+
+ protected void initFonts() {
+ String editorFontName = getEditorFontName();
+ int editorFontSize = getEditorFontSize();
+ myFontPreferences.clear();
+ myFontPreferences.register(editorFontName, editorFontSize);
+
+ myFontsMap = new EnumMap<EditorFontType, Font>(EditorFontType.class);
+
+ Font plainFont = new Font(editorFontName, Font.PLAIN, editorFontSize);
+ Font boldFont = new Font(editorFontName, Font.BOLD, editorFontSize);
+ Font italicFont = new Font(editorFontName, Font.ITALIC, editorFontSize);
+ Font boldItalicFont = new Font(editorFontName, Font.BOLD | Font.ITALIC, editorFontSize);
+
+ myFontsMap.put(EditorFontType.PLAIN, plainFont);
+ myFontsMap.put(EditorFontType.BOLD, boldFont);
+ myFontsMap.put(EditorFontType.ITALIC, italicFont);
+ myFontsMap.put(EditorFontType.BOLD_ITALIC, boldItalicFont);
+ }
+
+ @Override
+ public void setName(String name) {
+ getGlobal().setName(name);
+ }
+
+ @Override
+ public TextAttributes getAttributes(TextAttributesKey key) {
+ if (myOwnAttributes.containsKey(key)) return myOwnAttributes.get(key);
+ return getGlobal().getAttributes(key);
+ }
+
+ @Override
+ public void setAttributes(TextAttributesKey key, TextAttributes attributes) {
+ myOwnAttributes.put(key, attributes);
+ }
+
+ @NotNull
+ @Override
+ public Color getDefaultBackground() {
+ return getGlobal().getDefaultBackground();
+ }
+
+ @NotNull
+ @Override
+ public Color getDefaultForeground() {
+ return getGlobal().getDefaultForeground();
+ }
+
+ @Override
+ public Color getColor(ColorKey key) {
+ if (myOwnColors.containsKey(key)) return myOwnColors.get(key);
+ return getGlobal().getColor(key);
+ }
+
+ @Override
+ public void setColor(ColorKey key, Color color) {
+ myOwnColors.put(key, color);
+ }
+
+ @NotNull
+ @Override
+ public FontPreferences getFontPreferences() {
+ return myFontPreferences;
+ }
+
+ @Override
+ public void setFontPreferences(@NotNull FontPreferences preferences) {
+ preferences.copyTo(myFontPreferences);
+ initFonts();
+ }
+
+ @Override
+ public int getEditorFontSize() {
+ if (myFontSize == -1) {
+ return getGlobal().getEditorFontSize();
+ }
+ return myFontSize;
+ }
+
+ @Override
+ public void setEditorFontSize(int fontSize) {
+ if (fontSize < 8) fontSize = 8;
+ if (fontSize > myMaxFontSize) fontSize = myMaxFontSize;
+ myFontSize = fontSize;
+ initFonts();
+ }
+
+ @Override
+ public FontSize getQuickDocFontSize() {
+ return myGlobalScheme.getQuickDocFontSize();
+ }
+
+ @Override
+ public void setQuickDocFontSize(@NotNull FontSize fontSize) {
+ myGlobalScheme.setQuickDocFontSize(fontSize);
+ }
+
+ @Override
+ public String getEditorFontName() {
+ if (myFaceName == null) {
+ return getGlobal().getEditorFontName();
+ }
+ return myFaceName;
+ }
+
+ @Override
+ public void setEditorFontName(String fontName) {
+ myFaceName = fontName;
+ initFonts();
+ }
+
+ @Override
+ public Font getFont(EditorFontType key) {
+ if (myFontsMap != null) {
+ Font font = myFontsMap.get(key);
+ if (font != null) return font;
+ }
+ return getGlobal().getFont(key);
+ }
+
+ @Override
+ public void setFont(EditorFontType key, Font font) {
+ if (myFontsMap == null) {
+ initFonts();
+ }
+ myFontsMap.put(key, font);
+ }
+
+ @Override
+ public float getLineSpacing() {
+ return getGlobal().getLineSpacing();
+ }
+
+ @Override
+ public void setLineSpacing(float lineSpacing) {
+ getGlobal().setLineSpacing(lineSpacing);
+ }
+
+ @Override
+ @Nullable
+ public Object clone() {
+ return null;
+ }
+
+ @Override
+ public void readExternal(Element element) throws InvalidDataException {
+ }
+
+ @Override
+ public void writeExternal(Element element) throws WriteExternalException {
+ }
+
+ public void updateGlobalScheme() {
+ myGlobalScheme = myCustomGlobalScheme == null ? EditorColorsManager.getInstance().getGlobalScheme() : myCustomGlobalScheme;
+ int globalFontSize = getGlobal().getEditorFontSize();
+ myMaxFontSize = Math.max(OptionsConstants.MAX_EDITOR_FONT_SIZE, globalFontSize);
+ }
+
+ @NotNull
+ @Override
+ public FontPreferences getConsoleFontPreferences() {
+ return getGlobal().getConsoleFontPreferences();
+ }
+
+ @Override
+ public void setConsoleFontPreferences(@NotNull FontPreferences preferences) {
+ getGlobal().setConsoleFontPreferences(preferences);
+ }
+
+ @Override
+ public String getConsoleFontName() {
+ return getGlobal().getConsoleFontName();
+ }
+
+ @Override
+ public void setConsoleFontName(String fontName) {
+ getGlobal().setConsoleFontName(fontName);
+ }
+
+ @Override
+ public int getConsoleFontSize() {
+ return getGlobal().getConsoleFontSize();
+ }
+
+ @Override
+ public void setConsoleFontSize(int fontSize) {
+ getGlobal().setConsoleFontSize(fontSize);
+ }
+
+ @Override
+ public float getConsoleLineSpacing() {
+ return getGlobal().getConsoleLineSpacing();
+ }
+
+ @Override
+ public void setConsoleLineSpacing(float lineSpacing) {
+ getGlobal().setConsoleLineSpacing(lineSpacing);
+ }
+ }
+}
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java
new file mode 100644
index 0000000..0c8cfea
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java
@@ -0,0 +1,101 @@
+/* -*-mode:java; c-basic-offset:2; -*- */
+/* JCTerm
+ * Copyright (C) 2002-2004 ymnk, JCraft,Inc.
+ *
+ * Written by: 2002 ymnk<[email protected]>
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.jetbrains.plugins.terminal;
+
+import com.intellij.openapi.editor.colors.EditorColorsScheme;
+import com.intellij.openapi.ide.CopyPasteManager;
+import com.intellij.util.ui.GraphicsUtil;
+import com.intellij.util.ui.UIUtil;
+import com.jediterm.emulator.TextStyle;
+import com.jediterm.emulator.display.BackBuffer;
+import com.jediterm.emulator.display.LinesBuffer;
+import com.jediterm.emulator.display.StyleState;
+import com.jediterm.emulator.ui.SwingTerminalPanel;
+
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+public class JBTerminalPanel extends SwingTerminalPanel {
+ private final EditorColorsScheme myColorScheme;
+
+ public JBTerminalPanel(BackBuffer backBuffer, LinesBuffer scrollBuffer, StyleState styleState, EditorColorsScheme scheme) {
+ super(backBuffer, scrollBuffer, styleState);
+ myColorScheme = scheme;
+
+ styleState.setDefaultStyle(new TextStyle(myColorScheme.getDefaultForeground(), myColorScheme.getDefaultBackground()));
+ }
+
+ @Override
+ protected BufferedImage createBufferedImage(int width, int height) {
+ return UIUtil.createImage(width, height,
+ BufferedImage.TYPE_INT_RGB);
+ }
+
+ protected Font createFont() {
+ Font normalFont = Font.decode(myColorScheme.getConsoleFontName());
+ if (normalFont == null) {
+ return super.createFont();
+ }
+ return normalFont;
+ }
+
+ protected void setupAntialiasing(Graphics graphics, boolean antialiasing) {
+ GraphicsUtil.setupAntialiasing(graphics, antialiasing, false);
+ }
+
+ @Override
+ public Color getBackground() {
+ if (myColorScheme != null) {
+ return myColorScheme.getDefaultBackground();
+ }
+ return super.getBackground();
+ }
+
+ @Override
+ public Color getForeground() {
+ if (myColorScheme != null) {
+ return myColorScheme.getDefaultForeground();
+ }
+ return super.getBackground();
+ }
+
+ @Override
+ protected void setCopyContents(StringSelection selection) {
+ CopyPasteManager.getInstance().setContents(selection);
+ }
+
+
+ @Override
+ protected String getClipboardContent() throws IOException, UnsupportedFlavorException {
+ Transferable contents = CopyPasteManager.getInstance().getContents();
+ if (contents == null) {
+ return null;
+ }
+ return (String)contents.getTransferData(DataFlavor.stringFlavor);
+ }
+}
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java
new file mode 100644
index 0000000..05d120f
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java
@@ -0,0 +1,48 @@
+package org.jetbrains.plugins.terminal;
+
+import com.intellij.execution.process.OSProcessHandler;
+import com.intellij.execution.process.ProcessHandler;
+import com.intellij.openapi.project.Project;
+import com.jediterm.emulator.TtyConnector;
+import com.jediterm.pty.PtyProcess;
+import com.jediterm.pty.PtyProcessTtyConnector;
+
+import java.nio.charset.Charset;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author traff
+ */
+public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess> {
+
+ private final Charset myDefaultCharset;
+ private final String myCommand;
+ private final String[] myArguments;
+
+ public LocalTerminalDirectRunner(Project project, Charset charset, String command, String[] arguments) {
+ super(project);
+ myDefaultCharset = charset;
+ myCommand = command;
+ myArguments = arguments;
+ }
+
+ @Override
+ protected PtyProcess createProcess() throws ExecutionException {
+ return new PtyProcess(myCommand, myArguments);
+ }
+
+ @Override
+ protected ProcessHandler createProcessHandler(PtyProcess process) {
+ return new OSProcessHandler(process);
+ }
+
+ @Override
+ protected TtyConnector createTtyConnector(PtyProcess process) {
+ return new PtyProcessTtyConnector(process, myDefaultCharset);
+ }
+
+ @Override
+ protected String getTerminalConnectionName(PtyProcess process) {
+ return process.getCommandLineString();
+ }
+}
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/RunLocalTerminalAction.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/RunLocalTerminalAction.java
new file mode 100644
index 0000000..b288c2e
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/RunLocalTerminalAction.java
@@ -0,0 +1,37 @@
+package org.jetbrains.plugins.terminal;
+
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.Project;
+
+import java.nio.charset.Charset;
+
+/**
+ * @author traff
+ */
+public class RunLocalTerminalAction extends AnAction implements DumbAware {
+ public RunLocalTerminalAction() {
+ super();
+ }
+
+ @Override
+ public void update(final AnActionEvent e) {
+ e.getPresentation().setVisible(true);
+ e.getPresentation().setEnabled(true);
+ }
+
+ public void actionPerformed(final AnActionEvent e) {
+ runLocalTerminal(e);
+ }
+
+ public void runLocalTerminal(AnActionEvent event) {
+ final Project project = event.getData(PlatformDataKeys.PROJECT);
+ setupRemoteCredentialsAndRunTerminal(project);
+ }
+
+ public static void setupRemoteCredentialsAndRunTerminal(final Project project) {
+ new LocalTerminalDirectRunner(project, Charset.defaultCharset(), "/bin/bash", new String[]{"/bin/bash"}).run();
+ }
+}
diff --git a/plugins/terminal/terminal.iml b/plugins/terminal/terminal.iml
new file mode 100644
index 0000000..b1b2aa9
--- /dev/null
+++ b/plugins/terminal/terminal.iml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="lang-api" />
+ <orderEntry type="library" name="jna" level="project" />
+ <orderEntry type="library" name="jediterm-pty" level="project" />
+ <orderEntry type="library" name="jpty" level="project" />
+ <orderEntry type="library" name="purejavacomm" level="project" />
+ <orderEntry type="module" module-name="platform-impl" />
+ </component>
+</module>
+