让gg = G在Evil-Mode中工作以缩进整个缓冲区?

时间:2014-09-08 23:22:46

标签: emacs evil-mode

我正在尝试使用Evil模式从Vim移动到Emacs,但无法让gg=G缩进整个缓冲区的工作。

  • gg正确地将光标移动到缓冲区的顶部
  • G正确地将光标移动到缓冲区的底部
  • ==正确缩进当前行

然而,组合gg=G不起作用,我无法弄清楚如何自己定义它。

我定义了以下函数来缩进整个缓冲区:

(defun indent-whole-buffer ()
    "indent whole buffer and untabify it"
    (interactive)
    (delete-trailing-whitespace)
    (indent-region (point-min) (point-max) nil)
    (untabify (point-min) (point-max)))

但是,如果我尝试将其绑定到这样的gg=G(define-key evil-normal-state-map "gg=G" 'indent-whole-buffer),则gg将不再有效。我被卡住了。救命啊!

2 个答案:

答案 0 :(得分:1)

没有重新绑定任何东西,最简单的事情是ggVG=,它将1)带你到缓冲区的顶部,2)进入视线状态,3)带你到缓冲区的末尾, 4)缩进刚刚突出显示的所有内容。 编辑:您确定gg=G不起作用吗?它为我提供了预期的行为。

最好是忘记Vim如何进行键绑定并了解Emacs如何处理键盘映射(请参阅hereherehere以开始使用)。在这个特定的例子中,你要记住你不能拥有一长串的密钥(例如,gg=G)以及一个较短的子集(gg),因为你有效地覆盖了较短的子集(即,如果没有先输入gg=G,则无法访问gg。)

因此,举例来说,假设您编写了一个自定义函数来缩进整个缓冲区:

(defun indent-buffer ()
  "Apply indentation rule to the entire buffer."
  (interactive)
  (indent-region (point-min) (point-max)))

然后,您可以将其绑定到正常状态映射中的未绑定密钥,例如Q(或类似gQ的序列,或覆盖其他内容):

(define-key evil-normal-state-map "Q" 'indent-buffer)

(编辑:噢,我忘了你已经写好了你的功能;抱歉复制。)

答案 1 :(得分:0)

只是评论另一个可能更自然的选择是使用 :motion mark-whole-buffer,默认绑定 C-x h。优点是不需要移动光标。

因此,在 = C-x h 处于正常状态时,整个缓冲区会缩进并保留光标位置。

当然,像

(define-key evil-normal-state-map "Q" #'mark-whole-buffer)

我们可以避免使用“控制”,现在 =Q 会缩进整个缓冲区。此外,新的绑定 Q 可能对许多其他邪恶的操作符很方便。