0

我正在尝试使用 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不再有效。我被困住了。帮助!

4

2 回答 2

1

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

如果您忘记 Vim 是如何进行键绑定并查看 Emacs 是如何进行键映射的,那将是最好的(请参阅此处此处此处开始)。在这个特定的例子中,你要记住你不能有一个长的键序列(例如,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)

(编辑:d'oh,我忘记了您已经编写了函数;抱歉重复。)

于 2014-09-08T23:40:45.387 回答
0

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

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

当然,有类似的东西

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

我们可以避免使用“控制”,现在=Q将缩进整个缓冲区。此外,新的绑定Q对于许多其他邪恶的运营商来说可能很方便。

于 2020-12-28T13:57:38.250 回答