可以帮忙梳理一下前端后端、搜索补全这些概念吗?

我用了多年Emacs却还没有真正弄清楚一些概念,会写搜索和补全插件的简单配置,却一直弄不明白他们的相互关系。比如我前一段换到了vertico和embark,配置抄来抄去,摇摇晃晃跑起来了,但还是一知半解,没深刻理解他们的差异,也不会解决复杂的问题。希望有高手可以解答下列问题:

  1. 前端后端在CS领域有专门的定义吗?该怎么区分。具体到Emacs上指的分别是啥,有没有必要细分?

    比如我理解对当前buffer补全的时候可以用company-posframe进行集中展示,而相应的候选内容可以是Tabnine或其他插件提供的。对否?

  2. helm、ivy、counsel、company、vertico、consult、blink-searchrig-grep(color-rg)tab9、embark、lsp-bridge……这么多插件,能否选其中两三个作为例子,简要归纳说明一下他们分别属于哪一类,主要负责干什么活儿,该怎么定位他们功能交叉的部分?

非常感谢!

2 个赞

其实,AI 可以直接帮到你。

以下回答来自 ChatGPT 免费版,使用原问题进行提问:

你的问题涉及Emacs插件的多样性和它们在前端后端中的角色,理解这些之间的关系确实需要一些深入的思考。我会尽量详细解释,帮助你厘清这些概念。

前端与后端的定义

在计算机科学中,“前端”和“后端”有明确的区分:

前端(Frontend):用户直接交互的部分,也就是“界面”部分。在Emacs中,前端指的就是展示界面的插件或功能,比如如何显示候选项、如何与用户交互。

后端(Backend):负责处理逻辑的部分,它通常不直接暴露给用户,但提供了数据或服务给前端。在Emacs中,后端可以是处理补全、搜索、语法检查等任务的插件或服务。

在Emacs中的前后端

前端:如vertico、ivy、helm等,它们负责展示和管理候选项的界面。它们通常处理候选项的呈现和排序,甚至可以处理界面效果(比如高亮显示)。

后端:如company(补全)、lsp-bridge(语言服务协议,提供语言相关的后端支持)、tabnine(AI代码补全)、consult(搜索与选择),它们则提供数据支持和后台处理逻辑。

补全的例子

你理解得对,像company-posframe可以作为前端展示补全候选项,而Tabnine可以作为后端提供补全数据。你可以通过配置不同的前端和后端组合,获得最合适的补全体验。例如,company作为前端展示候选项,Tabnine作为后端提供AI补全。

插件分类

让我们简单归纳一下这些插件的功能及它们的“前端”和“后端”角色:

  1. helm / ivy / vertico (前端):

• 这些插件提供了搜索和选择候选项的界面,负责展示候选项并提供快速的交互体验。

• helm和ivy稍微复杂一些,它们有自己的框架,可以处理多种任务(如文件查找、命令执行等)。vertico则是一个更轻量级的替代方案,专注于高效的候选项显示。

  1. consult / embark / blink-search / rig-grep (color-rg) (前端和后端):

• consult提供了一系列前端搜索功能(例如文件查找、git查找),同时它也可以和后端(如ripgrep)协作提供搜索结果。

• embark扩展了vertico的功能,增加了额外的操作选项(比如文件跳转、命令执行等)。

• blink-search和rig-grep(即color-rg)则是具体的后端搜索工具,ripgrep可以用来进行更高效的全局文件搜索,它们是后端的实际执行者。

  1. company / lsp-bridge / tabnine (后端):

• company是一个通用的补全框架,它本身只是提供了补全的接口,但它需要其他插件来提供具体的数据(比如lsp-bridge或Tabnine)。

• lsp-bridge提供了一个后端,通过语言服务器提供智能补全和代码建议。

• Tabnine是一个AI驱动的补全插件,依赖于AI后端来生成补全建议。

功能交叉的部分

helm / ivy / vertico:都涉及到选择和搜索的前端界面,ivy和helm提供了更复杂的多功能框架,而vertico专注于简洁高效的界面。

company / lsp-bridge / tabnine:都与补全相关,但company是通用的补全框架,lsp-bridge和Tabnine分别提供了语言服务器和AI补全的后端支持。

consult / embark:它们更多的是增强了搜索和操作的功能,consult是一个前端,而embark则是vertico的增强,提供更多后端支持。

结论

前端和后端的划分帮助理解插件之间的合作方式:前端负责展示和交互,后端负责提供数据和逻辑。Emacs中有很多插件交叉实现了这些功能,通过理解它们的角色和定位,你可以更好地选择和配置适合你需求的插件。

