【问题标题】:Emacs evil-mode how to change insert-state to emacs-state automaticallyEmacs evil-mode 如何自动将 insert-state 更改为 emacs-state
【发布时间】:2014-10-21 22:05:03
【问题描述】:

我不喜欢插入状态,所以我想用 emacs 状态替换它。但是这个设置不起作用:

(add-hook 'evil-insert-state-entry-hook 'evil-emacs-state)

ocw 后,我仍处于插入状态。

【问题讨论】:

    标签: emacs evil-mode


    【解决方案1】:

    这个方法怎么样:

    (setq evil-insert-state-map (make-sparse-keymap))
    (define-key evil-insert-state-map (kbd "<escape>") 'evil-normal-state)
    

    我使用它,它似乎可以解决问题。而且由于您没有更改状态,因此您保留了与状态相关的配置,例如光标颜色等。

    【讨论】:

    • 简洁,简单,效果很好,谢谢!我还建议(define-key evil-insert-state-map (kbd "C-o") 'evil-execute-in-normal-state) 仍然能够从插入状态执行一次性邪恶命令
    【解决方案2】:

    很惊讶还没有人发这个...

    (defalias 'evil-insert-state 'evil-emacs-state)
    

    任何试图调用evil-insert-state 的东西最终都会调用evil-emacs-state。适用于 i、a、o、O 等。

    【讨论】:

      【解决方案3】:

      现在 Evil 有一种方法可以做到这一点

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

      之前加载邪恶

      参考:https://github.com/noctuid/evil-guide#use-some-emacs-keybindings

      【讨论】:

        【解决方案4】:

        告诉我这是如何工作的。这是一个 hack,基本上用evil-emacs-state 替换了函数evil-insert-state。问题是弄清楚如何使用转义键退出 emacs 状态。例如,当我使用 ESC 键退出 emacs 状态时,此版本运行良好,但当我尝试使用 C-[ 执行相同操作时则不行:

        ; redefine emacs state to intercept the escape key like insert-state does:
        (evil-define-state emacs
          "Emacs state that can be exited with the escape key."
          :tag " <EE> "
          :message "-- EMACS WITH ESCAPE --"
          :input-method t
          ;; :intercept-esc nil)
          )
        
        (defadvice evil-insert-state (around emacs-state-instead-of-insert-state activate)
          (evil-emacs-state))
        

        【讨论】:

        • "问题在于如何使用转义键退出 emacs 状态。"这不是一个问题。我已经这样做了: (define-key evil-emacs-state-map [escape] 'evil-normal-state) 像 o(evil-open-below) 这样的动作在文件 evil- 中与 evil-insert-state 绑定插入.el
        • 谢谢!答案以及评论中的建议似乎效果很好。我还添加了(define-key evil-emacs-state-map (kbd "C-[") 'evil-normal-state)
        【解决方案5】:

        如果您想在执行 vi 使用插入模式的任务时使用普通的 Emacs 编辑,那么擦除插入模式字典即可完成此操作。可能需要 ESC 键让您回到正常模式并让 C-z 让您进入 Emacs 状态; Leo Alekseyev posts 执行此操作的一小段代码:

        (setcdr evil-insert-state-map nil)
        (define-key evil-insert-state-map
            (read-kbd-macro evil-toggle-key) 'evil-emacs-state)
        

        我使用和喜欢的。处于插入模式而不是 emacs 模式有两个潜在的缺点:

        1. 您不能使用 ESC 键作为 ALT 键映射的另一种前缀方式;和
        2. 如果您通过 tty 访问 Emacs,则存在风险(所以我被告知,虽然我没有遇到过这种情况),Emacs 会将 ALT 修改的键解释为 ESC 后跟字符,这在插入模式比 emacs 模式。

        我认为这两个问题都不严重。

        【讨论】:

          【解决方案6】:

          我是如何成为 unix 乍得的:

          ;; unix chad setting
          (defalias 'evil-insert-state 'evil-emacs-state)
          (define-key evil-emacs-state-map (kbd "<escape>") 'evil-normal-state)
          (setq evil-emacs-state-cursor '(bar . 1))
          

          【讨论】:

            【解决方案7】:

            来自关于evil-emacs-state-entry-hook的文档:

            进入 Emacs 状态时运行的钩子。

            所以evil-emacs-state 函数在你输入emacs-state 时运行(使用C-z)。

            但是,您可以这样做:

            (define-key evil-normal-state-map (kbd "i") 'evil-emacs-state)
            

            现在的问题是退出 emacs 状态。我记得在 emacs 状态下绑定 ESC 存在一些问题,因为 ESC 被用作 META,并且 (IIRC) Evil 使用一些“特殊”代码来拦截 ESC 密钥。

            编辑:按照您的评论:这个应该可以工作:

            (fset 'evil-insert-state 'evil-emacs-state)
            

            【讨论】:

            • 谢谢,我已经更改了键映射。我只想要 o/O,cw 到 evil-emacs-state,而不是 evil-insert-state。
            猜你喜欢
            • 2014-09-29
            • 1970-01-01
            • 2014-11-07
            • 1970-01-01
            • 2013-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多