如何在 keymaps.cson 中将 jj 映射到 Esc?

比如,我想把键盘中的 jj 映射到功能键:Esc
这个映射该如何写呢?

'atom-text-editor':
  'j j': 'core:cancel'

再请教一个问题,如果想把kk映射为Esc+:save要怎么写?
谢谢!

不行呀,你中间加空格了?

一个快捷键只能映射为一个命令,你这种情况需要自己创建一个命令,然后在其中调用要用到的两个命令。

要加空格的,见 https://atom.io/docs/v0.209.0/behind-atom-keymaps-in-depth

# File: keymap.cson
'atom-text-editor.vim-mode:not(.command-mode)':
  'j j': 'vim-mode:reset-command-mode'

这是我的写法。
vim-mode:reset-command-modevim-modepackage settings里可以看到。

1赞

嗯,试了一下,确实实现了!
谢谢!
可以映射两个命令吗?
比如:kk 想映射到 normal模式并保存修改,这个能做到吗?

这个写法好像会引发一些问题,比如,在insert-mode中想输入j的时候,会因为触发keymap导致无法输入j
@Nixus你有遇到这样的问题吗?

我是这样设置的:只在插入模式下有效,只要不是连续输入j,只是回显会慢半拍,但是直接输入后面的内容就会跳出keymap,如果需要连续输入j,第一次输入后稍等,出现回显即可继续输入,这和 vim 下的体验是一致的。可以参考 vim-mode 的默认设置,来进行更多的尝试。

# vim-mode
#  jj => esc
'atom-text-editor.vim-mode.insert-mode':
  'j j': 'vim-mode:reset-normal-mode'
1赞

写一个可用的方法:

http://guolinn.com/2016/atom-vi-mode-maping-jj2esc/

~/.atom/keymap.cson

'atom-text-editor.vim-mode.insert-mode':
  'j': 'exit-insert-mode-if-preceded-by-j'

~/.atom/init.coffee

atom.commands.add 'atom-text-editor', 'exit-insert-mode-if-preceded-by-j': (e) ->
  editor = @getModel()
  pos = editor.getCursorBufferPosition()
  range = [pos.traverse([0,-1]), pos]
  lastChar = editor.getTextInBufferRange(range)
  if lastChar != "j"
    e.abortKeyBinding()
  else
    editor.backspace()
    atom.commands.dispatch(e.currentTarget, 'vim-mode:activate-normal-mode')

1赞