news 2026/10/1 11:06:55

Vim多行删除超全指南:寄存器、全局命令与文本对象实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vim多行删除超全指南:寄存器、全局命令与文本对象实战

Vim 多行删除这件事,说简单也简单,dd谁都会按;但说复杂也复杂——我见过太多人处理一个几十行的代码块,还在那一下一下按dd按到手麻,或者在可视模式里选了半天结果选错范围。说实话,Vim 的高效不在于你会多少冷门命令,而在于你面对"删除多行"这个高频需求时,能不能在几秒钟内选对最合适的那把刀。这篇文章我就把我日常实际在用的八类多行删除技巧完整拆开讲,每一类都讲清楚适用场景、执行逻辑和容易踩的坑,争取让你看完之后能直接上手用。

1. 删除前的底层认知:搞清楚 Vim 删除到底做了什么

很多 Vim 教程一上来就甩命令列表,dd、5dd、dG、:3,8d背得滚瓜烂熟,但一旦遇到"删错了""剪贴板被覆盖""宏执行一半跑偏"这类问题就完全懵。之所以懵,是因为没理解 Vim 删除操作的本质——它不是一个简单的"擦除",而是一套以寄存器为核心的读写机制。

1.1 删除命令的本质:剪切到寄存器

在 Vim 里执行d开头的任何删除命令,内容并不会被直接抛弃,而是会被"剪切"进一个默认寄存器,专业术语叫无名寄存器(unnamed register),用""表示。这一点和普通文本编辑器的"删除即丢弃"有本质区别。也就是说,dd删除一整行之后,这一行其实还活着,保存在内存的寄存器里,你可以随时用p把它粘贴到任何位置。

这个机制带来两个直接影响。第一,删除操作天然具备"移动文本"的能力——你在文件里删掉一段代码,切到另一个文件里p一下,内容就过去了,这就是跨文件搬移代码块的基本原理。第二,它有一个非常容易踩的坑:由于所有删除都默认走同一个无名寄存器,你只要再执行一次删除,之前的寄存器内容就被覆盖了。我经常看到有人删了一行准备去别处粘贴,结果中途又随手删了个空格,粘贴出来的内容就完全不对了。

所以,只要你准备"删了再粘贴",就要养成先选寄存器的习惯。比如用"a5dd把5行内容删进寄存器a,后面再用"ap粘贴。或者用黑洞寄存器"_d配合删除,相当于"只删不存",不污染寄存器。这个习惯在批量处理代码时能帮你省掉非常多返工。

1.2 数字前缀:Vim 命令的乘法器

理解了寄存器机制之后,另一个必须建立的概念是数字前缀。Vim 的几乎所有命令都由"操作符 + 范围 + 动作"组成,而你可以在命令前面加数字,让这个命令重复执行 N 次。不要把这个当成死记硬背,你可以把它理解成命令的"乘法器":

  • 5dd等于dd执行 5 次,删除从当前行开始的连续5行;
  • d3G等于删除从当前行到第 3 行之间的全部内容,是一个范围操作;
  • 3dw等于向后删除 3 个单词。

数字前缀的关键在于你要搞清楚它修饰的到底是"操作符重复次数"还是"动作范围"。5dd是上下文无关的——它就是删5行,光标在哪就从哪开始;而d5G则是"删到第5行为止",是一个明确的行号范围。理解了这两类数字的不同语义,你在执行删除的时候就会非常清楚自己到底在删什么,而不是凭感觉按数字。

2. 按行号与范围删除:处理"我明确知道要删哪些行"的场景

第一种最刚需的场景,是你已经通过某种方式知道了目标行的位置——可能是报错信息告诉你的行号,也可能你扫一眼就知道这一段代码是多余的。这时候直接用行号和范围删除,效率最高。

2.1 绝对行号:用:起点,终点d做精确打击

如果你知道要删除的起始行和结束行,最简单可靠的方式就是行号范围模式。在命令模式下输入:

:3,8d

意思很直白:把第 3 行到第 8 行全部删除。这个命令适合所有情况,尤其是在文件有明确的行号依据时,比如编译器报错、日志定位、别人告诉你"把 120 到 130 行删了"。

这里有个小细节值得注意:执行:3,8d之后,光标会落在原本第 9 行的位置,而不是被删除区域之前。这个行为对连续做多次范围删除非常重要——如果你先删了3,8,又想删原来的10,12,那现在就不能直接输:10,12d了,因为行号已经整体上移了。你在执行完第一次删除后,应该先重新确认目标行号,或者改用相对当前行的删除方式(下面会讲)。

