为什么 Emacs 源码里有适配第三方包的代码?

刚刚发现 elisp-mode.el 里竟然有几百行代码是为了适配第三方包 company-mode 的:

https://github.com/emacs-mirror/emacs/blob/c734ba68623279d814e857ddc536421a08c38f34/lisp/progmodes/elisp-mode.el#L454-L647

感觉是不是有点本末倒置了?于是如下情况就在意料之中了:

https://github.com/emacs-mirror/emacs/blob/c734ba68623279d814e857ddc536421a08c38f34/lisp/progmodes/elisp-mode.el#L482

(defun elisp--company-doc-string (str)
  (let* ((symbol (intern-soft str))
         (doc (if (fboundp symbol)
                  (documentation symbol t)
                (documentation-property symbol 'variable-documentation t))))
    (and (stringp doc)
         (string-match ".*$" doc)
         (match-string 0 doc))))

https://github.com/company-mode/company-mode/blob/6116c4617a7934acfe84cb82a058e9b198f0f480/company-elisp.el#L186

(defun company-elisp--doc (symbol)
  (let* ((symbol (intern symbol))
         (doc (if (fboundp symbol)
                  (documentation symbol t)
                (documentation-property symbol 'variable-documentation t))))
    (and (stringp doc)
         (string-match ".*$" doc)
         (match-string 0 doc))))

去 Emacs 官方仓库查了提交记录,发现还不止上面这些。

会不会是company要进emacs了。。

company 是 elpa 的包,而且 company 的维护者也在 Emacs 里提交,例如最近在 xref/project 里的改动都是 Dmitry Gutov 提交的

即然都进 elpa 了,那就是本家了,哪来的第三方之说

company的代码里,头部都有

;; This file is part of GNU Emacs.

可毕竟不是随 Emacs 一起分发的。

从依赖关系上看,是 company 处在下游。

company 是 2012 年进的 elpa,而 1 楼所引用的代码也存在 6、7 年了,没有人觉得不妥吗?

我猜你的意思是 company 不是每个人都在用的,所以这部分代码对不用 company 的人来说就有些冗余,甚至会拖慢 Emacs 执行速度?

不过本身 Emacs 就是适配多平台的软件,你在 Linux 系统上编译安装 Emacs 的代码里也有适配 Mac 和 Windows 的代码呀。感觉这个问题颇像前几天看到的那个问题 :joy:

完全不同。

我说的是依赖关系。假如 B 依赖 A,那么 A 没必要反过来适配 B。两边出现相同的代码,是依赖关系纠缠不清的副作用之一。

2赞

感觉这么搞确实不太好, Emacs 本身就挺庞大的了, 再加些各种非核心的功能, 后面维护越来越难, 不如放在 elpa 里面.

之前 cedet 也是这样, 当时可能很流行, 合进 Emacs 之后过几年就没什么人用了, 后面都是维护负担.

啊,是我想当然了,冒然回复真不好意思。

这么看放进 elisp-mode 里的确是有问题,可能是因为作者有推送权限,测试后忘记删除就推送了?感觉还是发个邮件问一下比较好

好像确实, cedet文档好像都不太多, 很难以用上手的样子.

;; FIXME: Those functions should also be used by the normal completion code in
;; the *Completions* buffer.

看起来是因为实现自带的 completion 功能用同样可以用到这些 helper function,所以为了在没有安装 company 的情況下能夠使用就复制过来了,而不是为以后适配 company 的功能才加这些函数。至于命名里帯上 company,就是估计只为了表明这些函数的来源,而不是这些函数是给 company 用的意思,既然是同个作者提交而且同样是 GNU 项目,也没有改成完全不同名字来避嫌的必要。

1赞