编译了之后,启动 vterm 时仍然询问是否编译(无法复现)

更新:我用的 Doom Emacs,macOS,emasc-plus@29,版本是 emacs 29.4。

昨晚想复现自己描述的这个现象。

第一次尝试:删除 vterm-module.so(很奇怪,在 dired 里看不到这个文件,用 Finder 可以看到),再用 ~emacs -Q~ 启动,在 Scratch buffer 里执行 eval-buffer 如下配置:


(toggle-debug-on-error)
(add-to-list 'load-path "~/.emacs.d/emacs-libvterm")
(require 'vterm)

出现是否编译的对话,输入 yes 编译了之后,emacs-libvterm 文件夹里顺利出现 vterm-module.so 文件。vterm 正常启动。

第二次尝试: 将 emacs-libvterm 这个文件夹移动到其它地方,再将配置里的路径删除。

正常启动 emacs, 输入 ~M-x vterm~ ,之后显示是否编译 vterm-module 的会话,输入 yes 之后,顺利编译出文件,并保存在 Doom Emacs 默认放 package 地方。然后,vterm 正常启动。

关闭 emacs,重新打开 emacs,输入 ~M-x vterm~ ,vterm 正常启动。

晕了,我无法复现这两天一直出现的现象。。。


更新: (setq vterm-always-compile-module t) 这句不是必须的。只需要用 Mannel 方式安装 emacs-libvterm,并在配置里指定 emacs-libvterm 的路径即可。

目前我的配置写法是这样:

(use-package! vterm
  :init
  (setq vterm-shell "zsh")
  :load-path "~/.emacs.d/emacs-libvterm"
)

每次重新启动 emacs,vterm, 都要问是否编译, 编译成功了之后虽然能够正常使用。但也不想每一次重新打开 emacs,都重复以上过程。 (鉴于之前的表达造成了误会,现在更加明确一点)

Google 了一下, 发现添加这句配置可以(更正:添加这句之后,重新启动 Emacs 后再唤出 vterm,还是询问编译)

检查了一下,还有一个方法,可以避免每次启动都编译:

  1. 将 emacs-libvterm 下载到本地编译,使用官方仓库里推荐的 Manual 方式进行安装
  2. 然后在配置里添加上 emacs-libvterm 的路径

具体写法:

(use-package! vterm
  :init
  (setq vterm-shell "zsh")
  :load-path "~/.emacs.d/emacs-libvterm"
  :config
  (setq vterm-always-compile-module t))

经过测试,这个配置可以较为完美的解决这一问题。

注:楼下很多人说没遇到过这种情况,但是偏偏我遇到了,搞得我好像弄虚作假一样。 可能问题存于一个我尚未检查到的地方,如果未来也难免有人遇到类似的情况,是否那个人也是弄虚作假?

Emacs 这么个性化的东西,每个都多多少少不一样,其背后导致问题出现的原因更可能千差万别。谁能保证自己一点都不可能遇到类似的情况?还是说,已经自信到,觉得自己已经完全了解 Emacs 以及其所有周边的一切了?有的话,那也是自信过度,大言不惭吧。

国内难以产生讨论氛围,第一个问题就在于,说点什么,都得验明正身。首先都是有罪推定看待别人,如果是这样的话,交流来干嘛?大家一起添那些牛逼的人,牛逼的人就添更牛逼的人就好啦。何苦发帖子?如果是为了显示自己牛逼,我觉得这个世界有太多地方可以让自己装逼了。没必要在这一亩三分地来显得自己厉害。

If not nil, if vterm-module is not found, compile it without asking.

这是默认编译的意思吧?而且 vterm-module 能找到的话,不会每次启动就编译吧?

使用过程中,每一次用命令唤出 vterm 都会重新编译一次

总之这句可以避免(更新,这句并不能避免,已经再更新的回复里解释)

我看了文档,它这个设置是,每一次唤出 vterm 都会自动编译,而省略询问用户这一步。

这也是可以的, 我作为用户,只是希望使用过程中,避免打扰,以及在重复的事情上浪费精力。

我这里并不会。

有什么特别的见地吗?

谁说每次都会编译?很明显只会第一次启动的时候编译,如果module存在就不会。

(defcustom vterm-always-compile-module nil
  "If not nil, if `vterm-module' is not found, compile it without asking.

When `vterm-always-compile-module' is nil, vterm will ask for
confirmation before compiling."
  :type  'boolean
  :group 'vterm)
;; If the vterm-module is not compiled yet, compile it
(unless (require 'vterm-module nil t)
  (if (or vterm-always-compile-module
          (y-or-n-p "Vterm needs `vterm-module' to work.  Compile it now? "))
      (progn
        (vterm-module-compile)
        (require 'vterm-module))
    (error "Vterm will not work until `vterm-module' is compiled!")))
1 个赞

没遇到过每次都要编译的情况,一般我留意是更新完doom或者emacs才需要重新编译

没有遇到过每次需要编译的情况

是每一次重新打开 Emacs,都会编译一次,可能我的说法有瑕疵

这里说得很清楚,没有 module 的情况下,每次编译之前都询问一次。所以我现在的解法哪里有问题?

你说得对,我现在的方法就是按照官方文档所说,自行编译了 module,指定了路径,重新编译的现象不再出现。

还不知道为什么,vterm 在我这里编译不成功的原因。

所以,根据你的历史描述(虽然似乎因为表达问题,前后让人感觉自相矛盾),你的问题是每次重启 Emacs后 vterm 都要重新编译,而且自动的编译从来都没有成功过,是这样吗?

帖子写得太急了,问题交代得太简略,光想着找解法了。

我详细的说一下:

  1. 每一次 Emacs 重启之后,都需要重新编译。
  2. 重新编译是成功的,编译之后,vterm 正常使用。
  3. 但如果关掉 Emacs,重新启动之后,再唤出 vterm,就会重复以上过程。

现在虽然找到了解法,但对原因还是不了解。

Debug 建议:先把 emacs-libvterm 目录下的 vterm-module.so 删了, emacs -Q,进入后

(toggle-debug-on-error)
(add-to-list 'load-path "~/.emacs.d/emacs-libvterm")
(require 'vterm)

然后看看 vterm.el 是否正确地编译了 vterm-module.so,编译日志会打在 *Install vterm* buffer 中。如果编译成功,M-x vterm 应该能正常打开一个终端,而且 emacs-libvterm 目录下会有 vterm-module.so。确认无误后,关闭 Emacs 并 emacs -Q 重启,重复上面的命令,看看为什么 vterm.el 找不到 vterm-module.so

兄弟,还请您不要太敏感了,坛友并没有像你说的那样,觉得你在弄虚作假,只是之前你的描述的确让人困惑,实在不明白为什么会出现你这样的问题,也不明白你之前写的解决方案为什么能解决你所说的问题(我截取文档、 @seagle0128 截取了源码也只是为了说明这一点)。记得你之前的表达我也读了很多次才读顺,当时我的理解是你每次使用 vterm 命令就会重新编译 vterm-module。(建议下次修改可以不要覆盖原先的内容,让大伙儿评评是不是表达得不清楚。)坛友们只是希望你能把问题描述清楚,这样可以一起帮你解决问题,没有你说的这种特地装逼的意思。

谢谢提供发现问题的思路,晚点尝试。

问题的发现,是有过程的 ,我也想一下子就能跳到终点。

所以,我的表达肯定存在问题,这也是为什么我要修改的原因,因为问题的定义是错误的话,也会误导他人。但我不知道怎么添加删除线,所以有的地方覆盖,有的地方选择添加备注。

一开始,我的确以为,每一次唤出 vterm 都会重新编译一次。然后,我尝试复现问题,发现是每一次重新打开 emacs,才会出现。

我在网络上找了一句配置,好像是解决了,但后来发现问题依旧存在。然后才重新定位到可能的问题,vterm 编译了,但似乎放在了一个 emacs 找不到它的地方。

最后我才查阅官方的文档,找到了 Mannuel 的安装方法,和在配置里指定路径的方法,才解决的。

我接受你的提醒和劝诫,心急了一些,向其他人道歉。

2 个赞

我刚才按照你说的做法测试:

  1. 我发现 emacs-libvterm 里,没有 vterm-module.so 这个文件。有的是另外的文件,vterm-module.c 和 vterm-module.h。
  2. 我把 vterm-module.c 和 vterm-module.h 移动到另外一个文件夹里。
  3. 用 emacs -Q 启动,让你提供的配置生效后,出现了一个选择会话。好像和 vterm 无关,好像是说我选择了之后,是否将相关配置信息写进 coustom.el 里。
  4. vterm 成功启动。
  5. 然后,我在 emacs-libvterm 里找发现了 vterm-module.so 文件。

我没找到 *Install vterm* buffe 这个 buffer,

这应该是表明编译成功了。

我用 Doom Emacs,今天 运行了一次 =doom upgrade= 命令,但中间有一个包一直拉不下来,被我强制退出了,然后再重新执行命令,可能和这个操作有关系。

要不你可以先试试读一下 vterm-module-compile 这个函数的逻辑,然后再看看问题所在?

另外贴一些报错/截图,都有助于大家帮你查出问题。

1 个赞

你上来就假定每次打开 Emacs 就要重新编译 vterm,试想一下连保存编译结果这种基础功能都没有的包,怎么可能有 1.7k star,被那么多人使用?

自己不理解也就算了,还言之凿凿的说看了文档得出的结论每次都会自动编译,你这是在误导其它人。

我看不下去就回复了一句“我这里不会”,这是想让你发现自己的假定是错误的,有动力去再研究看看是不是哪里配置的不对。

然后楼下老哥都贴出来源码了,源码写的清清楚楚,就没有比源码更正确的东西了。你可倒好,还在说“我看了文档,我这样解法有啥问题?”

你都不给出你的最小化可复现的配置,我们怎么给你看有啥问题?靠算卦占卜么?


如果仅仅是以上这些,我也是懒得回复你的,但是你这开始上纲上线,扯什么国内氛围我就又忍不了了。我看氛围就是被你这种不虚心研究求教的人搞坏的。


我接受你的提醒和劝诫,心急了一些,向其他人道歉。

我接受你的道歉,但是道歉不如改正

  1. 请将帖子标题改为请教问题的标题而不是给别人传授知识的标题,比如《请问如何避免 vterm 每次启动都要重新编译》。因为你并没有正确的解决这个问题。
  2. 请删掉一楼无关问题本身的内容。
  3. 请提供最小化可复现的配置,以及 Emacs 版本,操作系统版本,是否使用别人的配置比如 doom emacs。提供足够的信息,这样大家才能真正帮你解决问题。
3 个赞

不是假定,是没有正确理解现象,也没有正确理解问题。昨天修改配置挺频繁的,经常重新启动 emacs,也就经常遇到这个现象。没有仔细研究现象的规律,直接上手找解法了,这一点我做得不好,没有认真研究。

文档里写了是第一次加载会自动编译,但关于 vterm-always-compile-module 这句命令,文档里写的:

vterm-always-compile-module


Vterm needs `vterm-module` to work. This can be compiled externally, or `vterm` will ask the user whether to build the module when `vterm` is first called. To avoid this question and always compile the module, set `vterm-always-compile-module` to `t`.

这里我应该没有理解错,大体的意思就是,vterm 需要编译 vterm-module 之后才能运行,不然就会每一次都询问用户。这里觉得和实际情况有出入的地方,是「first call」这个条件,看上去并不是单纯的第一次使用时才会出现询问编译。

我仔细看了帖子,确实没觉得自己的理解有问题。除非你能明确指出我的理解哪里问题,否则我不会承认。

我在之前的帖子里已经道歉过了,继续道歉没有意义。

一开始是没有任何自定义配置,仅仅是加载这个包而已。给不出来。

哈哈哈,我接受你的嘲讽。这不是我的本意,不断修改帖子的,就是希望能够提供正确的描述。

已经用上删除线了,我想就是保留错误,接受批评的意思。也算是给自己提醒,以及其他社区新成员的一个提醒。

1 个赞