抛弃vim(evil),重投emacs默认快捷键?

用原生的话是不可能避开ctrl键的, 我觉得空格按多了比ctrl还累

1 个赞

vim 里我习惯 leader key 用逗号,因为打逗号正常都会带空格,非空格就是快捷键

我当初用原生键位就是觉得 ctrl 键按太多手疼,后来把 大写锁定改为Ctrl就好了

最近才开始尝试自己写配置。因为担心 evil 配置复杂,所以也尝试过使用 Emacs 的按键,但是坚持一段时间后还是选择了配置 Evil。但实际配置下来,发现并没有想象的负担那么大。

我觉得最重要的有两个点:

  1. 二八原则
  2. 循序渐进

我们需要的东西其实并不多。比如说,在编辑过程中,我个人觉得最重要的就是移动和搜索。先把这些相关的内容配置到基本能用,就已经能提供不错的编辑体验了。

然后就是不要贪一次配置好。我现在基本是先默认不设置 Evil 按键,当一个指令在我的工作流中比较常用的时候,再去添加设置。将配置的 overhead 均摊下来后,其实耗时并不多。

再就是明确自己的需求。我对 vim 按键的依赖主要是在 normal mode 上。所以,基本上我只配置 normal mode 下的按键。写文档不怎么需要 Evil 的帮忙,那么我就用 Emacs mode,还避免了 normal mode 和输入法切换的问题。

2 个赞

统计最常用命令频次这一招,思路非常 practical 。赞!

把prefix设置为key-chord会有莫名的报错:

(general-create-definer global-leader-def
  :keymaps 'override
  :prefix (general-chord ",."))

