conpty_proxy.exe 的路径我添加了一个变量可配置,光标形状这个我再研究一下怎么回事
新加了配置项 vterm-conpty-proxy-path , 可以指定 conpty_proxy.exe 的路径
可以可以, 谢谢.
用上了用上了
用上了用上了
,没想到也有能在 Windows 的 Emacs 里面开火车的一天,
没有普通终端那么流畅(这几乎不算什么问题)。
附上能用的启动 msys ucrt shell 的设置:
(setq vterm-shell "<msys2_shell.cmd> -defterm -here -no-start -ucrt64 -i")
其中的 <msys2_shell.cmd> 替换为你安装 msys2 位置的脚本位置。
太强了, 被编码问题折磨了好久只能用cmd, 现在可以用pwsh了
用这个方法, 为啥会提示这个?
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 就报这个
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
这么说来,emacs-kl默认启用了UCRT,应该下载ucrt-x86_64-emacs-libvterm而非x86_64-emacs-libvterm的
把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
如果需要用到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了
我打算用vterm里面的ssh连接登录远程服务器,并启动服务器上的emacs, 有点类似俄罗斯套娃,登录后有办法把M-x 自动的映射到服务器上面的emacs吗,退出后再自动映射回本地的emacs
我没用过 vterm ,你这个使用场景确实比较小众,不过我可以提供一个实现思路。
- 检测当前
buffer是否在vterm中运行的emacs - 通过 1 的判定结果,绑定/解绑
M-x按键映射
第 1 步这个如何检测就要你自己看看 vterm 里面有啥特性你可以使用的了,或者简单通过 buffer name 判断也行
第 2 步如果 vterm 有对应的 hook 可以通过 hook ,没有的话可以往 switch-to-buffer 这个函数注入一个 after 位置的 advice
这个思路的原理就是如果最外层的 emacs 没绑定 M-x 按键,那么 M-x 按键就会发送给内层 emacs,我不确定这个方法靠谱,需要你自己试试看






