浏览代码

Use enter for execution in the console

Steven Silvester 8 年之前
父节点
当前提交
f2259f9a26
共有 3 个文件被更改,包括 67 次插入31 次删除
  1. 17 1
      src/console/codemirror/widget.ts
  2. 49 29
      src/console/widget.ts
  3. 1 1
      src/shortcuts/plugin.ts

+ 17 - 1
src/console/codemirror/widget.ts

@@ -9,6 +9,10 @@ import {
   CodeCellWidget, RawCellWidget
 } from '../../notebook/cells/widget';
 
+import {
+  CodeMirrorCodeCellWidgetRenderer
+} from '../../notebook/codemirror/cells/widget';
+
 import {
   CodeMirrorNotebookRenderer
 } from '../../notebook/codemirror/notebook/widget';
@@ -44,7 +48,7 @@ class CodeMirrorConsoleRenderer implements ConsoleWidget.IRenderer {
   createPrompt(rendermime: RenderMime): CodeCellWidget {
     let widget = new CodeCellWidget({
       rendermime,
-      renderer: CodeMirrorNotebookRenderer.defaultCodeCellRenderer
+      renderer: CodeMirrorConsoleRenderer.defaultCodeCellRenderer
     });
     widget.model = new CodeCellModel();
     return widget;
@@ -62,4 +66,16 @@ namespace CodeMirrorConsoleRenderer {
    */
   export
   const defaultRenderer = new CodeMirrorConsoleRenderer();
+
+
+  /**
+   * A default code mirror renderer for a code cell editor.
+   */
+  export
+  const defaultCodeCellRenderer = new CodeMirrorCodeCellWidgetRenderer({
+    editorInitializer: (editor) => {
+      editor.editor.setOption('matchBrackets', false);
+      editor.editor.setOption('autoCloseBrackets', false);
+    }
+  });
 }

+ 49 - 29
src/console/widget.ts

@@ -215,35 +215,19 @@ class ConsoleWidget extends Widget {
 
     let prompt = this.prompt;
     prompt.trusted = true;
-    this._history.push(prompt.model.source);
-    // Create a new prompt before kernel execution to allow typeahead.
-    this.newPrompt();
-    return prompt.execute(this._session.kernel).then(
-      (value: KernelMessage.IExecuteReplyMsg) => {
-        this.executed.emit(new Date());
-        if (!value) {
-          this._inspectionHandler.handleExecuteReply(null);
-          return;
-        }
-        if (value.content.status === 'ok') {
-          let content = value.content as KernelMessage.IExecuteOkReply;
-          this._inspectionHandler.handleExecuteReply(content);
-          // Use deprecated payloads for backwards compatibility.
-          if (content.payload && content.payload.length) {
-            let setNextInput = content.payload.filter(i => {
-              return (i as any).source === 'set_next_input';
-            })[0];
-            if (setNextInput) {
-              let text = (setNextInput as any).text;
-              // Ignore the `replace` value and always set the next prompt.
-              this.prompt.model.source = text;
-            }
-          }
-        }
-        Private.scrollToBottom(this.node);
-      },
-      () => { Private.scrollToBottom(this.node); }
-    );
+    // Check for code completeness.
+    let code = prompt.model.source;
+    code = code.slice(0, code.lastIndexOf('\n'));
+    return this._session.kernel.isComplete({ code })
+    .then(isComplete => {
+      switch (isComplete.content.status) {
+      case 'complete':
+        return this._execute();
+      case 'incomplete':
+        prompt.model.source = code + '\n' + isComplete.content.indent;
+        prompt.editor.setCursorPosition(prompt.model.source.length);
+      }
+    });
   }
 
   /**
@@ -359,6 +343,42 @@ class ConsoleWidget extends Widget {
     prompt.activate();
   }
 
+  /**
+   * Execute the code in the current prompt.
+   */
+  private _execute(): Promise<void> {
+    let prompt = this.prompt;
+    this._history.push(prompt.model.source);
+    // Create a new prompt before kernel execution to allow typeahead.
+    this.newPrompt();
+    return prompt.execute(this._session.kernel).then(
+    (value: KernelMessage.IExecuteReplyMsg) => {
+      this.executed.emit(new Date());
+      if (!value) {
+        this._inspectionHandler.handleExecuteReply(null);
+        return;
+      }
+      if (value.content.status === 'ok') {
+        let content = value.content as KernelMessage.IExecuteOkReply;
+        this._inspectionHandler.handleExecuteReply(content);
+        // Use deprecated payloads for backwards compatibility.
+        if (content.payload && content.payload.length) {
+          let setNextInput = content.payload.filter(i => {
+            return (i as any).source === 'set_next_input';
+          })[0];
+          if (setNextInput) {
+            let text = (setNextInput as any).text;
+            // Ignore the `replace` value and always set the next prompt.
+            this.prompt.model.source = text;
+          }
+        }
+      }
+      Private.scrollToBottom(this.node);
+    },
+      () => { Private.scrollToBottom(this.node); }
+    );
+  }
+
   /**
    * Update the console based on the kernel info.
    */

+ 1 - 1
src/shortcuts/plugin.ts

@@ -253,7 +253,7 @@ const SHORTCUTS = [
   {
     command: 'console:execute',
     selector: '.jp-ConsolePanel',
-    keys: ['Shift Enter']
+    keys: ['Enter']
   },
   {
     command: 'console:dismiss-completion',