麻烦问一下在Spacemacs中怎么禁用某个mode(js2-mode)的快捷键?

js2-mode
spacemacs

#1

从Vim转过来的用户,这个问题可能有点小白,还希望包涵。

场景:

我在Vim中有几个自定义的快捷键。

,w ---> :w (写入文件)
,q ---> :q (关闭当前buffer)
H  --> 行首(^)
L  --> 行尾($)
U  --> Ctrl + R (redo)

我的解决方案

于是我在user-config() 里创建了下面的设置

  (define-key evil-normal-state-map (kbd ",w") 'save-buffer)
  (define-key evil-normal-state-map (kbd ",q") 'evil-quit)
  (define-key evil-normal-state-map (kbd "H") 'evil-first-non-blank)
  (define-key evil-normal-state-map (kbd "L") 'evil-end-of-line)
  (define-key evil-normal-state-map (kbd "U") 'redo)

遇到的问题

大多数情况下是可以work的,但是在打开js文件的时候,使用的是js2-mode,把,w 映射成了toggle-warnings-and-errors,请问要怎样设置才能使用这个toggle-warnings-and-errors不覆盖我的设置?

目前尝试的方法:

(define-key js2-mode-map (kbd ",w") nil)

但并不能work,goolge了2天,没找到解决方案,希望大神帮忙。谢谢。

PS:我想坚持用这个快捷键,请不要让我换个快捷键,不用,w…


#2
(define-key spacemacs-js2-mode-map "w" nil)

大概是这样吧。不用这个 layer,懒得自己试了。


#4

非常感谢你的回复,我刚刚尝试了一下,找到一种可用的方法。:wink:

   (require 'js2-mode)
  (spacemacs/set-leader-keys-for-major-mode 'js2-mode "w" 'save-buffer)

我尝试使用这种方案,并不work

  ;; not work
  (define-key spacemacs-js2-mode-map "w" nil)
  (define-key spacemacs-js2-mode-map "w" 'save-buffer)

我还尝试使用了另外一种方法,也不work

  (define-key spacemacs-js2-mode-map (kbd "w") nil)
  (define-key spacemacs-js2-mode-map (kbd, "w") 'save-buffer)

我感觉用你的这种方法更加优雅,但配置不好。如果我是哪里配置错了,还希望能麻烦你指出一下。 非常感谢!


#5

可以试试general.el配合override keymap。general.el对evil支持挺好的,甚至还有vim风格的宏

最普通的写法:

(general-define-key
  :keymaps 'override
  :states 'normal
  ",w" #'save-buffer)

#6

非常感谢,我尝试一下。


#7

在spacemacs框架下,用spacemacs的函数就可以了,比如op自己找到的set-leader-keys。楼上用general自带的override map(override意为最高优先级),估计可以,但是会有疑惑-- 看似都是,开头,实际有spacemacs的leader 和 general-override-map的leader 两份keymap。

general在spacemacs内置不能满足的时候再用,这样不容易产生混乱。比如leader不用它,以下场景用它(这里general-define-key的作用和evil-define-key一样/只是用来替代evil-define-key,不过写法不一样/更好看):

(general-define-key
   :states 'motion
   :keymaps 'git-timemachine-mode-map
   "K" 'git-timemachine-show-previous-revision
   "J" 'git-timemachine-show-next-revision
   "q" 'git-timemachine-quit
   "s" 'git-timemachine-show-revision-fuzzy
   "r" 'git-timemachine-kill-abbreviated-revision)

再说个evil相关按键的小技巧:绑定没有成功时,把evil-state和major-mode都加上(如上面一段代码),基本就可以了,因为这样我的优先级高于全局的相应evil-state的binding,又高于这个major-mode的binding