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

13
我在VSCode中使用black,可以在保存时自动格式化所有Python代码。我希望在Jupyter笔记本中也有同样的功能。 这个答案展示了如何右键单击并从上下文菜单或按键快捷方式格式化单元格或整个笔记本。我可以在保存时实现相同的功能吗?
看起来有一个问题与此相关,但已经存在一年多了。
有什么好的解决办法吗?也许可以将格式化笔记本选项设置为与保存相同的按键绑定?
更新:
如果您像我一样想添加此功能,请转到问题并投票支持,开发人员表示需要大量支持才能考虑添加此功能。
6个回答

12

好消息!在最新的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
请确保您已安装JNs支持:pip install 'black[jupyter]' - Mehvix

1

一个简单的解决方案是将notebook格式选项设置为与保存相同的键绑定,就像您建议的那样。以下是如何使用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"
    }
]

在Mac上,使用"key": "cmd+s" - Salvatore

1

根据Github,目前还没有计划。


0

感谢wossname提出这个问题。它非常有效。不幸的是,我无法直接回复您的帖子。

只需注意一件事:在Mac上工作时,在keybingdings.json中需要调整key。 在那里,它需要是:

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

请不要将“谢谢”作为答案。一旦您拥有足够的声望,您就可以投票支持有用的问题和答案。- 来自审核 - IGR94

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接