evil-insert-state or evil-emacs-state

spacemacs 有提供 hybrid, 只用 evil 用什么办法把 insert state 替换为 emacs state? 像找到的如下方式是惯常做法么?光标的样式怎么区别?用 hook?亦或是重绑 insert-state 模式下的快捷键是更明智的做法?

(defalias 'evil-insert-state 'evil-emacs-state)
(define-key evil-emacs-state-map (kbd "<escape>") 'evil-normal-state)

另外我的使用习惯是 insert 状态下进行局限于行内的编辑,会用到 C-a|e|f|b|w M-f|b|d 之类的 navigation 快捷键。 想了解一下大家尤其是 Vim 背景深厚的用户习惯是怎样。

实际是好几个问题放同一帖了,海涵。

(setq evil-disable-insert-state-bindings)

即可

抱歉我忘提及了,这个我有配置,官方文档对其描述语焉不详,我发现像 C-a|e|w 之类的按键依然是 evil 的绑定。

或许 Evil 的 opinion 就是行首尾这类跨度较大的 navigation 不应该在 insert state 下完成?

靠我发现了,这个变量不能放在开启 evil-mode 之后,我之前是放在 use-package 的 :config 里,现在放 :init 里好了。

推荐是放在 :custom 块里,这样可以避免许多奇怪的问题

例如我是这样配置 evil 的:

(use-package evil
  :ensure t
  :hook (after-init . evil-mode)
  :bind (:map evil-normal-state-map
         ("gs" . evil-avy-goto-char-timer)
         ("go" . evil-avy-goto-word-or-subword-1)
         ("gl" . evil-avy-goto-line))
  :config
  (evil-ex-define-cmd "q[uit]" 'kill-this-buffer)

  ;; Install `undo-fu' when necessary
  (when (< emacs-major-version 28)
    (use-package undo-fu
      :ensure t))
  :custom
  ;; undo will never freeze my Emacs
  (evil-undo-system (if (>= emacs-major-version 28) 'undo-redo 'undo-fu))
  ;; Switch to the new window after splitting
  (evil-split-window-below t)
  (evil-vsplit-window-right t)
  (evil-ex-complete-emacs-commands nil)
  (evil-ex-interactive-search-highlight 'selected-window)
  (evil-disable-insert-state-bindings t)
  ;; j&k operate via visual line
  (evil-respect-visual-line-mode t)
  (evil-want-integration t)
  (evil-want-keybinding nil)
  (evil-want-fine-undo t)
  (evil-want-C-g-bindings t)
  (evil-want-Y-yank-to-eol t)
  (evil-want-abbrev-expand-on-insert-exit nil)
  (evil-symbol-word-search t))
2 个赞

曾经拥有 2 年 Vim 经验的用户表示在 Emacs 上用上了自己写的模式编辑。

感觉这里给自己的 Meow 打个广告应该不过分,因为 Meow 是很尊重 Emacs 原生快捷键的,不仅 insert 下所有的键都可以用,normal 下也都可以用。

实际上就算是短距离,也习惯回到 normal 模式下去操作,因为 ctrl 本身也是一个键,向右移动三个字符 C-f C-f C-f 实际上是按四个键(ctrl长按),所以 esc 退出也无妨,况且 可以 esc 在左手,移动在右手,不冲突。

作为一个严重 FoMO 的人,自然关注过阁下的 meow。说一下我的看法(基于知识盲点可能存在对 moew 的误解)

  • 似乎不支持 state-map x mode-map 的交集之上的快捷键绑定?
  • “navigation is also selection” 是个从没见过的东西,很感兴趣,能举几个具体的使用场景吗?
  • motion-state 在 special-mode 之下工作,原 emacs-state 的快捷键问题。不知 meow 有没有提供 类似 evil-execute-in-emacs-state 的命令,个人觉得是个更好的方案,我原来把他绑在了 o 键,从 meow 学到似乎绑到 SPC 是个更明智的选择。
  • keypad, 我对把组合键拆分成更长的 key sequence 并不太感兴趣,因为我对组合键并不讨厌(两个 以下。。),但它的确能解决了一个痛点,就是需要切换左右手 modifier 的时候,比如常见的 C-c C-l (org-insert-link),或 C-x C-k,我当前的方案是牺牲掉 C-,C-.,镜像其到 C-c C-x

我理解 Evil 除了提供了一套 opinionated binding 之外,在作为框架层面来讲,勉强可算是 meow 的超集?

严格来讲 Emacs 的 nav 至少需要 step + 1 (至多 step x 2) 个按键,因为存在切换 modifier 的情况,比如 M-f C-f C-f, Vim 方式则是固定的 step + 2,看似 Vim 胜,但从具体使 用频率统计的话,我认为是不相伯仲。当然 Vim 方式用一套 nav 按键具有统一性,但 Emacs Vim 之外却 是由 Emacs 按键一统江湖的,所以还是很难讲优劣,更多是习惯问题吧。

@DogLooksGood 忘记点回复了。

先放个图,为了描述方便

Meow 本身是做减法的方案,这个减法体现在多个地方。

首先是不要用户再绑定很多的快捷键,当然有些人并不抗拒使用 C-c C-c 这样的按键,但 Meow 是一个避免 Ctrl, Meta 的方案,从这个角度看,首先 Emacs 命令的数量非常多,特别是一些大的插件,比如 Cider 有 300+ 个命令。提供翻译的方案,而不是一个一个绑,这是 KEYPAD 存在的原因。

state-map x mode-map 这个在最初的版本中有,后来就去掉了。因为不希望去绑定这样的按键,即便是 evil 这样的大众化,也几乎没有多少插件提供到 evil 的 keymap 上的绑定,所有这类的按键,都是用户自己的工作量,这是 Meow 要避免的。也没有 evil-execute-in-emacs-state ,因为没有必要。

至于 navigation is selection,这样可以减少命令的数量,在达成同样功能的前提下。而且命令也极少有 DWIM 风格的。选择是命令间组合的关键。

1 个赞