我习惯于Emacs导航,特别是 Ctrl + P , N , F ,以及 B ,但我现在也习惯了Jupyter笔记本。一般问题是:如何在笔记本中启用这些快捷方式?
让我感到震惊的是,在Mac上,这些键绑定已经在标准的Anaconda IPython中使用了。但它完全可以理解,因为大多数系统和浏览器快捷方式都绑定到 Cmd 而不是 Ctrl 。
由于我在Ubuntu上花了很多时间,我想在这里重现相同的行为。很快就发现大多数浏览器非常重视一些键绑定,例如 Ctrl + P 用于打印或 Ctrl + N 用于新窗口。关闭它们本身就是一个大问题,因此我决定仅使用另一个浏览器用于Jupyter笔记本,而Vivaldi似乎是一个不错的选择,因为所有快捷方式都可以在那里轻松定制。
我相信,关闭浏览器快捷方式后,IPython语法会启动,但没有发生过这样的事情。接下来,我尝试了Jupyter笔记本快捷方式定制的许多手册中的一个(例如这个http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Custom%20Keyboard%20Shortcuts.html)来绑定我需要的4个快捷方式。它只在某种程度上起作用,并且仅在Jupyter内联魔法中起作用:
%%javascript
Jupyter.keyboard_manager.command_shortcuts.add_shortcut('ctrl-p', 'jupyter-notebook:move-cursor-up')
它的作用是偶尔我按下ctrl-p时命令模式下的光标确实向上移动,但这种行为是不稳定的。此外,在它移动后,它立即进入上面单元格中的编辑模式,如果我只是按“向上”箭头,则不会发生这种情况。至于编辑模式的相同技巧:
%%javascript
Jupyter.keyboard_manager.edit_shortcuts.add_shortcut('ctrl-p', 'jupyter-notebook:move-cursor-up')
唉,它根本不起作用。
原谅我的长篇介绍。我现在的问题是:
我在内联模式中使用的键绑定有什么问题?这是我犯的一个愚蠢的错误还是一个Jupyter故障?
当我尝试通过我的custom.js文件使用这些byndings时,它们不起作用。但是,文件本身是可识别的,例如alert()命令工作正常。
我在CodeMirror的emacs绑定上偶然发现了几次,但据我所知,它们主要用于复制粘贴相关事项而不是导航,这是真的吗?使用这组绑定而不是使用custom.js追踪路径会有帮助吗?
谢谢。
UPD
从CodeMirror安装emacs.js并添加此代码实际上解决了我的问题。只需要确保所有冲突的浏览器键绑定都已关闭。
require(["codemirror/keymap/emacs", "notebook/js/cell", "base/js/namespace"],
function(emacs_keymap, cell, IPython) {
cell.Cell.options_default.cm_config.keyMap = 'emacs';
var cells = IPython.notebook.get_cells();
for(var c=0; c< cells.length ; c++){
cells[c].code_mirror.setOption('keyMap', 'emacs');
}
}
);