【问题标题】:How to move between visual lines and move past newline in evil-mode如何在视线之间移动并在邪恶模式下移过换行符
【发布时间】:2014-01-19 21:36:16
【问题描述】:

evil-mode 的“正常”状态下,光标移动模拟vim 的标准行为。我想通过以下两种方式使其更类似于标准的 emacs 行为。

  1. 我希望垂直移动发生在视觉线条内,而不是逻辑线条内。 IE。如果换行,按j<down> 应该会移动到同一行的下一部分。

  2. 我希望水平移动不要停在换行符处。 IE。如果光标在一行的末尾,按l<right> 应该会移动到下一行。

我怎样才能做到这一点?

【问题讨论】:

    标签: emacs evil-mode


    【解决方案1】:

    重映射解决方案会使“dj”之类的组合失败。下面的建议解决方案仍然保持 `dj' 的正确行为:

    (defun evil-next-line--check-visual-line-mode (orig-fun &rest args)
      (if visual-line-mode
          (apply 'evil-next-visual-line args)
        (apply orig-fun args)))
    
    (advice-add 'evil-next-line :around 'evil-next-line--check-visual-line-mode)
    
    (defun evil-previous-line--check-visual-line-mode (orig-fun &rest args)
      (if visual-line-mode
          (apply 'evil-previous-visual-line args)
        (apply orig-fun args)))
    
    (advice-add 'evil-previous-line :around 'evil-previous-line--check-visual-line-mode)
    

    【讨论】:

      【解决方案2】:

      我似乎无法正确移动。 C-h k lright-char

      ;; kill two birds with one stone using remap: arrow keys and h,j,k,l
      (define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
      (define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
      (define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
      (define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
      (define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
      (define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
      (define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
      (define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
      

      【讨论】:

      • 感谢您提及&lt;remap&gt;
      • 啊,抱歉,我忘了&lt;remap&gt; 用于上/下
      【解决方案3】:

      我找到了解决问题2的方法:原来有一个变量evil-cross-lines。将其设置为 t 即可解决该问题。


      结合 PythonNut 对垂直移动的修复,这里是完整的解决方案:

      ;; Make movement keys work like they should
      (define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
      (define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
      (define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
      (define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
      ; Make horizontal movement cross lines                                    
      (setq-default evil-cross-lines t)
      

      【讨论】:

        【解决方案4】:

        2)至于第二个问题(好点),我设法做到了以下几点。我不知道如何告诉邪恶不要停在行尾/行首,但我知道如何重新定义一些键:

        (define-key evil-normal-state-map "h" 'left-char) ;;remaps evil's h to emacs' left movement
        

        左键:

        (define-key evil-normal-state-map [left] 'left-char)
        

        但是对 emacs 的 right-char 做同样的事情是行不通的:/ 我正在研究它。

        ps:查找与某个键关联的函数:C-h k &lt;your key&gt;

        【讨论】:

        • 我找到了解决方案!请参阅下面的答案。
        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多