还有一个扩展用法,就是用0和$作为边界。比如:0,$d是清空整个文件,不过我一般不建议直接用这个,因为一旦清空还没法撤销(下面有一节专门讲撤销问题)。

2.2 相对偏移:用:.+3,.+8d处理"光标附近的区域"

很多时候你知道要删的内容就在光标附近,但具体行号需要数一下。这种场景更适合相对地址。Vim 中.代表当前光标所在行,你可以用.+n表示当前行往下 n 行。

:.,.+5d

这个命令的意思是:删除从当前行开始,一直到当前行往下 5 行的范围,也就是一次删掉 6 行。相比绝对行号,它的优势是位置漂移免疫——哪怕文件之前被删过、行号已经变了,只要你的光标还停在目标区域附近,用相对偏移就永远不出错。

再举个例子,我经常要删掉当前行到文件末尾的所有内容,用:.,$d,或者用更快的普通模式命令dG(d表示删除,G表示跳到文件末尾,组合起来就是"从当前行删到末尾")。同理dgg是删到文件开头。这类组合命令的核心思路是:把 d 看成一个操作符,把行跳转看成它作用的容器。

2.3 可视行模式:删之前先看一眼

如果你对要删的行范围不是百分之百确定,或者你想在删除前有一个确认动作,我强烈推荐可视行模式。在普通模式下按下Shift + V(也就是V),会进入按行选择的可视模式,此时按j或k上下移动,就能逐行扩展高亮选区。选中完成后按d即可删除。

这个方式虽然比命令慢一点,但它有一个不可替代的价值——高亮选区给了你一个视觉确认的机会。你在代码上上下下一扫,立刻就能发现选区边界对不对,避免删掉不该删的内容。特别是在处理缩进敏感的代码(比如 Python、YAML)时,可视模式能精确控制到每一行,还能看到缩进层级,误删率比纯命令低很多。

3. 用全局替换思路做"连带删除":解决多处相同模式的行

如果说行号和可视模式解决的是"已知位置"的删除,那么现实中更多情况是:我知道要删哪些行,但它们在文件里到处都是,手动查找太慢。这时候就要用 Vim 的全局命令大杀器了。

3.1:g/pattern/d:一行命令删掉所有匹配行

:g是 Vim 的全局命令,它的完整语法是:

:[范围]g/模式/命令

含义可以翻译成:"在指定范围内(默认是全文),找到所有匹配模式的行,然后对这些行执行命令"。配合删除命令d,就是最经典的多行删除写法:

:g/^\s*#/d