;; Global leader
(global-leader-def

  ;; maps
  "h" #'(help-command :which-key "Help")
  "p" #'(projectile-command-map :which-key "Projectile")

  ;; keys
  "a" #'(avy-goto-char-timer :which-key "Avy")
  "." #'consult-imenu
  "=" #'er/expand-region

  ;; window
  "w" '(:ignore t :which-key "Window")
  "ws" #'split-window-below-and-focus)

排查了一下,是 "w" '(:ignore t :which-key "Window") 带来的错误,报错内容:

(wrong-type-argument stringp [key-chord 44 46])

请问这该如何解决?

另外,关于leader-key的选取问题,还是有些纠结,到现在为止看到和想到的都不尽如人意:

  1. C-c 已经被默认绑定了大量快捷键,比如org-mode下几乎已经是满满当当的了。此外使用leader-key就是为了减轻小指负担,这样的话相当于原地踏步了。
  2. , 逗号确实是个不错的方案,逗号+空格映射为(insert ", "),逗号+逗号映射为(insert ",")。但毕竟逗号是一个平时经常要使用的标点,举个例子,我输入了一个逗号,然后想要删除掉换成句号,逗号+Backspace就得额外绑定;针对每一个这样的场景都要额外手动绑定,有些麻烦。
  3. key-chord ,. 这是我自己的一个想法,相对好按,一般日常输入也不会用到,问题就是上面的报错。
  4. key-chord 两个空格的leader-key我也考虑过,相对于,.来讲,只要拇指敲就可以了。问题也是上面的报错,另外空格作为大键,敲起来比较重,不是最为理想。

还是抛砖引玉,请大家分享自己用爽了/习惯了的选择。

为啥不借鉴spacemacs的空格作为全局的 leader-key, 逗号作为某些major-mode 模式下的leader-key? 我目前就是自己配置仿照spacemacs

开启类似doom的hybrid模式,如果使用的插件与evil有冲突,自己又懒的去研究怎么配evil快捷键的情况下,就C-z进入纯emacs模式使用这些插件的快捷键。因为evil最高效的就是文本查找和快速编辑,这些快捷键基本上都用不到control和alt键,所以编辑纯文本的时候使用是不可能发生冲突的。

1 个赞

我一开始也是这样,可是这不是要抛开evil嘛 :joy: :joy: :joy:

曾经比赛的时候有Idea,Idea可以使用emacs快捷键,然后我改用了emacs一个月,因为太紧张,导致全用的是鼠标。我现在来看,我发现Evil是真的牛逼得不行。

不过,熟悉Emacs键位后,用Bash 更流畅了。alt+back 回删单词,很舒服。vim我用了两年了,除了‘ciw’,我目前都不知道怎么删除一个单词,用evil,其实可以用alt+back。

evil不知道是不是吃电脑配置,有时候按快了,直接会失灵,然后要重新开启和关闭插件。

:sweat_smile: 至于那些大佬能装一堆插件来扩展文本编辑,我还是不想去折腾文本编辑这方面的,所以evil没得选。

emacs的默认文本编辑已经很强大了,我很多跳转和替换都是直接isearch。还是习惯的影响,刚从vim切emacs我也是手足无措。

另外如果不用evil建议也不用general,后者就是为了各种state绑键设计的,引入了复杂度。

org是绑在C-c C-*吧,C-c *是留出来的,实在不行绑C-,C-.

如果实在放不下空格的习惯,建议坚持使用evil或者改用meow。

1 个赞

应该是general.el :kissing:

从你的描述来看,你还是认可模式编辑,只是和 evil 不对付。

你固然可以用不同的办法让 ctrl 和 alt 更好按,但这解决不了原生键位的问题: 长按一个键的成本就是比敲击一个键的成本高,对手指的损耗更大,这是没办法改变的。五年之内手指不疼不代表十年后不会。 我的 caps_lock 是单击 backspace 长按 ctrl, 按理说挺好按的,可是能直接 n/p 我肯定懒得 ctrl-n/p. 50的纸币设计的再可爱也没100的招人喜欢。

我会建议你优先考虑 meow. 从我个人经验来看,从 evil → Emacs 原生和从 evil → meow 的迁移成本总体来说是差不多的。我就不在这里写 meow 有哪些优势了,文档里都有。如果迁移到 meow, 针对你说的几个问题:

  1. leader key. 还是模式编辑,所以不存在这个问题。而且 meow 不需 general.el 也能很方便的配置。其实很多都不用配置,比如 SPC x f 直接就是 C-x C-f, 压根就不用你去绑这个键。
  2. visual block. Emacs 自带的 rectangle-mark-mode 我觉得完全够用了。
  3. 虽然在 meow 里我不怎么用 C-SPC, 但输入法我绑定给 S-SPC 了,反正这个键也是空的,不用白不用。

我的 meow 配置 你可以参考。

键位 在这里 (我是 colemak, 所以没有用 hjkl 那一套)。

4 个赞

有没有方式让空格键与其他键组合时作为control使用,单按的时候作为空格键自己?比如 space+c 相当于 control+c,单按 space 就是 space。

那和直接按ctrl+c没啥区别吧?Mac 上可以使用Karabiner,Enter组合按下是 Ctrl,单按就是回车。空格应该也能实现。

可以,类似 SpaceFn 的思想,但是因为 Space 不是修饰键,需要比较多的 Hack,看到过两种思路

  1. 要求 space-c 短间隔按下再依次放开
  2. 长按 space 激活功能键(这个有个 trick 是在快速敲击其他键位时需要禁用这个功能,不然会影响打字)

我通过 Karabiner 系统级使用第二种方案,Emacs 中这样弄感觉可能不是很合适。

set-mark,我一直用的是 alt+spc,我还没有发现emacs之外的软件可以自定义alt+space,在win上alt+spc相当于是打开当前窗口标题栏右键菜单。

我使用 hydra ,最近也想把我的空格键自定义一下,感觉空格键可以像tab键一样具有更多功能,而不仅只是输入空格,目前初步的想法是:我自定义一个符号,在这个符号的后面按空格就触发某种功能,而在这个符号以外的地方按空格就是正常的输入空格

空格键容易按太多了,而且左右大拇指都可以按。windows上有没有什么解决方案。感觉找个短空格键的键盘,把空格两边的键映射为control也可以

注意到了general.el里面有这样的用法:

(general-def 'insert text-mode-map
  "SPC" (general-key-dispatch 'my-insert-space
          :timeout 0.1
          "SPC" 'my-sentence-end))

能不能用类似的思路,让空格单独按的时候就是空格,短时间内按两下就是leader-key?我想到一个曲线的方法,是把leader-key设置为C-z,然后

(general-def "SPC"
    (general-key-dispatch 'self-insert-command
      :timeout 0.1
      "SPC" (general-key "C-z")))

但不知道能不能直接一点,绕过这个C-z