教程
avatar of this article's author EarlGrey
好用!在 Notebook 中使用 Sublime Text 快捷键

前几天,我在公众号上发布了两篇译文,对 Jupyter Notebook 做了一些基础性的介绍。虽然说比较基础,而且第二篇阅读量并不高,但是我认为对于其他对于 Notebook 不太了解的朋友来说,还是有作用的。

今天,我想分享一个配置 Notebook 的技巧,可以支持在 Notebook 中使用 Sublime Text 的快捷键。因为平常用 ST3 比较多,所以已经习惯了一些它的快捷键,如果能在 Notebook 中也用上的话,那么编写 Notebook 的效率将有很大提升。

经过一番搜索,我得出了以下步骤和代码,可以实现我们想要的功能。

第一步:找到 custom.js 文件的地址

在 MacOS 和 Linux 系统下,该文件的默认地址是~/.jupyter/custom/custom.js。如果你是第一次配置这个文件,那么很可能这个地址下并不存在该文件。当然,你也可以选择在 Notebook 中运行下面的代码,来确定 custom.js 的路径和内容:

# 打印 Jupyter  配置目录的路径
from jupyter_core.paths import jupyter_config_dir
jupyter_dir = jupyter_config_dir()
print(jupyter_dir)

# 打印 custom.js 的路径
import os.path
custom_js_path = os.path.join(jupyter_dir, 'custom', 'custom.js')
print(custom_js_path)

# 如果 custom.js 文件存在,打印其内容
if os.path.isfile(custom_js_path):
    with open(custom_js_path) as f:
        print(f.read())
else:
    print("You don't have a custom.js file")

如果目标路径下没有 custom.js ,那么先创建该文件。为了确保 custom.js 文件确实能其作用,可以在文件的开头加上这样一句代码:

alert("hello world from custom.js")

然后重启 Jupyter Notebook 。如果一切顺利,重启之后你会看到浏览器弹出一个对话框。

添加配置快捷键的代码

接下来,你可以先把上面写的那句 js 代码注释掉。然后在 custom.js 文件中加入以下代码:

require(["codemirror/keymap/sublime", "notebook/js/cell", "base/js/namespace"],
    function(sublime_keymap, cell, IPython) {
        // setTimeout(function(){ // uncomment line to fake race-condition
        cell.Cell.options_default.cm_config.keyMap = 'sublime';
        var cells = IPython.notebook.get_cells();
        for(var cl=0; cl< cells.length ; cl++){
            cells[cl].code_mirror.setOption('keyMap', 'sublime');
        }

        // }, 1000)// uncomment  line to fake race condition
    }
);

然后再次重启 Jupyter Notebook。

输入一些文本和代码,然后试着按下 Ctrl + D 或者 Ctrl + L 的快捷键。如果顺利的话,你会发现可以在 Notebook 中使用 Sublime Text 的快捷键了!

说明

之所以能够实现这个功能,得益于较新版本的 Jupyter Notebook 中使用了 CodeMirror 这个基于 JavaScript 的文本编辑器组件。除了 ST 之外,CodeMirror 还支持 Vim 和 Emacs 按键绑定。

大家有兴趣可以尝试着开启 Vim 或 Emacs 绑定。

上一篇
下一篇