CodeMirror 具有强大的 VIM Mode,可以准确地模拟 VIM 最有用的功能。
可以引入 keymap/vim.js
并将 keyMap
配置设置为 "vim"
来启用。
VIM Mode 可在运行时修改配置对象。
这些函数可以在任意时刻调用,并应用到所有 CodeMirror 实例。
这些函数暴露在 CodeMirror.Vim
对象上。
setOption(name: string, value: any, ?cm: CodeMirror, ?cfg: object)
name
是选项的名称。
如果未设置 cfg.scope
但提供了 cm
,则设置该选项为全局的且为实例的。
否则,根据 cfg.scope
是 global
还是 local
,判断该选项是全局的还是实例的。getOption(name: string, ?cm: CodeMirror: ?cfg: object)
cfg.scope
但提供了 cm
,则获取实例的值,如果失败则获取全局值。
如果提供了 cfg.scope
,则将获取 global
或 local
的值。map(lhs: string, rhs: string, ?context: string)
:map
命令。
绑定 ; 为 : 在VIM命令中为 :map ; :
。
context
可以是 normal
、visual
或 insert
,
与之对应的是 :nmap
、:vmap
和 :imap
。mapCommand(keys: string, type: string, name: string, ?args: object, ?extra: object)
motion
、operator
或 action
类型的命令。
触发按键事件时,会把 args 对象传递给命令。
extras.context
可以是 normal
、visual
或 insert
,仅在对应的模式下启用。
extras.isEdit
仅适用于动作,确定是否为 .
单次重复命令。
CodeMirror 的 VIM Mode 实现了大部分的 VIM 核心编辑功能。
但因为需求是无限的,所以还提供了一组 API 来扩展 VIM 的功能。
与配置API一样,这些方法暴露在 CodeMirror.Vim
中,并且可以随时调用。
defineOption(name: string, default: any, type: string, ?aliases: array<string>, ?callback: function (?value: any, ?cm: CodeMirror) → ?any)
:set
命令定义了 VIM 样式的选项。
type 参数可以是 boolean
或 string
,用于验证,通过 :set
来确定可接受的语法。
如果传入了 callback
,则 VIM 不会存储选项本身的值,而是将回调用作 setter/getter 。
如果 callback
函数的第一个参数为 undefined
,则返回配置的值。否则,应改为设置。
由于 VIM 选项具有全局值和实例值,因此使用全局值还是局部值由是否传入 CodeMirror
实例来判断。
因此,回调函数可能会被调用两次,一次 setOption
或 getOption
。
请注意,VIM 目前没有全局值,所以不支持定义 buffer-local 选项。
如果配置不应该具有全局值时,请忽略回调函数中的 cm
参数,
或者始终将 cfg.scope
传递给 setOption
和 getOption
。defineMotion(name: string, fn: function(cm: CodeMirror, head: {line, ch}, ?motionArgs: object}) → {line, ch})
head
是光标的当前位置。
如果 VIM 处于 visual 模式,则它可能与 cm.getCursor('head')
不同。
motionArgs
是传递给 mapCommand()
的对象。defineOperator(name: string, fn: function(cm: CodeMirror, ?operatorArgs: object, ranges: array<{anchor, head}>) → ?{line, ch})
defineMotion
。
ranges
是需要操作的文本的范围。
如果在操作完成后需要将光标移动到某个位置,则它可以返回一个光标对象。defineAction(name: string, fn: function(cm: CodeMirror, ?actionArgs: object))
defineMotion
。
动作命令可以具有任意的行为,比移动和操作命令更灵活,而不会造成正交。defineEx(name: string, ?prefix: string, fn: function(cm: CodeMirror, ?params: object))
:name
。
如果提供了前缀,则可以使用以 prefix
开头的 name
都可以用来调用命令。
如果 prefix
错误,则将 name
用作前缀。
params.argString
是命令名称后面的提示字符串。
params.args
是以空格分隔的 params.argString
。
如果命令以 line range
作为前缀,
则设置 params.line
和 params.lineEnd
。