Skip to content

Commit

Permalink
add "Execute cell in console" feature
Browse files Browse the repository at this point in the history
  • Loading branch information
guoci committed May 20, 2023
1 parent 3e3abe9 commit 826bc3d
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 1 deletion.
111 changes: 111 additions & 0 deletions src/main/java/com/jetbrains/python/actions/PyCellExecuteAction.java
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);
}
}
}
}
16 changes: 15 additions & 1 deletion src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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[
Expand All @@ -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>
Expand Down Expand Up @@ -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>

0 comments on commit 826bc3d

Please sign in to comment.