【问题标题】:Make gg=G work in Evil-Mode to indent whole buffer?让 gg=G 在邪恶模式下工作以缩进整个缓冲区?
【发布时间】:2014-09-08 23:22:45
【问题描述】:

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

【问题讨论】:

    标签: emacs evil-mode


    【解决方案1】:

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

    最好忘记 Vim 是如何进行键绑定的,而研究一下 Emacs 是如何进行键映射的(请参阅 hereherehere 以开始使用)。在这个特定的例子中,你要记住你不能有一个长的键序列(例如,gg=G)和一个较短的子集(gg),因为你有效地覆盖了较短的子集(即,如果不先输入gg,您将无法访问gg=G

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

    (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,我忘记了您已经编写了函数;抱歉重复。)

    【讨论】:

    • 我昨晚一定做了一些奇怪的事情……你说得对,今天早上它起作用了。哦。感谢您的帮助!
    【解决方案2】:

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

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

    当然,像

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 2014-07-10
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多