20

I'm new to VS Code and running code into the python interactive window using Ctrl + enter. I would like the cursor to move to the next line automatically so I can go through the code line-by-line.

Can this be done?

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
kav
  • 507
  • 1
  • 8
  • 14

5 Answers5

28

As explained in this blog post, here is how you can make VS Code run code selections using Ctrl + enter and move to next line:

###############################
# 1. Install extension "macros" in Visual Code
#
# Hit View on top menu
# Search for extension named "macros" (by geddski)
# Install "macros" extension
#
###############################


###############################
# 2. Add code below to keybindings.json
#
# Hit <Ctrl> + <Shift> + <P>
# Enter in search bar: JSON
# Select Open keyboard shortcuts
#
###############################

{
        "key": "ctrl+enter",
        "command": "macros.pythonExecSelectionAndCursorDown",
        "when": "editorTextFocus && editorLangId == 'python'"
    }


###############################
# 3. Add code below to settings.json
#
# Hit <Ctrl> + <Shift> + <P>
# Enter in search bar: JSON
# Select Open settings 
#
###############################

"macros": {  // Note: this requires macros extension by publisher:"geddski" 
        "pythonExecSelectionAndCursorDown": [
            "python.execSelectionInTerminal", 
            "cursorDown" 
        ]
    }
Josh O'Brien
  • 159,210
  • 26
  • 366
  • 455
P.Marres
  • 454
  • 5
  • 5
  • This worked for me just after removing a preset shortcut ("editor.action.insertLineAfter") already using ctrl+enter. It was not being overwritten by this keybindings.json nor settings.json. – alvaropr Jul 13 '21 at 19:04
  • How should I adapt the `where` clause if I want to execute selection in notebooks as well? – JohnRos Jan 16 '22 at 16:04
  • 1
    To send commands to interactive window rather than the terminal, it worked for me to just change `"python.execSelectionInTerminal"` to `"jupyter.execSelectionInteractive"` and make sure you tick the box in settings `Jupyter: Send Selection To Interactive Window` – ru111 Dec 19 '22 at 19:30
7

The framework suggested by P.Marres works for me on the "run and down" part, but it sends commands to the terminal. The below setting helped me to run a .py file "line and down" in the interactive window.

prerequisite:

  • The macros extension by publisher:"geddski"
  • The Jupyter extension (installed by default with the Python extension, replacing the older python.datascience)

In keybindings.json, include:

[
    {
        "key": "ctrl+enter",
        "command": "macros.pythonExecSelectionAndCursorDown",
        "when": "editorTextFocus && editorLangId == 'python'"
    },
    {
        "key": "ctrl+enter",
        "command": "macros.jupyterExeSelThenCursorDown",
        "when": "editorTextFocus && isWorkspaceTrusted && jupyter.ownsSelection && !findInputFocussed && !notebookEditorFocused && !replaceInputFocussed && editorLangId == 'python'"
    },
    {
        "key": "ctrl+enter",
        "command": "macros.pythonExecSelectionAndCursorDown",
        "when": "editorTextFocus && !findInputFocussed && !jupyter.ownsSelection && !notebookEditorFocused && !replaceInputFocussed && editorLangId == 'python'"
    },
    {
        "key": "ctrl+enter",
        "command": "macros.jupyterRunCellThenCursorDown",
        "when": "editorTextFocus && isWorkspaceTrusted && jupyter.hascodecells && !editorHasSelection && !notebookEditorFocused"
    },
    {
        "key": "ctrl+enter",
        "command": "macros.interactiveExe",
        "when": "resourceScheme == 'vscode-interactive'"
    }
]

In settings.json include:

"macros": {  
        "pythonExecSelectionAndCursorDown": [
            "python.execSelectionInTerminal",
            "cursorDown"
        ],
        "jupyterExeSelThenCursorDown":[
            "jupyter.execSelectionInteractive",
            "cursorDown"
        ],
        "jupyterRunCellThenCursorDown":[
            "jupyter.runcurrentcelladvance",
            "cursorDown"
        ],
        "interactiveExe":[
            "interactive.execute",
            "cursorDown"
        ]
    }
Yuanhong Song
  • 89
  • 1
  • 4
  • Why have so many entries? Could you explain why each is needed? – ru111 Dec 19 '22 at 19:28
  • or you can just tweak slightly P.Marres solution: change `"python.execSelectionInTerminal"` to `"jupyter.execSelectionInteractive"` and make sure you have ticked in settings `Jupyter: Send Selection To Interactive Window`. It is not recommended to have so many entries with the same keybindings, it is very unclear which is doing what and will be a pain to maintain. – ru111 Dec 19 '22 at 19:33
1

The answer above by P.Marres showing this blog post's code was great! I needed this for the windows subsystem in linux.

Here is how you would do it for the Windows Subsystem for Linux in Visual Studio Code:

###############################
# 1. Install extension "macros" in Visual Code
#
# Hit View on top menu
# Search for extension named "macros" (by geddski)
# Install "macros" extension
#
###############################


###############################
# 2. Add code below to keybindings.json
#
# Hit <Crtl> + <Shift> + <P>
# Enter in search bar: JSON
# Select Open keyboard shortcuts
#
###############################

{
        "key": "ctrl+enter",
        "command": "macros.ExecSelectionAndCursorDown",
    }


###############################
# 3. Add code below to settings.json
#
# Hit <Crtl> + <Shift> + <P>
# Enter in search bar: JSON
# Select Open settings 
#
###############################

"macros": {  // Note: this requires macros extension by publisher:"geddski" 
            "ExecSelectionAndCursorDown": [
                "workbench.action.terminal.runSelectedText", 
                "cursorDown" 
            ]
        }
Stephan
  • 43
  • 4
0

To prevent ctrl + enter to launch a python terminal when you are using a jupyter notebook add resourceExtname parameter to the when clause:

{
    "key": "ctrl+enter",
    "command": "macros.pythonExecSelectionAndCursorDown",
    "when": "editorTextFocus && editorLangId == 'python' && resourceExtname == '.py'"
}

This will prevent the overwriting of the default jupyter notebook behaviour, which caused me some headache

Kaan Yolsever
  • 242
  • 2
  • 13
0

I made an extension for this at https://github.com/insilica/vscode-pycmd. Install it from the vscode extensions view by searching for pycmd.

After installing, create a Ctrl+Enter hotkey for executing Python code in the active terminal. These are some reasonable settings for keybindings.json:

{
    "key": "ctrl+enter",
    "command": "extension.pycmd",
    "when": "editorTextFocus && editorLangId == 'python'"
}

pycmd uses the python abstract syntax tree to find the next complete expression following your cursor.

Thomas Luechtefeld
  • 1,316
  • 15
  • 23