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);
+  }
 }