在doomemacs的vterm里使用vim(已经启用evil-mode),怎样退出编辑返回shell?

发现一个现象:如果只是打开一个文件,可以:q!,如果进入insert模式,就无法返回到shell。只是当前的buffer不见了,如果再次使用space o t,发现仍然在vim中,并没有返回到shell。我希望能退出vim,返回到shell。请大家给指点

我的临时解决办法:

  1. M-X evil-mode,先禁用evil-mode
  2. M-G 从插入模式返回到命令模式,不知道为什么是这个按键
  3. 按:两次输入q!,返回shell 以上是自己摸索出来的,原理不详,很是莫名其妙
  1. vterm 下,在 evil 的 insert state 中才能输入
  2. vterm 下进入 vim 并进入 vim 的 insert state 后,按 esc 并不会退出 vim 的 insert state,而是会退出emacs evil 的 insert state。此时你输入 :q 是给 emacs 的命令而不是给 vim 的命令。

解决方案也很简单,用其他的按键输入 esc 给 vterm 中的 vim。你可以看看 vterm-mode-map 看看按键绑定。我这边会用 ctrl + backspace。

另外,为什么要在 vterm 里用 vim 这么别扭的?

读一读 vterm 的 readme,配置一下 shell,就能直接 空格 + . 在当前路径下调出 find-file 在 emacs 里编辑文件了啊。

因为不知道可以 空格 + . 打开文件 :stuck_out_tongue:

怎样查看vterm-mode-map?是使用C-h m吗?我用C-h m 查看了所有的按键映射,特别是vterm-send-*,并没有发现有特别需要注意的。然后使用C-h f 发现有一个vterm-send-escape,提示如下

使用M-x vterm-send-escape进行测试,结果会直接退出DoomEmacs而不是返回到shell下。您是自行绑定了一个按键吗?把Ctrl + Backspace 绑到哪个函数上了?

没仔细看楼上,反正返回term编辑我是这样的:

(general-define-key
   :states '(normal motion)
   :keymaps 'vterm-mode-map
   "i" (lambda! (vterm-reset-cursor-point) (evil-insert-state))
   "a" (lambda! (vterm-reset-cursor-point) (evil-insert-state)))

vterm自带还是evil collection有给vterm加evil来着。我没用,自己绑了一些按键

问题解决了,确如samb233所说,仔细看看文档是很有帮助的。解决的办法如下:使用函数vterm-send-next-key。例如,为了从vim里退出,可以按下列步骤执行:

  1. M-X vterm-send-next-key
  2. 点按ESC键
  3. M-X vterm-send-next-key
  4. 点按冒号
  5. M-X vterm-send-next-key
  6. 点按q键
  7. M-X vterm-send-next-key
  8. 点按!并回车 成功退出vim返回shell

当然,也可以像smb233那样,把vterm-send-next-key绑定到自定义的按键上。具体地,可以参考他提供的链接