键位映射表(Key maps)
键位映射表是一个将按键字符串映射到功能函数的对象。(就是快捷键设置啦)
CodeMirror自带Emacs, Vim和Sublime Text的快捷键表可供选用。
键位可用键名或字符来标识。CodeMirror.keyNames
对象定义了一些常用键名,例如Enter, F5, Q
。我们还可以给它们加上前缀Shift-, Cmd-, Ctrl-, Alt-
。所以举例来说,Shift-Ctrl-Space
就是一个有效的键位标识符。
看看这个例子,将Tab键映射为插入同等宽度的空格:
editor.setOption("extraKeys", {
Tab: function(cm) {
var spaces = Array(cm.getOption("indentUnit") + 1).join(" ");
cm.replaceSelection(spaces);
}
});
当然,我们也可以使用字符来标识键位,例如'$'
和'q'
,注意要使用单引号。
想要映射连按动作时应将对应的几个键名用空格隔开,例如Ctrl-X CtrlV
。如果你的映射表里包含连按动作,或者带修饰键却没按顺序排列(Shift-Cmd-Ctrl-Alt)时,你应该在使用该表前先调用CodeMirror.normalizeKeyMap
。这个函数以一个键位映射表为参数,进行一些修正工作后把normalized后的映射表返回给你。
映射表的value部分可以是个1)单参数(CodeMirror实例)的函数,2)字符串,3)或者是false
。其中字符串是指命令(将在下一章介绍)。而如果value被设为false的话,CodeMirror则会把按键的处理留给浏览器。按键处理器函数可以返回CodeMirror.Pass
表示它决定不处理这个按键,交给其他处理器(或默认行为)。
当匹配了以"go"开头的命令或者motion属性为真值的函数时(这是用于光标移动的),同时按下这个按键和Shift也会触发行为(例如, "Up": "goLineUp"对应了up和shift-up)。这样的设计意图是为了方便实现shift-选择。(就是按着shift移动光标啦)
如果想同时使用多个键位映射表,则设置fallthrough属性,它即可以指向一个映射表也可以指向一个数组的映射表。因此,当一个键位没有找到匹配的动作时,就会fallback到下一个映射表。
When a key map needs to set something up when it becomes active, or tear something down when deactivated, it can contain attach and/or detach properties, which should hold functions that take the editor instance and the next or previous keymap. Note that this only works for the top-level keymap, not for fallthrough maps or maps added with extraKeys or addKeyMap.