Emacs 在邪恶模式下开辟新的战线

Emacs 在邪恶模式下开辟新的战线,emacs,elisp,evil-mode,Emacs,Elisp,Evil Mode,考虑以下代码: (goto-char (point-max)) (insert "\n") 在邪恶模式的正常状态下,goto char将光标视觉上移动到行的末尾,但它指向最后一个符号之前,而不是之后。尽管上面的例子工作得很好,但它的工作原理就像光标指向最后一个符号之后一样,因此最后一个符号不会被带到下一行,这是一种正确的行为。我想知道邪恶是如何决定它需要插入最后一个符号之后,而不是之前 我之所以问这个问题,是因为我试图理解为什么在haskell模式下按enter键,在邪恶模式下按normal

考虑以下代码:

(goto-char (point-max))
(insert "\n")
在邪恶模式的正常状态下,goto char将光标视觉上移动到行的末尾,但它指向最后一个符号之前,而不是之后。尽管上面的例子工作得很好,但它的工作原理就像光标指向最后一个符号之后一样,因此最后一个符号不会被带到下一行,这是一种正确的行为。我想知道邪恶是如何决定它需要插入最后一个符号之后,而不是之前


我之所以问这个问题,是因为我试图理解为什么在haskell模式下按enter键,在邪恶模式下按normal state repl键会将当前行的最后一个符号放在下一行。它看起来像是在回调中调用了
(insert“\n”)
,而evil不知道它需要保持兼容性。

问题不完全清楚,但我认为您希望避免在按enter键时将最后一个字符移动到下一行

为了模拟Vim的行为,光标在退出insert状态后向后移动一个点。作为副产品,行末尾的
(插入“\n”)
正好出现在光标所在的字符之前,这将光标置于换行符之前


要禁用此兼容性功能,请执行
(setq-evil将光标移回nil)
(如果只想在REPL中禁用,请使用
setq-local
),并且应该能够避免将最后一个符号放在下一行。

问题在于haskell模式没有在同一函数中执行这两个命令,因此邪恶有机会将光标向后移动一个字符。除了将两者放在同一个方法中,没有很好的解决方法。将其包装在
progn
中也应该有效:
(progn(goto char(point max))(插入“\n”)