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

我用了多年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……这么多插件,能否选其中两三个作为例子,简要归纳说明一下他们分别属于哪一类,主要负责干什么活儿,该怎么定位他们功能交叉的部分?

非常感谢!

4 个赞

其实,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 用。

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

我不太了解 emacs 的情况,但是我大概知道 Vim/NeoVim 的补全工作流程。

粗略的说前端就是用户看得见的地方,在补全的语境下主要就是补全时候弹出来的窗口

后端基本就是所有其它东西,在补全语境下主要就是在前端发出请求的时候根据前端的请求所携带的信息返回前端需要的补全候选词。

整个补全流程是前端触发补全,后端准备补全候选词,前端展示候选词,用户选择候选词。

具体一点,前端根据设置好的触发规则(比如说当用户输入 . 的时候,或者是当用户输入两个以上字母的时候)触发补全,向后端发起请求。这时候就是各种补全源 sources 进场了,比如说 lsp, buffer, path, snippet 等等。每个补全源会根据前端请求时候带的信息比如说刚刚用户输入的是哪几个字母(这个好像称为keyword)?然后分别返回候选词。这个里面就会涉及前端对keyword的选取策略,以及补全源过滤和排序的策略。然后前端展示用户选择。

2 个赞

后端和前端没有什么明确定义,一般是为了讨论方便划分的系统层级:后端和前端属于同一个系统,前端一般是较早接触用户的部分,后端一般不直接面向用户,且被前端调用。广义上的 「前端」和「后端」的概念并不仅限于 Web。

在复杂的系统里你可以划分出几层嵌套的前端和后端,比如在 Emacs 里使用 LSP + Corfu 提供语义补全:

其中 Capf 部分既可以看作是 Corfu 流程的后端,又可以看作是 LSP 流程的前端。

3 个赞

不谈前端和后端啊,主要谈谈为什么 emacs 里会有这么多补全框架,而且你发现用户通常装补全框架还需要装两个而不是装一个就够了。

因为 emacs 里的补全其实有两种不同的补全。

第一种是

vertico/ivy/helm: 这个是 minibuffer 补全的前端(显示)框架。但是其实这个在很多别的编辑器里根本就不会把这个东西和补全联系到一起,因为 minibuffer 其实在很多编辑器里对应的比较相似的东西应该叫命令面板。比如 vscode 的 control + shift + p,macOS 的 cmd+space。很少有人会把这些东西和补全联系到一起。

counsel 是提供了很多常用的命令(就像你用 vscode control+shift+p 能够调用很多命令一样)给 ivy 框架使用。

consult 同样提供了很多常用的命令,除了可以给 vertico 使用,也可以给很多其他的 minibuffer 前端框架使用。

第二种才是比较符合常见概念的补全,也就是 in-buffer 的补全,就是在文本编辑的时候的弹窗补全,补全变量名/函数名什么的。company/corfu/lsp-bridge 提供的是这个。

2 个赞

我粗略的感觉,分离技术只是为了减少需求变化导致的代码变化范围,前端很多的是受到人的感官的影响,而后端很多的是受到信息提供程序的影响,两种影响不太一样,所以分离来可以减少混乱

其实用户大部分时候直接感受的或者使用的都是前端,后端其实就是给前端开发用的,你很难理解前端和后端的区别就是因为你几乎不直接和后端打交道。你没必要纠结前端和后端这种概念,只要你关注数据的生成和流向,事情就很清晰了。

我理解只要是需要涉及数据库方面的内容,就是后端,其它只要是跟数据库扯不上关系的就都算作前端。 大部分人都不会操作数据库(sql),而是通过其它各种软件提供的界面来操作数据库,比如云文档,云表格,云表单…这些都是前端。

到了emacs我也看作只是前端工具,因为我的数据是放在另外数据库里的,又不放在emacs里,只是在emacs查看管理这些数据(通过org-mode)