在IPython Notebook / Jupyter中,单元格内的向上/向下键击由CodeMirror处理(据我所知)。我经常使用这些动作(重新绑定到control-p / control-n)在单元格之间移动;但是在每个单元格的末尾,光标在跳转到下一个单元格之前移动到第一行。这是违反直觉的,而且对我来说,相当分散注意力。
有没有办法配置CodeMirror以使其向下移动 - 向下移动?
谢谢!
答案 0 :(得分:2)
移动到下一个单元格的行为由IPython包装器代码定义,它可能检查游标是否位于当前单元格的末尾,并在这种情况下覆盖默认的CodeMirror行为。您必须找到该处理程序并以某种方式将其替换为检查光标是否在最后一行的处理程序。 (我对IPython知之甚少,只关于CodeMirror,所以我不能指出你找到并覆盖相关代码的正确方法。它们可能绑定了call()
密钥,或者它们可能已被覆盖Down
command。)
答案 1 :(得分:1)
当我从代码单元的最后一行向下走时,知道我并不是唯一想要跳过“走向行尾”的行为,我调查了这种行为并发现:
codemirror.js
;“方法”:findPosV
和moveV
)cell.js
; class:Cell
;方法: handle_codemirror_keyevent
);看着代码,我看到IPython在不在最后一行的最后一个字符时忽略了该事件。这基本上证实了Marijin的答案。
主要目标是跳转到下一个单元格,我认为没有必要阻止CodeMirror到达该行的末尾。重点是强制IPython 来处理事件。
我的解决方案是将代码从Cell.prototype.handle_codemirror_keyevent
更改为此:
Cell.prototype.handle_codemirror_keyevent = function (editor, event) {
var shortcuts = this.keyboard_manager.edit_shortcuts;
var cur = editor.getCursor();
if((cur.line !== 0) && event.keyCode === 38){
// going up, but not from the first line
// don't do anything more with the event
event._ipkmIgnore = true;
}
var nLastLine = editor.lastLine();
if ((event.keyCode === 40) &&
((cur.line !== nLastLine))
) {
// going down, but not from the last line
// don't do anything more with the event
event._ipkmIgnore = true;
}
// if this is an edit_shortcuts shortcut, the global keyboard/shortcut
// manager will handle it
if (shortcuts.handles(event)) {
return true;
}
return false;
};
此代码为“向下箭头”键提供了所需的行为(几乎:光标仍然到达行的末尾,除了我们没有看到它,因为我们已经在另一个单元格中点),同样也处理“向上箭头”键。
要修改handle_codemirror_keyevent
原型,您有两种可能性:
cell.js
文件并将原型代码更改为我上面给出的代码。该文件位于<python>/Lib/site-packages/IPython/html/static/notebook/js
或类似的内容,具体取决于您的发行版好多了,加载页面后,您可以动态更改原型:
IPython.Cell.prototype.handle_codemirror_keyevent = function (editor, event) {
<same code as above>
};
您可以在custom.js
中执行此操作,或create an extension执行此操作(这就是我所做的)。