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>
+