给 Jupyter 笔记本单元格魔法添加语法高亮

11

我正在尝试搞清楚如何在自定义Jupyter单元格魔术(%%mymagic)的单元格中激活CodeMirror语法高亮显示,针对CodeMirror支持的语言(cypher)。该魔术不与特殊内核相关 - 它只运行处理要突出显示的单元格中输入的字符串的Python命令。据我所知,这可以使用类似以下内容的东西来完成:


IPython.CodeCell.options_default.cm_config.lineNumbers = true;
from notebook.services.config.manager import ConfigManager
cm = ConfigManager()
cm.update('notebook', {'CodeCell': {'highlight_modes': {'magic_cypher': {'reg': '^%%mymagic'}}}})

在实现魔法的类中,我似乎无法让它起作用;当我输入以%%mymagic开头的单元格时,高亮没有任何变化。上述方法准确吗?'magic_cypher'需要特定的格式吗?魔术需要以某种方式指定CodeMirror所关联的期望高亮语言的MIME类型吗?我正在使用notebook 5.0.0,jupyter_core 4.3.0和python 2.7.13。

2个回答

13
下面的代码适用于Notebook 5.x版本,可以在~/.jupyter/custom/custom.js中使用:
require(['notebook/js/codecell'], function(codecell) {
  codecell.CodeCell.options_default.highlight_modes['magic_text/x-mssql'] = {'reg':[/^%%sql/]} ;
  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){
  Jupyter.notebook.get_cells().map(function(cell){
      if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;
  });
});

感谢Thomas K提供这一信息!


我的测试显示这在5.x和6.x上都可以工作 - 谢谢! - cco
@cco,你能否激活 CodeMirror 支持的除 SQL 之外的其他编程语言的语法高亮显示? - lebedov
1
我刚试过了,将 codecell.CodeCell.options_default.highlight_modes["application/x-cypher-query"] = {'reg':[/^%%cypher/]} ; 添加到 custom.js 中(在 SQL 的类似行之后),似乎可以正常工作。highlight_modes 中的键必须与 Codemirror 模式文件中的 defineMIME 行中的 MIME 类型匹配。 - cco
结果发现我有一个~/.jupyter/nbconfig/notebook.json,它在不考虑~/.jupyter/custom/custom.js的情况下静默激活了Cypher模式的%%cells。 - lebedov

0

我成功实现这一点的情况是为%%sql魔法添加SQL高亮。我通过将以下内容添加到~/.jupyter/custom/custom.js来实现这一点。第一行将模式添加到Codemirror配置中,其余部分将样式应用于工作簿中需要它的任何现有单元格(稍后创建的单元格将适当地进行样式设置)。虽然我希望这种情况在安装魔法时发生,但我并没有成功。

IPython.CodeCell.config_defaults.highlight_modes['magic_text/x-mssql'] = {'reg':[/^%%sql/]} ;
IPython.notebook.events.one('kernel_ready.Kernel', function(){
    IPython.notebook.get_cells().map(function(cell){
        if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;
});

你使用的Jupyter版本是什么? - lebedov
和你一样 - Notebook 5.0.5 和 Jupyter 4.3.0;Python 2.7.9,但这应该不会有任何影响。 - cco
关于您描述的 custom.js,在以 %%sql 开头的单元格中输入文本时,是否会实时进行样式设置?不知何故,加载了ipython-sql后,我没有看到这种情况发生。 - lebedov
我的错误 - 它在4.x笔记本上可以工作,但我刚刚看了一下,在5.0上无法工作。如果我再次让它工作,我会告诉你的。 - cco
尝试将 config_defaults 切换为 options_default(抱歉更改了,前端配置机制进行了一些重构)。我认为它仍然存在竞争条件,但希望它能够工作得足够好。 - Thomas K
显示剩余2条评论

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