Ace 编辑器和 vim 键绑定:使用 :w 命令

Ace editor and vim keybindings: using :w command

我正在将 Ace Editor 集成到网络应用程序中并使用 vim 键绑定,如下所示:

 var editor = ace.edit('editor');
 editor.setDisplayIndentGuides(false);
 editor.setHighlightActiveLine(false);
 editor.setShowFoldWidgets(false);
 editor.setShowInvisibles(false);
 editor.setShowPrintMargin(false);
 editor.setKeyboardHandler('ace/keyboard/vim');

我也将此命令映射到 Ctrl-S/Command-S 只是因为我想测试行为

editor.commands.addCommand({
  name: 'saveFile',
  bindKey: {
    win: 'Ctrl-S', mac: 'Command-S',
    sender: 'editor|cli'
  },
  exec: function (env, args, request) {
    console.log('saving...', env, args, request);
  }
});

虽然这行得通,但问题是当在Vim中使用ESCape键进入"normal"模式并使用:w保存文件时,上面定义的命令的exec函数没有像 Ctrl-S/Command-S ...

一样被调用

并且键绑定-vim.js 文件抛出关于 CodeMirror.commands.save 未定义的错误 ...

我查看了 API 文档和演示,但无法找到 "correct" 解决此问题的方法。

感谢帮助。 谢谢

还没有 public api 可以这样做。但你可以做到

ace.config.loadModule("ace/keyboard/vim", function(m) {
    var VimApi = require("ace/keyboard/vim").CodeMirror.Vim
    VimApi.defineEx("write", "w", function(cm, input) {
        cm.ace.execCommand("save")
    })
})

大括号

import ace from 'brace';
require('brace/keybinding/vim');

editor.setKeyboardHandler('ace/keyboard/vim');

ace.config.loadModule('ace/keyboard/vim', function(module) {
   var VimApi = module.CodeMirror.Vim;
   VimApi.defineEx('write', 'w', function(cm, input) {
      cm.ace.execCommand('save');
   });
});