欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
你可以从这个文章阅读关于Jupyter notebook的很多小技巧:
Jupyter-NoteBook-你应该知道的N个小技巧
你可以通过jupyter_notebook_config.py
文件自定义很多Notebook的配置。
这篇文章是更多的扩展内容,即如何自己用JavaScript为Notebook撰写两个新功能:
- 快速复制当前行,类似VSCode中的【Shift+Alt+下箭头】那种效果。
- 快速复制整个单元Cell。
预备知识
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官方手册
快速复制单元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