在 VSCode 中保存时格式化 Jupyter 笔记本

问题描述 投票:0回答:5

每当我保存在 VSCode 中时,我都会使用

black
自动格式化所有 Python 代码。我想要相同的功能,但在 VSCode 中的 Jupyter 笔记本中。

这个答案展示了如何通过右键单击上下文菜单或键盘快捷键右键单击并格式化单元格或整个笔记本。我可以在保存时实现此操作吗?

看起来有一个与此相关的问题,但它已经存在一年多了。

有什么好的解决办法吗?也许有一种方法可以将格式笔记本选项设置为与保存相同的键绑定?

更新:

如果您像我一样希望添加此功能,请转到问题并投票,开发人员表示在考虑之前他们需要大量投票。

更新:

这引起了足够的关注,因此已添加!

python visual-studio-code jupyter-notebook formatting
5个回答
13
投票

好消息!现在,这是最新 VSCode 版本 (1.77) 中的一个选项

设置

"notebook.formatOnSave.enabled": true
就可以了

您可以在此处阅读更多相关信息。

如果您已经为 Python 启用了

black
,它应该可以正常工作。


2
投票

这不受官方支持,但可能有解决方法。

来自 GitHub 上 janosh 的回复

有一个设置

editor.codeActionsOnSave
但它不允许运行任意 shell 命令(出于安全原因?),因此您需要安装像 Run On Save 这样的扩展,并让它在保存事件时调用
black path/to/file.ipynb
.

遗憾的是,现在这也不起作用,因为 VS Code 尚未公开笔记本的生命周期事件。赞成的问题是:改进笔记本生命周期的工作区 API 以支持(至少)保存事件

如果两者都实现了,您应该能够将其添加到您的设置中以自动格式化 Jupyter 笔记本:

"emeraldwalk.runonsave": {
  "commands": [
    {
      "match": "\\.ipynb$",
      "cmd": "black ${file}"
    }
  ]
}

1
投票

一个足够简单的解决方案是将格式笔记本选项设置为与保存相同的键绑定,如您所建议的。以下是如何使用 VSCode 任务来做到这一点:

tasks.json
(在命令面板“任务:打开用户任务”中):

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "cmd:save",
            "command": "${command:workbench.action.files.save}"
        },
        {
            "label": "cmd:format-notebook",
            "command": "${command:notebook.format}"
        },
        {
            "label": "cmd:format-notebook+save",
            "dependsOrder": "sequence",
            "dependsOn": [
                "cmd:format-notebook",
                "cmd:save"
            ]
        }
    ]
}

keybindings.json
(在命令面板“首选项:打开键盘快捷键 (JSON)”中):

[
    {
        "key": "ctrl+s",
        "command": "workbench.action.tasks.runTask",
        "args": "cmd:format-notebook+save"
    }
]

1
投票

根据 Github 目前还没有计划。


0
投票

如果您将其添加到您的

keybindings.json
中,当输入
ctrl
+
s
时,它还应该在 jupyter 笔记本上同时运行 format cellsave file

{
        "key": "ctrl+s",
        "command": "runCommands",
        "args": {
            "commands": ["notebook.formatCell","workbench.action.files.save",]
        },
        "when": "editorHasDocumentFormattingProvider && editorTextFocus && inCompositeEditor && notebookEditable && !editorReadonly && activeEditor == 'workbench.editor.notebook'"
    },

相反,如果您想在保存时保存整个笔记本,则可以将

notebook.formatCell
替换为
notebook.format

© www.soinside.com 2019 - 2024. All rights reserved.