Working on tracking last issued command.
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
index 9a083d6..2b6f59c 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/LocalTerminalConnector.java
@@ -19,6 +19,7 @@
import java.io.*;
import org.eclipse.core.runtime.*;
+import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.internal.core.StreamsProxy;
import org.eclipse.osgi.util.NLS;
@@ -81,8 +82,7 @@
pseudoTerminal.launch();
streamsProxy = new StreamsProxy(pseudoTerminal.systemProcess(), ENCODING);
terminalToRemoteStream = new BufferedOutputStream(new TerminalOutputStream(streamsProxy, ENCODING), 1024);
- setUpOutput(control, streamsProxy.getOutputStreamMonitor());
- setUpOutput(control, streamsProxy.getErrorStreamMonitor());
+ addListeners(control, streamsProxy.getOutputStreamMonitor(), streamsProxy.getErrorStreamMonitor());
if (streamsProxy != null) {
control.setState(CONNECTED);
return;
@@ -102,10 +102,22 @@
return (file.isDirectory()) ? file : null;
}
- private void setUpOutput(ITerminalControl control, IStreamMonitor outputMonitor) throws UnsupportedEncodingException {
- TerminalOutputListener outputListener = new TerminalOutputListener(control);
- outputMonitor.addListener(outputListener);
- outputListener.streamAppended(outputMonitor.getContents(), outputMonitor);
+ private void addListeners(ITerminalControl control, IStreamMonitor...monitors) throws UnsupportedEncodingException {
+ for (IStreamMonitor monitor : monitors) {
+ addListener(monitor, new TerminalOutputListener(control));
+ }
+ }
+
+ public void addListenerToOutput(IStreamListener listener) {
+ if (streamsProxy != null) {
+ IStreamMonitor monitor = streamsProxy.getOutputStreamMonitor();
+ addListener(monitor, listener);
+ }
+ }
+
+ private void addListener(IStreamMonitor monitor, IStreamListener listener) {
+ monitor.addListener(listener);
+ listener.streamAppended(monitor.getContents(), monitor);
}
/** {@inheritDoc} */
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
index ab9b012..aa8a70c 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/core/connector/TerminalOutputListener.java
@@ -8,6 +8,8 @@
*/
package com.google.eclipse.terminal.local.core.connector;
+import static com.google.eclipse.terminal.local.core.connector.LocalTerminalConnector.ENCODING;
+
import java.io.*;
import org.eclipse.debug.core.IStreamListener;
@@ -21,7 +23,7 @@
private final PrintStream printStream;
TerminalOutputListener(ITerminalControl control) throws UnsupportedEncodingException {
- printStream = new PrintStream(control.getRemoteToTerminalOutputStream(), true, LocalTerminalConnector.ENCODING);
+ printStream = new PrintStream(control.getRemoteToTerminalOutputStream(), true, ENCODING);
}
@Override public void streamAppended(String text, IStreamMonitor monitor) {
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
index 784acca..609c177 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
@@ -11,7 +11,13 @@
import static com.google.eclipse.terminal.local.core.connector.LocalTerminalConnector.createLocalTerminalConnector;
import static org.eclipse.tm.internal.terminal.provisional.api.TerminalState.CONNECTING;
+import java.util.*;
+import java.util.List;
+import java.util.regex.Pattern;
+
import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.jface.action.*;
import org.eclipse.jface.layout.*;
import org.eclipse.swt.events.*;
@@ -28,10 +34,13 @@
* @author alruiz@google.com (Alex Ruiz)
*/
class TerminalWidget extends Composite {
+ private static Pattern WHITE_SPACE_PATTERN = Pattern.compile("[\\s]+");
+
private final TerminalListener terminalListener = new TerminalListener();
private final VT100TerminalControl terminalControl;
private final EditActions editActions;
+ private final LastCommandTracker lastCommandTracker;
private LifeCycleListener lifeCycleListener;
@@ -62,11 +71,14 @@
editActions.onMenuHidden();
}
});
- terminalTextControl().addFocusListener(new FocusAdapter() {
+ Control terminalTextControl = terminalTextControl();
+ terminalTextControl.addFocusListener(new FocusAdapter() {
@Override public void focusGained(FocusEvent e) {
editActions.update();
}
});
+ lastCommandTracker = new LastCommandTracker();
+ terminalTextControl.addKeyListener(lastCommandTracker);
}
private Menu createContextMenu(MenuManager menuManager) {
@@ -89,6 +101,7 @@
return;
}
terminalControl.connectTerminal();
+ localTerminalConnector().addListenerToOutput(lastCommandTracker);
attachLifeCycleListener();
}
@@ -125,7 +138,8 @@
}
private LocalTerminalConnector localTerminalConnector() {
- return (LocalTerminalConnector) terminalControl.getTerminalConnector().getAdapter(LocalTerminalConnector.class);
+ Object connector = terminalControl.getTerminalConnector().getAdapter(LocalTerminalConnector.class);
+ return (LocalTerminalConnector) connector;
}
void setColors(RGB background, RGB foreground) {
@@ -144,7 +158,7 @@
return terminalControl.setFocus();
}
- public boolean isScrollLockEnabled() {
+ boolean isScrollLockEnabled() {
return terminalControl.isScrollLock();
}
@@ -152,6 +166,41 @@
terminalControl.setScrollLock(enabled);
}
+ private class LastCommandTracker extends KeyAdapter implements IStreamListener {
+ private static final String CRLF = "\r\n";
+
+ private final List<String> words = new ArrayList<String>();
+
+ @Override public void streamAppended(String text, IStreamMonitor monitor) {
+ int charCount = text.length();
+ if (charCount == 0) {
+ return;
+ }
+ String word = text;
+ int index = text.lastIndexOf(CRLF);
+ if (index != -1) {
+ words.clear();
+ word = text.substring(index + CRLF.length(), charCount);
+ }
+ if (!word.isEmpty()) {
+ words.add(word);
+ }
+ }
+
+ @Override public void keyPressed(KeyEvent e) {
+ if (e.character == '\r') {
+ int line = terminalControl.getCursorLine();
+ String text = new String(terminalControl.getChars(line));
+ if (words.size() > 1) {
+ String prompt = words.get(0);
+ text = text.substring(prompt.length());
+ String command = WHITE_SPACE_PATTERN.split(text)[0];
+ System.out.println("command: " + command);
+ }
+ }
+ }
+ }
+
private static class TerminalListener implements ITerminalListener {
ITerminalListener delegate;
diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
index a69e07a..f392d5b 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
@@ -1050,4 +1050,12 @@
public void setColors(RGB background, RGB foreground) {
fCtlText.setColors(background, foreground);
}
+
+ public int getCursorLine() {
+ return fCtlText.getCursorLine();
+ }
+
+ public char[] getChars(int line) {
+ return fCtlText.getChars(line);
+ }
}
diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
index 181604c..560f374 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
@@ -429,5 +429,13 @@
fCellRenderer.setFont(font);
redraw();
}
+
+ public int getCursorLine() {
+ return fCellCanvasModel.getCursorLine();
+ }
+
+ public char[] getChars(int line) {
+ return fCellCanvasModel.getTerminalText().getChars(line);
+ }
}