如何在IPython Notebook的代码单元格中默认显示行号

31

我希望 IPython 笔记本代码单元的默认显示包括行号。

我从 Showing line numbers in IPython/Jupyter Notebooks 学到,我可以使用 ctrl-M L 进行切换,这很好,但需要手动操作。如果想要默认包含行号,我需要在 ipython_notebook_config.py 文件中添加一些内容。除非我错过了什么,否则文档中没有关于如何这样做的说明。


2
对于使用最新的2021版本的用户,只需在高级设置.json文件中添加以下内容:{ "codeCellConfig": { "lineNumbers": true} } - shivam13juna
@shivam13juna 非常感谢,下面的回答都没有起作用! - Fractalic
3个回答

47

(适用于Jupyter 4+) 在最新的Jupyter版本中,他们已经记录下来了更改配置的位置。所以基本上,在Jupyter更新中,他们删除了概念文件,因此custom.js文件的位置现在是.jupyter/custom/custom.js,具体取决于您的.jupyter文件夹的位置。如果您没有custom文件夹或custom.js文件,请创建它们,然后将这些行放入新创建的文件中:

define([
    'base/js/namespace',
    'base/js/events'
    ], 
    function(IPython, events) {
        events.on("app_initialized.NotebookApp", 
            function () {
                require("notebook/js/cell").Cell.options_default.cm_config.lineNumbers = true;
            }
        );
    }
);

以上是为了同时将行号设置为所有单元格类型。如果这样做,代码、Markdown和原始单元格都将获得行号。如果你只想为代码单元格添加行号,有一种更简单的方法。选择一个代码单元格,打开Chrome/Firefox JavaScript控制台,输入以下几行:

var cell = Jupyter.notebook.get_selected_cell();
var config = cell.config;
var patch = {
    CodeCell:{
        cm_config:{lineNumbers:true}
    }
}
config.update(patch)

然后重新加载页面。这些更改会被持久保存,因为Jupyter会创建一个json配置文件在.jupyter/nbconfig中以存储它们。此方法来自文档的这个页面,所以阅读文档以获取您可以进行的更多配置更改。


(old answer)

在最新版本的IPython Notebook(v3.1.0)中,转到~/.ipython/<profile_name>/static/custom/custom.js并添加以下行:

define([
    'base/js/namespace',
    'base/js/events'
    ], 
    function(IPython, events) {
        events.on("app_initialized.NotebookApp", 
            function () {
                IPython.Cell.options_default.cm_config.lineNumbers = true;
            }
        );
    }
);

IPython.Cell.options_default.cm_config.lineNumbers = true; 这一行代码单独存在不会生效,因为需要在尝试执行此代码之前加载 IPython.Cell 对象。仅添加该行代码将在控制台中引发未定义错误。您需要将其放入事件处理程序中,如下所示。

@William-Denman的代码可能适用于早期版本,但现在您需要这样做。

编辑:最新版的IPython / Jupyter(IPython 4.0.0、Jupyter 4.0.6 )需要将中间的代码行更改为require("notebook/js/cell").Cell.options_default.cm_config.lineNumbers = true; 。旧的 IPython.Cell 对象也可以使用,但您的Web控制台将抛出一个弃用警告,因此您可以预期旧的代码行在未来版本中将不被支持。

此外,在我使用WinPython portable运行的最新的IPython/Jupyter中,我找不到位于配置文件文件夹内的 custom.js 文件。我找到了它(经过长时间的搜索)在 WinPython-64bit-2.7.10.3\python-2.7.10.amd64\Lib\site-packages\notebook\static\custom 中。我不知道这是WinPython的问题还是Jupyter的问题。如果有人已经正常安装了Jupyter(使用pip或其他方式),并且仍然可以在配置文件夹中找到 custom.js 文件,请发表评论。


1
对于我使用的v3.2.0版本,被接受的答案不起作用,但这个可以。谢谢。 - akai
@Mindstormer619,谢谢。这个解决方案可行,应该被视为正确答案。 - Shahar
1
请考虑将最近、正确的方法移到答案顶部 :) - Ciprian Tomoiagă
感谢您的输入。会的 :D - Mindstormer619
3
嗨@fx-kirin,我相信在最新版本的Jupyter中,这整个问题已经不存在了。只需按“Shift+L”即可。这会切换所有单元格并保持设置。 - Mindstormer619
显示剩余2条评论

26
在您的custom.js文件中(位置取决于您的操作系统),请添加以下代码: IPython.Cell.options_default.cm_config.lineNumbers = true; 如果找不到custom.js文件,您可以搜索它,但通常它会在您的profile_default文件夹中。如果不存在,请在$(ipython locate profile)/static/custom/custom.js创建该文件。
如果由于某种原因这个方法不起作用,您始终可以以相同的方式编辑site-packages/IPython/html/static/custom/中的custom.js文件。

非常酷,好用。在尝试让它工作的过程中,我学到了另外一件事:至少对于我来说,尽管默认custom.js文件中有注释(“占位符,主要用于在profile/static/custom/custom.js中重写自定义用户javascript”),该文件必须直接位于配置文件目录下(对我而言是~/.ipython/profile_default/)。 - khstacking
太棒了!我也学到了一些东西:D。如果您能接受这个答案,那就太好了,干杯。 - William Denman
@WilliamDenman,这在新的Jupyter笔记本中不再起作用了,你有什么想法为什么会这样或者更好的解决方法吗?谢谢。 - Shahar
说实话,你的评论是我第一次听说Jupyter。它看起来真的很酷!不幸的是,我不再每天使用Python/iPython了。我已经转向.NET/C#/VB(工作需要)。所以我不能帮助你。如果我的答案不起作用,我建议你发布一个新的SO问题。我相信会有更有经验的人能够回答它。 - William Denman
1
@Shahar(以及未来的读者),这确实仍然适用于Jupyter笔记本,至少是3.1.0版本。 - jedwards
显示剩余2条评论

6

在2018年上述方法对我无效

我发现需要在~/.jupyter/nbconfig/notebook.json中添加以下内容:

"CodeCell": {
  "cm_config": {
  "lineNumbers": true
}

对象中原本存在的内容。因此,最终的对象将如下所示:

{
  "CodeCell": {
    "cm_config": {
      "lineNumbers": true
    }
  }
}

4
嗨,Stephen。在当前版本的Jupyter中,您只需在命令模式下按Shift+L即可切换行号并保留设置。手动浏览配置文件是不必要的 :) - Mindstormer619
@Mindstormer619 哈哈,谢谢!我一直在尝试使用vim来编辑Jupyter,但每次都要为每个单元格切换行号,感到很烦...没想到这么容易就可以打开或关闭所有行号。最终我用了我说的方法,但你的方法更简单 =) - Stephen C
我正在使用jupyter-vim-binding,这种方法很简单,对我很有效,谢谢! - kashmoney
可以修改这个单元格吗? - Cristián Vargas Acevedo

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