【分享】让 Windows 支持 emacs-libvterm

conpty_proxy.exe 的路径我添加了一个变量可配置,光标形状这个我再研究一下怎么回事

1 个赞

新加了配置项 vterm-conpty-proxy-path , 可以指定 conpty_proxy.exe 的路径

1 个赞

可以可以, 谢谢.
用上了用上了

用上了用上了

:seedling:,没想到也有能在 Windows 的 Emacs 里面开火车的一天,

没有普通终端那么流畅(这几乎不算什么问题)。

附上能用的启动 msys ucrt shell 的设置:

(setq vterm-shell "<msys2_shell.cmd> -defterm -here -no-start -ucrt64 -i")

其中的 <msys2_shell.cmd> 替换为你安装 msys2 位置的脚本位置。

6 个赞

太强了, 被编码问题折磨了好久只能用cmd, 现在可以用pwsh了

用这个方法, 为啥会提示这个?
:no_entry: Error (use-package): vterm/:catch: Module could not be opened: “c:/Users/Administrator/AppData/Roaming/.emacs.d/bin/vterm-module.dll”, “\325\322\262\273\265\275\326\270\266\250\265\304\304\243\277\351\241\243”

然后我自己编译,编译成功了,还是这个错误提示。。。

这个的意思是无法找到模块vterm-module.dll,检查下你的load-suffixes变量或者load-path变量

这两个变量看着没问题。

都编译成功了。

启动 vterm 就报这个 :no_entry: Error (use-package): vterm/:catch: Module could not be opened: “c:/Users/Administrator/AppData/Roaming/.emacs.d/elpa/vterm/vterm-module.dll”, “\325\322\262\273\265\275\326\270\266\250\265\304\304\243\277\351\241\243”

我是这样用的, 将这些文件放在同一个文件夹下, 然后 shell 环境添加这个目录, 启动 Emacs 就可以了
vterm-module.dll
libvterm-0.dll
conpty_proxy.exe
vterm.el

会不会是 Emacs 版本的原因? 我用的emacs31
scoop install emacs-kl

好像是因为环境问题 这个是直接启动的

这个在UCRT64中启动的 我也是按照上面的那个流程做的 你可以试试

1 个赞

这么说来,emacs-kl默认启用了UCRT,应该下载ucrt-x86_64-emacs-libvterm而非x86_64-emacs-libvterm

感谢感谢 还真是这个原因。 要从 UCRT64 启动 emacs。 已经成功了。
但是这样不是很麻烦? 每次要启动 UCRT64 ,然后用命令行启动Emacs?

把ucrt64环境下的usr/bin,usr/lib路径加入emacs的exec-path试试

试过了,不行 。
不纠结这种莫名其妙的问题了。 现在让emacs运行在msys2的世界里。感觉良好。

从头梳理下

MSYS2安装配置Emacs完整步骤

安装msys2


scoop install msys2

打开ucrt64,安装依赖和emacs

安装gcc make git


pacman -S mingw-w64-ucrt-x86_64-gcc

pacman -S git

pacman -S make

安装emacs


pacman -S mingw-w64-ucrt-x86_64-emacs

安装常用工具rg fd diff


pacman -S ucrt64/mingw-w64-ucrt-x86_64-ripgrep mingw-w64-ucrt-x86_64-fd mingw-w64-ucrt-x86_64-diffutils

svg支持

 pacman -S mingw-w64-ucrt-x86_64-librsvg

vterm依赖

pacman -S --noconfirm \
    mingw-w64-ucrt-x86_64-toolchain \
    mingw-w64-ucrt-x86_64-cmake \
    mingw-w64-ucrt-x86_64-libvterm

在ucrt64中启动emacs使用vterm

加入如下配置,执行M-x vterm。提示编译时允许,编译成功后即可开启vterm。对,就是这么简单,全自动。


(use-package vterm :ensure t :defer t

:vc (:url "https://github.com/xhcoding/emacs-libvterm" :branch "main" :rev :newest))

从msys2中启动emacs的快捷方式。避免每次打开ucrt64,在终端启动emacs。

新建 run_emacs_silent.vbs,内容如下


Set WshShell = CreateObject("WScript.Shell")

WshShell.Run "cmd /c C:\Users\Administrator\scoop\apps\msys2\current\msys2_shell.cmd -ucrt64 -defterm -no-start -shell bash -c emacs", 0, False

执行run_emacs_silent.vbs,固定到任务栏,修改属性中的目标为


C:\Windows\System32\wscript.exe C:\Users\Administrator\Desktop\run_emacs_silent.vbs

1 个赞

如果需要用到windows中的path,使用这段配置。

(let ((win-path '("C:/Users/Administrator/scoop/shims" "C:/Users/Administrator/scoop/apps/nodejs-lts/current" "C:/Users/Administrator/scoop/apps/nodejs-lts/current/bin")))
  (setq exec-path (append exec-path win-path))
  (setenv "PATH" (concat (getenv "PATH") ";" (mapconcat 'identity win-path ";"))))

你这个提示里面不是加载 dll 文件是从 .emacs.d/bin 里面加载的吗,在这个目录下没找到 dll 文件,你的 load-path 好像没这个目录,你试试把 .emacs.d/bin 目录加到 load-path 里面看看

通过urct64启动,已经成功使用vterm了 :grinning_face: 我打算用vterm里面的ssh连接登录远程服务器,并启动服务器上的emacs, 有点类似俄罗斯套娃,登录后有办法把M-x 自动的映射到服务器上面的emacs吗,退出后再自动映射回本地的emacs

我没用过 vterm ,你这个使用场景确实比较小众,不过我可以提供一个实现思路。

  1. 检测当前 buffer 是否在 vterm 中运行的 emacs
  2. 通过 1 的判定结果,绑定/解绑 M-x 按键映射

第 1 步这个如何检测就要你自己看看 vterm 里面有啥特性你可以使用的了,或者简单通过 buffer name 判断也行

第 2 步如果 vterm 有对应的 hook 可以通过 hook ,没有的话可以往 switch-to-buffer 这个函数注入一个 after 位置的 advice

这个思路的原理就是如果最外层的 emacs 没绑定 M-x 按键,那么 M-x 按键就会发送给内层 emacs,我不确定这个方法靠谱,需要你自己试试看