这条命令会删除所有以任意空格(\s*)开头的注释行(#开头的行)。我平时用这个技巧的频率非常高,比如清理配置文件里的注释、去掉日志文件里的 DEBUG 输出、删除代码中所有 TODO 注释等等。一次处理几百行完全不是问题。

这里有几个非常实用的变体:

  • :g/foo/d删除所有包含foo字符串的行;
  • :g/^$/d删除所有空行(^$匹配"开头紧接着结尾",也就是空行);
  • :g/pattern1\|pattern2/d删除匹配多个模式之一的行,注意\|是 Vim 正则里的"或"。

3.2 反向思维::v/pattern/d保留匹配行,删掉其他所有行

全局命令还有一个反向兄弟:v,意思是"不匹配的行"。:v/pattern/d的语义是:删除所有不含某种模式的行。这个反向操作在某些场景下反而更直接。比如你有一个数据文件,里面既有有效记录又有大量日志噪声,你想只保留带ERROR关键词的行,那直接:

:v/ERROR/d

这样除了包含ERROR的行保留以外,其他全部删除。相比先思考"哪些模式需要删",反向操作很多时候更省脑力——你只需要描述"留下什么",剩下的交给 Vim 删干净。

这个思路在写临时分析脚本时尤其有用。我以前处理过一份几千行的服务器访问日志,要快速提取所有成功的请求行,用:v/200/d一行就清掉了所有非 200 状态码的行。接下来的操作全都基于这个过滤后的缓存文件进行,效率和准确率都高得多。

3.3 全局命令的边界控制:范围参数值得多用

很多人不知道,:g命令前面是可以加范围的。它并不是只能作用于全文。比如:

:10,100g/DEBUG/d

这条命令只在第 10 行到第 100 行之间查找包含DEBUG的行并删除,超出这个范围一律不管。配合相对范围也行:

:.,.+50g/^\s*log\./d

从当前行往下 50 行内删除所有以log.开头的行。这个能力在"只想清理某个函数内部代码"时非常有价值,因为你可以先跳到目标函数,然后用.当前行加相对范围圈定清理区域,避免误伤文件其他部分的同类模式。

4. 宏录制批量删除:让重复性操作自己跑完

前一把刀是"模式匹配",它处理的是"内容格式相同"的删除。但现实还有一种情况:要被删掉的东西格式各不相同,但删除动作有规律——比如"删掉当前行,再跳到下一个}"、"删掉当前行并合并到上一行"、或者"删除 5 行后移到下一段的开头"。这种结构性重复,用宏录制来处理是最顺手的。

4.1 宏的基本姿势:录一次,用一万次

宏录制的流程非常简单,核心是三个步骤:

  1. 在普通模式下按q加一个寄存器字母(比如qa),开始录制;
  2. 执行你要重复的一连串操作(可以是任意命令组合,比如dd、j、/pattern等);
  3. 再次按q结束录制。

之后你只要按@a,就会回放刚才录制的整段操作。如果你在前面加计数,比如100@a,就会连播 100 次。这时候你可以去泡杯茶,Vim 会麻利地处理完剩下的所有重复操作。

我举个实际例子:假设一个 JSON 文件里每一行前面都有一行格式无关的元数据注释,而你现在需要删掉所有注释行。如果注释内容不规律,没法用一步正则搞定,你就可以录制一个宏:0跳到行首,dd删掉注释行,然后j移到下一行,q结束录制。最后看文件行数,直接500@a一次性清完。

4.2 宏的"终止条件"设计:让重复自动停下

宏录制最容易忽视的一点是结束条件。很多人录完宏一执行,发现它把不该删的东西也删了,或者一直滚到了文件末尾还在继续重复操作。这里面有两个关键技巧:

第一,宏里最好包含一个"查找动作"。比如每次循环末尾都用/pattern跳到下一个目标位置,这样当找不到匹配时,Vim 会报错并自动停止宏的回放。否则你单纯用j移动,宏就会一路执行到文件末尾才停下,中间每行都被执行了一遍,极容易误删。

第二,宏里的动作要保证光标位置一致。录制宏时,如果你在执行过程中使用了j、w这类相对位移,回放到不同行时,由于行长度不一样,光标落点可能不一致,后续命令的执行结果就会跑偏。所以我在录制宏时,倾向于每一轮操作都以0(跳到行首)或^(跳到行首非空白字符)开始,以j或查找跳转结束,保证每轮循环的光标初始状态相同。

4.3 宏录制中的隐藏坑:寄存器与批量回放的问题

宏录制的隐藏坑主要在两个方面。一个是寄存器污染问题——你录制宏用的寄存器,和你删除操作用的寄存器会冲突。比如你录宏的时候执行过dd,那宏体里其实隐含了"把删除内容存入无名寄存器"这一步。回放多次之后,无名寄存器被反复覆盖,如果后续还要用p粘贴,内容早就变了。所以录制涉及删除的宏时,建议在宏体内用"_dd(删除到黑洞寄存器,不污染无名寄存器),这样宏整体对寄存器的副作用最小。

另一个坑是批量回放时的"失控感"。100@a虽然能一次跑完,但如果执行到一半你意识到录制内容有误,想中途停掉,按Ctrl + C可以打断宏回放,但这个中断时机可能刚好停在一次操作的中间,文件已经处于一个混乱的中间状态。我的经验是:宏第一次执行前,先:w存个盘;执行完以后立刻检查几行关键位置,确认无误再继续大批量执行。如果发现问题,还能u撤销回来,不至于几百行一次性毁掉。

5. 操作符 + 文本对象:不靠行号,按语义结构删除

如果说前面的方法都是"按行处理",那这一节讲的组合,是更符合程序员直觉的"按语义处理"。Vim 的操作符和文本对象机制,允许你直接对"一对引号里的内容""一个函数体""一个标签之间的文字"执行删除,完全不需要知道内容在哪一行。

5.1 核心机制:d+ 文本对象

Vim 定义了一套文本对象(text objects),常见的有:

  • w单词;
  • s句子;
  • p段落;
  • (或)一对小括号之间的内容;
  • [或]一对中括号之间的内容;
  • {或}一对花括号之间的内容;
  • "一对双引号之间的内容;
  • '一对单引号之间的内容;
  • `一对反引号之间的内容;
  • tXML/HTML 标签之间的内容。

操作符加文本对象的搭配规则是:操作符(比如d)+ 文本对象。最常见的形式是di(、da(、dip、dit等。i表示 inside(内部),a表示 around(包含配对符或周围内容)。

举个例子:

di(

把光标放在一对小括号内的任意位置,按di(,就可以直接删掉括号内的全部内容,但保留括号本体。如果你连括号也想一起删掉,那就用da(或者da)。同理:

di"

删除光标所在位置的双引号内的全部内容;dit删除光标所在 HTML 标签内部的文字,保留标签外壳。这套东西和行号完全无关,你的光标只需要落在那个结构里,Vim 会自动识别配对关系,非常省心。

5.2 结构化语言中的删除利器:函数体、代码块一次清空

对于写过几天代码的人来说,最常用的组合就是di{和da{。比如你在一个函数体内部的某一行,想要清空整个函数体,直接:

di{

光标不用移动,Vim 会自动向上找到函数体的左花括号,删除其内部所有代码。如果你想连函数体的花括号一起删掉,就按da{。这些操作在处理大段重构时极其高效——你不需要用%去匹配括号,也不需要先数行数,只需要记住"光标在这些括号里面"就足够了。

再配合gU、gu(大小写转换)、y(复制)等操作符,这套机制可以扩展出非常多的组合。本质上,你在 Vim 里要养成的思维是:操作的目标不应该是一行一行数出来的范围,而应该是代码本身的语义单元。当你写di(时,你表达的是"删掉这对括号的语义内容",而不是"删掉 3 到 15 行"。

5.3 配对对象删除时容易混淆的i和a

很多 Vim 用户会在这里卡住:di(和da(到底有什么区别?简单记住一句话:i是保留外壳删内容,a是连同外壳一起删。你可以把i理解成"里面"(inside),a理解成"周围"(around)。

实际使用中的建议是:如果目标是清空一个结构、保留占位符,用di;如果目标是彻底移除这个结构,用da。用di(清空函数的参数列表(保留括号),用da(删除整个参数列表(包括括号),语义区别一目了然。比如你在写一个函数调用,发现参数全部写错了想重写,di(正好清空参数区的所有内容,光标还会停在括号之间,你可以直接输入新的参数。这个操作流程比先选中再删除再重新进入插入模式,要快上一个数量级。

6. 构建一个"快速删除"的肌肉记忆:常用快捷键速查与效率排序

讲了那么多机制和原理,最终要落到日常操作上。我从实际使用中总结了一套效率排序,按场景优先级排列,对照自己平时最常用的删除需求,能帮你快速形成肌肉记忆。

6.1 按场景分类的快捷命令速查

场景推荐命令说明
删除当前行dd最简单,最常用
删除连续 N 行Ndd(如5dd)数字前缀,直接
删除当前行到文件末尾dG适合清空后半部分
删除当前行到文件开头dgg适合删除文件头部
删除指定范围:起点,终点d明确行号时用
删除光标附近一定范围:.,.+Nd相对偏移,安全
删除所有匹配模式的行:g/pattern/d大扫除
删除所有不匹配模式的行:v/pattern/d只保留目标
删除花括号内全部di{函数体快速清空
删除花括号连同所有内容da{连外壳一起删
删除引号内全部di"修改字符串值
删除空行:g/^$/d格式化常用
删除注释行:g/^\s*#/dPython/Shell 文件常用

6.2 效率排序的底层逻辑

这个排序的核心逻辑是:能用语义解决的就不数行,能用范围解决的就别用可视模式,能用全局命令的别手动选中。比如你要清空某个函数体,di{永远比你切到可视模式选择 30 行再删快得多;你要清理一个文件的所有注释,g/^\s*#/d永远比手动一屏一屏删快得多。

反过来,如果你的光标定位不准确、对文件结构不熟悉,那优先用可视化确认或者范围命令,避免搞错。高效的基础不是手速快,而是每次操作前都能快速判断"用哪把刀最准"。

7. 我踩过的坑:这些操作比想象中更容易翻车

技巧讲完,该聊聊事故了。Vim 多行删除看着简单,实际使用中的翻车案例我见得太多了。下面几个坑是我自己踩过或者帮别人排查过的高频问题。

7.1 撤销失灵::g/pattern/d之后按u却回不去

很多人执行:g/pattern/d删了一大堆行之后,发现按u撤销竟然没用,文件被"永久"删改。这其实是对 Vim 命令历史的误解。u撤销的是"普通模式下的修改",而:g/这类 Ex 命令的执行,有些情况下会被当作一次操作,有些情况则不一定能完整撤销(取决于你执行了几次、有没有触发某些插件行为)。

我的经验是:执行任何批量删除(:g、:v、宏批量回放)之前,先留下退路。最简单的方式是执行前按:w存一次盘,万一删错了直接:e!重新加载文件。另外一个更稳妥的习惯是用:earlier 10m——这条命令可以把整个缓冲区恢复到 10 分钟之前的状态,比u的普通撤销粒度大得多,适合批量危险操作后的整体回滚。

7.2 宏回放的"光标漂移"导致误删

宏执行到后面越来越乱,最常见的原因是录制时用了j或w这类相对位移,导致第二次播放在不同长度的行上光标落点不一致,后续命令就全乱了。我的规避方案已经提过:每轮循环都以0或^开始,让光标回到一个确定的位置;循环末尾用查找命令跳到下一处目标。另外,如果录制内容里包含$(行尾),在长短不一的文本里也非常容易导致光标漂移,能尽量避免就尽量避免。

7.3 可视模式的误选:默认包含行尾换行符

可视行模式(Shift+V)选中内容后按d,删除的是一整行连同换行符。这个行为的后果是:你删除后,下一行会朝上顶回来,有时候视觉上看起来像只删了半行,实际已经删掉整个逻辑行。另一种误操作是,你用v(按字符选择)精确选中了一段但包住了一个换行符,删出来的结果可能把两行合并成一行。遇到这种情况,我的建议是先观察被删位置的前后行内容,如果发现意外合并,立刻u撤销,再进入可视模式重新选精确范围。

7.4 大文件批量删除的"卡顿假象"

还有一个不能忽视的坑是:对超大文件执行:g/pattern/d或宏批量删除时,Vim 可能会短暂卡顿。这是因为全局命令需要对每一行做正则匹配,在几万行的文件里,这个开销确实不低。我处理过一份 10 万行的日志文件,执行:g/ERROR/vim的某个变体时界面直接假死几秒,但文件其实还在处理,只是 UI 暂时无响应。遇到这种情况,千万不要狂按键盘,给它几秒钟,等命令执行完毕。如果你需要频繁在大文件里做这种过滤,可以考虑先用sed在外部处理再重新载入文件(:%!sed '/pattern/d'),把重活交给流编辑器,速度和稳定性都好很多。

8. 综合实战:用多种技巧组合完成一次代码清理

技巧讲得再多,不如一个完整场景串联起来。下面我模拟一个非常常见的需求,带你把前面几种方法组合使用一遍。

8.1 任务描述:清理一个"历史遗留"的 Python 文件

假设我现在打开了一个 Python 文件,它长这样(简化示意):

import os import sys # TODO: remove this DEBUG_FLAG = True def main(): # 调试输出 print("start init") data = load_data() # 临时处理 data.clean() if DEBUG_FLAG: print("data loaded:", len(data)) # 输出最终结果 print("done") return data # old helper, not used anymore def old_helper_1(): pass # old helper, not used anymore def old_helper_2(): pass def load_data(): ...

我的目标是:

  1. 删除所有#注释行;
  2. 删除DEBUG_FLAG相关定义和条件删除;
  3. 删除两个不再使用的old_helper函数;
  4. 保留其他所有代码。

8.2 实操步骤拆解

第一步:删除所有注释行。

这个文件不大,我可以直接用力删掉所有注释行:

:g/^\s*#/d

这一步会把四行#开头的注释全部删除,文件立刻清爽很多。

第二步:删除DEBUG_FLAG相关内容。

这里有两种删除方式。如果DEBUG_FLAG的定义那两行明确,我可以直接用:g/DEBUG_FLAG/d删除所有包含这个标识的行。由于这个标识在定义和if DEBUG_FLAG:中都出现,一行命令就能把两个相关行一起干掉,不用手动定位和分步删除。

:g/DEBUG_FLAG/d

第三步:删除整个old_helper_1函数。

这两个函数体内部有代码(示意中用pass占位),如果只删除函数名那一行,pass就会残留。所以正确的方式是使用文本对象删除:

把光标移到old_helper_1的def行内部,然后执行:

da{

这会连同函数体一起删掉。同样处理old_helper_2。如果函数体很大,da{的效率远高于一行行删除。

第四步:清理可能的空行。

经过删除后,原先注释行所在的位置可能留下空白行,直接删掉所有空行:

:g/^$/d

最终文件里的核心结构就干净了。

8.3 从组合使用中提炼的实操经验

这个例子看起来很常规,但它正好串联了:g模式删除、文本对象删除、空行清理三类技巧。我的经验是:清理一个杂乱文件时,先用全局模式做"面"上的过滤,再用文本对象做"点"上的深挖,最后补一次空行清理做收尾。这个顺序能最大程度减少手动定位次数,也避免你在"面"和"点"之间反复横跳。

类似地,如果你要处理的是一个重要文件,记得在开始组合删除前先:w temp_copy存一个副本。清理完确认无误后再把副本删掉。这套"先留后手再动手"的习惯,救过我很多次。

写在最后的一点个人建议

关于 Vim 的多行删除,工具本身并不复杂,真正难得的其实是形成一种"删除思维":先判断你要删的东西是模式、是结构、是范围还是无规律的重复,再决定用哪一把刀。大多数人在 Vim 上效率提不上去,不是命令背少了,而是不管什么场景都在用同一招。

如果你今天只记住一件事,那就记住:g/pattern/d和di{这两个组合。一个解决所有重复模式行的清理,一个解决所有结构体的清空,覆盖了我日常 60% 以上的多行删除需求。等你把这两个用熟了,再回头看dd连按这种操作,自然就会觉得笨重了。

最后分享一个我自己的小技巧:如果你不确定某个删除命令的行为,先在文件末尾一行空行上试一下,或者用:set nohlsearch关掉高亮之后,用:%s/.*//这类无害命令做实验。Vim 的容错机制并不算强,但只要你习惯"小步快跑、频繁保存、留好备份",它就是你手上最趁手的编辑器,多行删除这关过了,剩下的 Vim 使用体验会顺非常多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 11:04:36

Intel GPA 图形性能分析:从 GPU 瓶颈到 draw call 优化

调图形性能这件事,最怕的不是没工具,是工具甩给你一屏计数器,你却不知道该盯哪一个。Intel GPA(Graphics Performance Analyzers)这套工具的价值,就是把"我感觉有点卡"翻译成"第 137 号 dra…

作者头像 李华
网站建设 2026/10/1 11:01:52

WSL2 Ubuntu 24.04 SSH远程登录完整配置指南

近几年 Windows 上做开发绕不开 WSL2,尤其是 Ubuntu 24.04 更新之后,很多朋友把编译工具链、数据库、Python 环境都塞进了 WSL2 里。但不少人折腾完系统,到了“远程登录”这一步就卡住了——SSH 要么连不上、要么只能在本机敲命令、要么每次重…

作者头像 李华
网站建设 2026/10/1 11:01:39

基于协同过滤的音乐推荐系统:Python+Pandas实现ItemCF完整指南

简介:一套基于协同过滤算法的音乐推荐系统毕设项目,面向计算机科学与软件工程等相关专业正在准备毕业设计的学生,也可供需要练手完整Web开发实战的学习者使用。系统以后端Python为核心,结合Vue前端,实现用户行为采集、…

作者头像 李华
网站建设 2026/10/1 11:01:31

LLM正式环境部署全景:从单模型服务到推理平台

1. 这不是“部署个模型”那么简单:为什么你总在正式环境里反复踩坑 “正式环境模型部署框架全景:从单模型服务到 LLM 推理平台”——这个标题里没有一个词是虚的。它不讲概念,不画饼,不谈“未来已来”,只说一件事&…

作者头像 李华
网站建设 2026/10/1 11:00:58

哈希表从理论到实战:数组、Set与字典的O(1)查找技巧

1. 哈希表理论基础 1.1 哈希表到底是什么 先别被“哈希表”这个名字唬住,它其实就是一个“用空间换时间”的经典数据结构。你可以把它想象成一个带编号的储物柜:每个柜子有一个编号(索引),你存东西的时候根据编号直接…

作者头像 李华
网站建设 2026/10/1 10:59:58

Spring Boot美妆购物交流平台全流程实战:设计实现与部署

最近刚把一个基于 Spring Boot 的美妆产品购物交流平台完整走通,从需求拆解、库表设计、核心功能实现到打包部署,整个过程踩了不少坑,也积累了一些很实在的经验。这个项目很有意思的点在于它不是一个单纯的商城,而是把“购物”和“…

作者头像 李华