【编程】编写Jupyter Notebook脚本

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】


你可以从这个文章阅读关于Jupyter notebook的很多小技巧:
Jupyter-NoteBook-你应该知道的N个小技巧

你可以通过jupyter_notebook_config.py文件自定义很多Notebook的配置。

这篇文章是更多的扩展内容,即如何自己用JavaScript为Notebook撰写两个新功能:

  • 快速复制当前行,类似VSCode中的【Shift+Alt+下箭头】那种效果。
  • 快速复制整个单元Cell。
【编程】编写Jupyter Notebook脚本_第1张图片
快速复制当前行
【编程】编写Jupyter Notebook脚本_第2张图片
快速复制当前单元

预备知识

Jupyter Notebook的编辑界面是网页,是JavaScript编写的,所以我们需要有一些JS基础,也不用太多。

直接可以在代码Cell里面测试JS,包括编写和运行。方法是先用%%javascript开头。比如下面的代码:

%%javascript
var elements=jQuery.find(`.CodeMirror-line`)
console.log(elements)

直接运行然后在控制台就会看到输出了很多html元素。jQuery在这里是直接可以使用的。

另外一个方法是在当前用户目录下面新建.jupyter/custom/custom.js文件,然后在里面撰写JS代码。你可以写入下面的简单代码,保存,然后重新启动Notebook,打开任意Notebook文件页面,就会看到弹窗提示。

alert('Hello Notebook!');

快速复制行

下面是快速复制当前行的代码,快捷键设定在mac下的【Cmd+D】或windows下的【Ctrl+D】,你可以任意更改,只要不和系统或其他软件冲突即可。

function duplicateLine(cm){
    var current_cursor = cm.doc.getCursor();
    var line_content = cm.doc.getLine(current_cursor.line);
    CodeMirror.commands.goLineEnd(cm);
    CodeMirror.commands.newlineAndIndent(cm);
    cm.doc.replaceSelection(line_content);
    cm.doc.setCursor(current_cursor.line + 1, current_cursor.ch);
}
CodeMirror.keyMap.macDefault["Cmd-D"] =duplicateLine;
CodeMirror.keyMap.pcDefault["Ctrl-D"] =duplicateLine;

这里面使用了很多CodeMirror的命令,我们在Notebook中使用的编辑器就是CodeMirror模块提供的。

这个代码的思路是:

  • 获取当前鼠标cursor在第几行的第几个字符
  • 获取当前行的代码内容content
  • 鼠标移动到行尾
  • 插入换行
  • 插入content
  • 把鼠标放到新插入行的同样字符位置

更多的参考可以看这里:
CodeMirror官方手册

【编程】编写Jupyter Notebook脚本_第3张图片

快速复制单元Cell

下面是快速复制当前单元的代码,快捷键设定在mac下的【Alt+D】或windows下的【Alt+D】,你可以任意更改,只要不和系统或其他软件冲突即可。

function duplicateCell(cm){
    var old_cell=Jupyter.notebook.get_selected_cell();
    var old_cusor = old_cell.code_mirror.doc.getCursor();
    var codes = cm.doc.getValue();
    Jupyter.notebook.insert_cell_below();
    var all_cells=Jupyter.notebook.get_cells();
    var old_cell_id=all_cells.indexOf(old_cell)
    var new_cell=all_cells[old_cell_id+1];
    new_cell.code_mirror.doc.setValue(codes);    
    new_cell.code_mirror.focus();
    new_cell.code_mirror.doc.setCursor(old_cusor.line, old_cusor.ch);
}

CodeMirror.keyMap.macDefault["Alt-D"] =duplicateCell;
CodeMirror.keyMap.pcDefault["Alt-D"] =duplicateCell;

这个代码更多的用到了Jupyter.notebook这个模块,官方有一些参考,但明显不足。这里有另外一些参考,但也不多。更多似乎只能去官方的Github项目中找源码了。

上面代码的思路是:

  • 获取当前的单元old_cell
  • 记录当前的鼠标位置old_cursor
  • 获取当前单元的代码codes
  • 插入新的单元insert_cell_below
  • 获取全部单元all_cells
  • 获取当前单元的索引old_cell_id
  • 获取下一个单元new_cell
  • 将代码填充到下一个单元setValue
  • 激活选中下一个单元focus
  • 将鼠标的位置恢复

使用方法

直接把上面两段代码都粘贴到你的.jupyter/custom/custom.js文件内,保存,重启Notebook就可以使用这两个快捷键了。如果快捷键有冲突请自行更改。


欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】


每个人的智能新时代

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

你可能感兴趣的:(【编程】编写Jupyter Notebook脚本)