我正在尝试使用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
将不再有效。我被卡住了。救命啊!
答案 0 :(得分:1)
没有重新绑定任何东西,最简单的事情是ggVG=
,它将1)带你到缓冲区的顶部,2)进入视线状态,3)带你到缓冲区的末尾, 4)缩进刚刚突出显示的所有内容。 编辑:您确定gg=G
不起作用吗?它为我提供了预期的行为。
最好是忘记Vim如何进行键绑定并了解Emacs如何处理键盘映射(请参阅here,here和here以开始使用)。在这个特定的例子中,你要记住你不能拥有一长串的密钥(例如,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
可能对许多其他邪恶的操作符很方便。