2 个赞

有时候 AI 说了等于没说,题主应该不是想要这种回答。

有的AI 我的emacs水平都进步了 但是最近又去玩 cursor了 最终还是AI负责一切

三体人什么时候来

这个已经说得很清楚了吧

这个看题主需求。

只是当时想到一个问题,来论坛问问题与直接问 AI 有啥区别。所以我当时就想,题主可能想要些更高屋建瓴或者更深刻更整体的答案。不然都成 AI 的搬运工了。所以就回了这么一句,没其他意思。

我也想听听大佬在这个话题上发表些独特的意见啥的。

之前看到说有些论坛禁止用 AI 内容,我也感觉,论坛之前的 70% - 80% 的问题都可以用 AI 来解决,那么现在论坛的独特性还剩啥?这个问题可以单独开个贴大家灌灌水。

抛砖引玉一波。

一般语境下的前端和后端在「现在」应该是指 Web 前端和 Web 后端:

Front-end web development is the development of the graphical user interface of a website through the use of HTML, CSS, and JavaScript so users can view and interact with that website.

Front-end web development - Wikipedia

Backend development refers to the server-side aspect of web development, focusing on creating and managing the server logic, databases, and APIs.

Backend Developer Roadmap: What is Backend Development?

不太严谨地说,前端注重界面与交互,后端负责实现前端提供的功能,比如数据处理或者业务逻辑,比如数据库操作之类的。就 Web 浏览器前端来说基本上是 JavaScript 一家独大,因为浏览器只支持 JavaScript。有些语言(很多)可以编译到 JavaScript 或者 WebAssembly 来在浏览器上运行。JS 生态里面有很多组件库或者框架,比如 Vue, React 等等的来帮助实现界面和交互。

在与用户的交互过程中,前端可能会向服务器发送请求,服务器响应并返回可能的处理结果(不过这只是一种情况)。常见的请求可能是访问 HTML 网页或者下载资源之类的。相比前端后端可能更百花齐放一点,Python/Node/PHP/C++/C# 等等都有,因为只要是能处理前端请求的程序就行。前端和后端的交流一般通过某种协议来进行(比如 HTTP),由此实现了前端与后端的解耦,前端和后端只需要实现特定的协议即可一起工作,而不用关心前端/后端的具体实现。

当然前端/后端并不局限于 Web 开发,编译器开发中前端负责将程序源代码变换得到某种中间表示,后端负责将中间表示优化得到目标代码。如果某个后端提供了对某种“中间语言”的支持,那么前端可以通过将代码变换到这种中间语言来使用这个后端。(LLVM)

具体到 Emacs,一个比较简单的例子可能是 completion-at-point-functions 。company/corfu,或者 Emacs 的默认补全功能可以使用这个函数列表来获取补全项。如果要为某种编程语言实现补全功能,我们只需要实现满足 capf 要求的函数即可,换句话说就是我们不需要关注补全的显示效果。

更准确的说法应该是由 company 进行展示,company-posframe 算是 company 的一个插件。不过也差不多。

… 具体属于前端和后端看怎么分比较好点。就拿 lsp-bridge 来说,它对于具体的 LSP server 来说是前端,但对 Emacs 来说可能算后端?LSP-bridge 提供的 acm 补全又算是前端了。不过我也没怎么用过 LSP-bridge,这个说法可能不太准确。

论坛是人的聚集…不是问题的聚集。

helm/ivy/vertico 属于三选一关系,做的是同样的事,提供 minibuffer 䃼全,而且功能上会冲突。

consult 是填充前者䃼全内容的包,不和特定的 minibuffer 䃼全绑定。

counsel 是专门填充 ivy 䃼全内容的包,只能和 ivy 用。

helm 是自带所有功能的类型。ivy 认为 helm 单开一个窗口不好管理,只用 minibuffer,并把实际功能的实现分出来成了 counsel。vertico 则是和 Emacs 自带 API 统一,原生 Emacs 能用的功能就能和 vertico 用。

9 个赞
  • helm. blink-search 是用于多个后端集合的, blink-search 多多线程版的 helm
  • rip-grep、color-rg 是专注于代码重构的, color-rg 不光是搜索, 还可以批量编辑来重构代码
  • company、corfu、acm 是代码补全的前端
  • lsp-bridge 是针对LSP协议提供的前后端整套方案, 不用自己折腾 LSP 前后端
  • ivy, counsel, vertico, consult 我不用, 不做评价