-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add "Execute cell in console" feature
- Loading branch information
Showing
2 changed files
with
126 additions
and
1 deletion.
There are no files selected for viewing
111 changes: 111 additions & 0 deletions
111
src/main/java/com/jetbrains/python/actions/PyCellExecuteAction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
package com.jetbrains.python.actions; | ||
|
||
import com.intellij.openapi.actionSystem.AnAction; | ||
import com.intellij.openapi.actionSystem.AnActionEvent; | ||
import com.intellij.openapi.actionSystem.CommonDataKeys; | ||
import com.intellij.openapi.editor.Document; | ||
import com.intellij.openapi.editor.Editor; | ||
import com.intellij.openapi.editor.LogicalPosition; | ||
import com.intellij.openapi.editor.ScrollType; | ||
import com.intellij.openapi.editor.SelectionModel; | ||
import com.intellij.openapi.editor.VisualPosition; | ||
import com.intellij.psi.PsiDirectory; | ||
import com.intellij.psi.PsiDocumentManager; | ||
import com.intellij.psi.PsiElement; | ||
import com.intellij.psi.PsiFile; | ||
import com.intellij.psi.PsiWhiteSpace; | ||
import com.intellij.psi.util.PsiTreeUtil; | ||
import com.intellij.util.DocumentUtil; | ||
import com.jetbrains.python.PyTokenTypes; | ||
import com.jetbrains.python.psi.PyElementType; | ||
import com.jetbrains.python.psi.PyElsePart; | ||
import com.jetbrains.python.psi.PyExceptPart; | ||
import com.jetbrains.python.psi.PyFile; | ||
import com.jetbrains.python.psi.PyFinallyPart; | ||
import com.jetbrains.python.psi.PyIfPart; | ||
import com.jetbrains.python.psi.PyStatementList; | ||
import com.jetbrains.python.psi.PyStatementPart; | ||
import com.jetbrains.python.psi.PyWhilePart; | ||
import com.jetbrains.python.psi.impl.PyIfPartElifImpl; | ||
import org.jetbrains.annotations.NotNull; | ||
import org.jetbrains.annotations.Nullable; | ||
|
||
public class PyCellExecuteAction extends AnAction { | ||
|
||
private static void cellExecute(final AnActionEvent e, final Editor editor) { | ||
final Document document = editor.getDocument(); | ||
final PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(e.getProject()); | ||
psiDocumentManager.commitDocument(document); | ||
final PsiFile psiFile = psiDocumentManager.getPsiFile(document); | ||
|
||
final LogicalPosition logicalPos = editor.getCaretModel().getLogicalPosition(); | ||
final int line = logicalPos.line; | ||
|
||
int start = 6666, end = 6666; | ||
for (int i = 0; i > -666; --i) { | ||
final int cline = line + i; | ||
int offset = 666; | ||
boolean outOfDoc = false; | ||
try { | ||
offset = DocumentUtil.getFirstNonSpaceCharOffset(document, cline); | ||
start = offset; | ||
} catch (IndexOutOfBoundsException ex) { | ||
outOfDoc = true; | ||
} | ||
PsiElement psiElement = null; | ||
if (!outOfDoc) { | ||
psiElement = psiFile.findElementAt(offset); | ||
if (outOfDoc || !(psiElement.getNode().getElementType() instanceof PyElementType)) { | ||
break; | ||
} | ||
} | ||
// System.out.println("i = " + i); | ||
// System.out.println("cline = " + cline); | ||
// System.out.println("psiElement = " + psiElement); | ||
} | ||
// System.out.println("forward"); | ||
for (int i = 0; i < 666; ++i) { | ||
final int cline = line + i; | ||
int offset = 666; | ||
boolean outOfDoc = false; | ||
try { | ||
offset = DocumentUtil.getFirstNonSpaceCharOffset(document, cline); | ||
end = offset; | ||
} catch (IndexOutOfBoundsException ex) { | ||
outOfDoc = true; | ||
} | ||
PsiElement psiElement = null; | ||
if (!outOfDoc) { | ||
psiElement = psiFile.findElementAt(offset); | ||
if (outOfDoc || !(psiElement.getNode().getElementType() instanceof PyElementType)) { | ||
break; | ||
} | ||
} | ||
// System.out.println("i = " + i); | ||
// System.out.println("cline = " + cline); | ||
// System.out.println("psiElement = " + psiElement); | ||
} | ||
{ | ||
start = DocumentUtil.getLineEndOffset(start, document); | ||
end = DocumentUtil.getLineEndOffset(end, document); | ||
String codeToSend = editor.getDocument().getCharsSequence().subSequence(start, end).toString(); | ||
// System.out.println("codeToSend = " + codeToSend); | ||
PyExecuteInConsole.executeCodeInConsole(e.getProject(), codeToSend, null, true, true, false, | ||
null); | ||
} | ||
} | ||
|
||
@Override | ||
public void actionPerformed(@NotNull AnActionEvent e) { | ||
Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); | ||
if (editor != null) { | ||
final String selectionText = PySmartExecuteSelectionAction.getSelectionText(editor); | ||
if (selectionText != null) { | ||
PyExecuteInConsole.executeCodeInConsole(e.getProject(), selectionText, null, true, true, false, null); | ||
} | ||
else { | ||
cellExecute(e, editor); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,7 +6,7 @@ | |
<idea-plugin> | ||
<id>python-smart-execute</id> | ||
<name>Python Smart Execute</name> | ||
<version>0.1.10</version> | ||
<version>0.1.11</version> | ||
<vendor email="[email protected]" url="https://github.com/JetBrains/intellij-community/pull/711">Guo Ci Teo</vendor> | ||
|
||
<description><![CDATA[ | ||
|
@@ -17,6 +17,10 @@ | |
A plugin implementation of the following PyCharm <a href="https://github.com/JetBrains/intellij-community/pull/711">pull request</a>. | ||
JetBrains feature request: <a href="https://youtrack.jetbrains.com/issue/PY-38919">https://youtrack.jetbrains.com/issue/PY-38919</a>. | ||
For IDEs with Jupyter notebook support, there is also a execute cell command "Execute cell in console". | ||
keyboard shortcut: <code>alt shift E</code>. | ||
]]></description> | ||
|
||
<depends>com.intellij.modules.lang</depends> | ||
|
@@ -48,5 +52,15 @@ | |
<keyboard-shortcut keymap="Eclipse" first-keystroke="ctrl alt A" replace-all="true"/> | ||
<keyboard-shortcut keymap="NetBeans 6.5" first-keystroke="ctrl alt A" replace-all="true"/> | ||
</action> | ||
<action id="ExecuteCellInPyConsoleAction" | ||
class="com.jetbrains.python.actions.PyCellExecuteAction" | ||
text="Execute cell in console" | ||
description="Executes cell in Python console"> | ||
<add-to-group group-id="EditorPopupMenu" anchor="before" relative-to-action="ExecuteInPyConsoleAction"/> | ||
|
||
<keyboard-shortcut keymap="$default" first-keystroke="alt shift E"/> | ||
<keyboard-shortcut keymap="Mac OS X" first-keystroke="control shift E" /> | ||
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="control shift E" /> | ||
</action> | ||
</actions> | ||
</idea-plugin> |