尧图精选

vim模式化编辑器详解:从查找与替换到sudo配置实战

🕒 发布时间:2026/10/2 17:18:42 📁 来源:尧图网络
1. 别被怎么退出vim劝退先看懂它的模式设计打开终端输入vim在键盘上敲了几个字母发现全被当成命令执行了想退出还退不出去只能按CtrlC碰运气——这是几乎所有vim新手的第一段经历。怎么退出vim已经是程序员圈子里经久不衰的梗了但说实话这个梗背后恰好点中了vim最核心、也最被误解的设计它是一个模式化编辑器不是一个打字机。你以前用的记事本、VS Code默认状态、网页里的输入框都属于无模式编辑器光标在哪键盘敲什么就输入什么。vim不一样它把你和文本的交互拆成了几个明确的阶段——移动、选择、修改、输入、执行命令——每个阶段对应一种模式。这个设计在1976年就有了vi的祖先ed/ex到了今天依然没被淘汰说明它的底层逻辑是成立的人操作文本时大多数时间并不是在输入新内容而是在移动、查找、删除、重构已有内容。1.1 vim的三类核心模式正常模式、插入模式、命令行模式vim里最常见的三种模式我建议你按频率而不是按说明书的顺序来理解正常模式Normal mode打开vim后默认就在这个模式。此时键盘上几乎所有按键都是命令不是字符。比如j是向下移动一行x是删除光标处的字符dd是删除整行。刚接触时最别扭的就是这一点但这也是vim效率的根源——你的手不需要离开键盘去找鼠标也不需要用CtrlShift方向键去选中文本因为移动、选择、修改都是单键或短组合键。插入模式Insert mode这个模式才负责真正往文件里打字和普通编辑器的行为一致。从正常模式按i进入按Esc回到正常模式。没有第二个需要记的退出方式Esc就是唯一出口。命令行模式Command-line mode按:进入底部会出现一个输入框用来执行保存、退出、查找替换、设置参数等编辑器级的命令。比如:wq表示保存并退出:%s/foo/bar/g表示全局替换。也可以按/进入查找输入按?反向查找它们同样是命令行模式的变体。顺便提一下第四种——可视模式Visual mode。按v进入字符选择按V进入行选择按Ctrlv进入块选择。它在批量操作时极其有用后面我会单独讲到。1.2 模式切换的按键逻辑与学习顺序模式切换的按键本身不多难的是在初期形成条件反射。先把这张表吃透当前模式目标模式按键说明正常模式插入模式i在光标前插入正常模式插入模式a在光标后追加正常模式插入模式o下方新建一行并进入插入正常模式插入模式O上方新建一行并进入插入插入/可视/命令行正常模式Esc万能出口正常模式命令行模式:执行Ex命令正常模式命令行模式/正向查找正常模式命令行模式?反向查找正常模式可视模式v/V/Ctrlv三种选择范围我给新手的建议是第一周只练三个操作i进入插入、Esc返回、:wq保存退出。不要一上来就背几十个命令那样只会让人崩溃。先把进去打字、打完退出、保存文件这条主链路走顺再逐步加入移动和删除命令。1.3 从打字到操作文字的思维转变我见过太多人学vim失败核心原因不是记不住命令而是思维方式没转过来。在普通编辑器里你想删掉一句话得先拖动鼠标选中再按退格或删除键在vim里你只需要把光标移到那句话的某个位置然后告诉vim删除到句尾——按d$或者更直接地说删掉这一整段——按dapdelete around paragraph。这里的思维转变是不是在键盘上模拟鼠标操作而是直接把意图告诉编辑器。普通编辑器的逻辑是你负责具体操作我负责执行vim的逻辑是你说出目标我来完成路径。打个比方无模式编辑器像手写一封信每个字都要亲手落笔vim像口述一封信你只需要描述内容笔和纸由对方代劳。想通这一点后你会发现vim其实没有变难只是变快了。接下来的几个章节我会沿着移动→编辑→查找替换→拓展这条主线把真正高频的命令逐个拆开讲清楚。2. 普通模式的命令操作移动、删除、修改的原子命令普通模式是vim最强大的地方绝大多数效率提升都来自这里。但它的命令不是孤立记忆的而是有一套动词对象的组合语法。学会这套语法比背一百个快捷键有用得多。2.1 光标移动从逐字符到逐段落先把最基本的移动命令说清楚。方向键在vim里能用但效率很低因为你的右手要在字母区和方向键之间来回切换。vim的默认方向键是h左、j下、k上、l右一开始不习惯但熟练后手指完全不用离开主键区。移动命令分几个等级字符级h左、l右、0跳行首、$跳行尾词级w跳到下一个单词开头b跳回上一个单词开头e跳到当前词尾。这里的词默认指由字母数字下划线组成的连续串想按由空格分隔的词移动就按W、B、E行级gg跳文件首行G跳文件末行行号G跳到指定行段落级{向上跳一个空行分隔的段落}向下跳匹配级%在成对的括号之间跳转写代码时查配对括号极好用移动命令最容易被忽略的是数字前缀。任何移动命令前面都可以加数字表示重复执行多少次。3j向下移动3行5w跳5个词2gg跳到第2行。数字前缀不只能用在移动上也能用在所有编辑命令上这是vim命令体系最精妙的地方。2.2 删除、复制、粘贴d、y、p的组合规则vim里最核心的三个编辑命令是d删除、y复制yank、p粘贴。它们遵循统一的语法操作命令范围比如dw删除一个词d$删除到行尾d0删除到行首dd删除整行dG删除从光标到文件末尾的全部内容。同理yw复制一个词yy复制整行y$复制到行尾。把这些命令和移动命令放在一起看你会发现它们用的是同一套对象词——w代表单词、$代表行尾、gg代表文件头。这就是vim语法统一性的体现你不需要为删除和移动分别记两套概念只要记住对象词所有操作命令都能直接用。粘贴时注意普通模式按p在光标之后粘贴按P在光标之前粘贴。如果你刚dd删了一行按p会把那行粘贴到当前行下面这个操作在移动某行到别处的场景里特别好用先dd剪切再移动到目标位置按p。这里有一个新手常踩的坑删除即剪切。在vim里d删除的内容和y复制的内容一样都会进入默认寄存器p都能粘贴出来。所以dd之后如果你突然反悔别慌光标移到想要的位置按p就能把内容救回来。2.3 用数字参数和.命令放大操作效率如果说移动和编辑命令是vim的原子操作那么重复就是把这些原子操作放大成核弹的催化剂。.命令是vim里最被低估的一个它会在当前光标位置重复上一次修改操作。这里的修改操作指什么指的是从进入插入模式到按Esc退出之间做过的所有事情。举个例子你想把文章里所有foo改成foo bar在第一次修改完后只需要不断用n跳到下一个目标按.就会自动重复刚才的替换动作。配合数字前缀批量操作更夸张。比如你要连续删除5行不需要按5次dd直接5dd即可。你想把一段文字缩进4次选中后按4就完成了。我自己的习惯是任何超过两次的重复操作都会停下来想一下能不能用.或数字前缀解决。这个习惯练出来之后编辑速度的提升几乎是立竿见影的。2.4 宏录制与批处理宏Macro是vim批量处理的进阶玩法。按q加任意字母比如a开始录制此时底部状态栏会显示recording之后你的所有操作都会被记录下来再按q结束录制。回放时按a重复回放按100a。举个真实场景我有一个几百行的日志文件每行格式是时间-级别-消息我想把每行的级别字段提取出来拼成列表。手动处理几百次肯定不现实录一个宏就解决了qa开始录制到寄存器a按^跳行首按f-找到第一个-按dt-删除到第一个-前的所有内容按0跳行首按x删掉多余字符按j跳到下一行q结束录制999a批量回放直到处理完所有行宏录制的核心技巧是结尾必须让光标停在下一次操作开始的位置通常是下一行行首这样回放才能无缝衔接。录制前先在单独一行上手动测试一遍确认没问题了再批量回放可以避免把错误操作重复几百次。3. 插入模式与命令行模式vim查找字符串和批量替换的完整用法很多vim教程把重点放在普通模式上但实际使用中插入模式的选择和命令行模式的查找替换才是你每天都会用到的功能。尤其是vim 查找字符串这个需求几乎是每个新手都会搜的高频问题这一节我会把查找和替换讲透。3.1 插入模式进入方式与适用场景插入模式不只是按i进入那么简单vim给了好几种定位后直接输入的方式认真理解它们的区别能让你的光标操作少一半i在光标前插入a在光标后插入I在行首插入A在行尾插入o在下方新建一行并进入插入O在上方新建一行并进入插入s删除光标所在字符并进入插入等价于xicc删除整行并进入插入等价于ddicw删除光标到词尾的内容并进入插入我特别想强调cw这个命令——修改一个词是vim里最高频的操作之一。以前你用鼠标双击选中单词再敲新内容现在只需要cw、输入、Esc三步而且整个过程手不用离开键盘中央区域。另外在插入模式下按Ctrlo可以临时执行一条普通模式命令再自动回到插入模式。比如按Ctrlo再按zz把当前行居中瞬间切换一下视野而不用离开插入状态这个细节很多用了几年vim的人都不知道。3.2 查找字符串/、?、n、N的配合查找是vim最常用的命令行模式功能。在正常模式按/输入要查的字符串回车后vim会高亮所有匹配项光标自动跳到第一个匹配位置。基础用法很直白但有几个细节决定你查得爽不爽n跳向下一个匹配N跳向上一个匹配?是反向查找输入同样的字符串会从当前位置往前找查找时支持正则表达式。/foo\|bar匹配foo或bar/^vim匹配行首是vim的行/vim$匹配行尾是vim的行按*可以直接查找光标下的单词光标在哪个词上按*vim自动精确匹配这个词按#反向查找——这个快捷键在阅读代码时特别实用比手动输入快多了查找高亮会一直留在屏幕上想取消就用:nohlsearch或者更优雅的做法是在配置文件里加上nnoremap Esc :nohlsearchCR让按Esc时自动取消高亮。还有一个容易被忽略的查找技巧在输入查找关键词时按Ctrlr加寄存器字母可以把寄存器内容插入查找框。比如你先用yiw把某个词复制到寄存器然后按/再按Ctrlr加0这个词就直接出现在查找框里了。在代码里查找一个超长的变量名时这个功能能救命。3.3 查找与替换substitute命令从单次到全局如果说查找是定位替换就是修改。vim的替换命令格式如下:[范围]s/目标/替换/[标志]很多人第一次看到这个驼峰式的s/.../.../就懵了其实拆开很清晰范围不写就只替换当前行的第一处匹配%代表全文1,10代表第1到第10行.,$代表当前行到文件末尾标志g代表全局替换一行内所有匹配c代表每次替换前询问确认i代表忽略大小写最常见的组合是:%s/foo/bar/g——全文把foo替换成bar不确认。如果你害怕替换错就改成:%s/foo/bar/gcvim会逐个询问是否替换这一处y确认、n跳过、q退出非常稳妥。还有一个进阶技巧替换时使用\1、\2引用分组。比如你想把张三和李四改成李四和张三可以先按v选中那段文字然后执行:,s/\(张三\)和\(李四\)/\2和\1/,是可视模式选区的范围标记vim会自动帮你填好\(...\)是分组\1是第一个分组。这种带分组的替换在重构代码、调整语序时特别有用值得专门练一次。3.4 命令行模式的其他高频命令除了查找替换命令行模式里还有几个命令我几乎每天用:w保存、:q退出、:wq保存退出、:q!强制退出不保存:e重新加载文件如果你在vim外面改了文件:set number显示行号:set nu是简写:!ls执行外部shell命令比如在vim里直接:!ls查看当前目录:r !date把外部命令的输出插入当前位置在写日志、备注时插入当前时间超好用:noh取消搜索高亮记住一条安全原则凡是带!的命令都要谨慎。:q!和:w!是vim明确告诉你我要无视警告强制操作尤其是:q!会丢弃未保存的修改按下去之前想清楚。4. 拓展用法配置文件、插件管理与跨工具协同学会了核心命令vim已经能用了。但让vim真正顺手的是围绕着它建立的个人配置和工具链。这一段我讲讲vimrc配置、插件管理和vim与系统其他工具的协同篇幅控制在不搞过度折腾的范围内。4.1 用vimrc把vim调成自己的手感vim的配置文件叫vimrc在用户主目录下~/.vimrc。所有你觉得默认行为不合理的地方都可以在这里改。我给你看我个人配置里最核心的几行每一行都解释为什么set number 显示行号 set relativenumber 相对行号配合数字前缀移动命令好用 set ignorecase 查找时忽略大小写 set smartcase 但如果搜索词里含大写字母则区分大小写 set incsearch 输入搜索词时实时高亮 set hlsearch 搜索结果高亮 set expandtab Tab转换为空格 set shiftwidth4 缩进位数为4 set tabstop4 Tab显示宽度为4 set autoindent 自动缩进 set clipboardunnamed 让vim的复制粘贴使用系统剪贴板 set swapfile 启用swap文件防止断电丢数据 nnoremap Esc :nohlsearchCR 按Esc取消搜索高亮这里我要特别说明set clipboardunnamed这条。默认情况下vim的复制粘贴和系统剪贴板是隔离的你在vim里yy复制的内容在浏览器里粘贴不出来。加上这行配置后vim的寄存器直接映射到系统剪贴板和普通编辑器的复制粘贴行为一致。很多新手抱怨vim里复制的文字出来粘贴不了就是缺这一行。4.2 插件管理器的选择与常用插件vim的功能扩展靠插件。现在主流的插件管理器是vim-plug安装方式很简单curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim然后在vimrc里声明插件call plug#begin(~/.vim/plugged) Plug preservim/nerdtree 文件树 Plug vim-airline/vim-airline 状态栏美化 Plug junegunn/fzf.vim 模糊查找文件 call plug#end()保存后在vim里执行:PlugInstall就会安装。我给你推荐的这三个插件是新手幸福感提升最大的组合NERDTree帮你可视化浏览文件airline让底部状态栏显示模式、行列号、Git分支fzf让你按Ctrlp就能模糊匹配打开整个项目的文件。但我想提醒一句不要一开始就装一大堆插件。插件只是补充vim原生缺失的能力如果你连原生的移动和编辑命令都不熟插件装再多也提升不了效率反而增加依赖。先用原生的vim写一个月代码再按需添加插件这个顺序几乎不会错。4.3 vim和其他工具的协同场景vim不是一个孤立程序它经常要和系统命令、其他编辑器配合。sudo vim是热词榜上的高频需求。当你需要修改/etc/hosts这类系统文件时直接vim /etc/hosts会因为没有写权限而只能读不能存。这时有两种办法先sudo vim /etc/hosts用root身份直接打开编辑或者在已经用普通用户打开的vim里执行:w !sudo tee %用sudo tee把内容以root权限写回当前文件方法二可以避免频繁用root打开文件但我个人的经验是如果明确要改系统配置直接sudo vim打开更省事因为tee命令的管道写法比较容易记错。vim和Xcode / VS Code的协作也是一个热门话题。Xcode从13版本开始内置了Vim模式在Editor Editing Vim里打开VS Code则默认支持vim插件Vim插件装完即用。我的策略是日常写Swift或调试时用带Vim模式的Xcode在服务器上改配置、快速处理文本时用终端vim。两者并不冲突——vim是编辑习惯不是特定程序只要你熟练了i、Esc、dd、yy这些核心操作在IDE里一样能发挥出来。文件与目录命令的配合也值得一提。在vim里查看磁盘占用、当前目录文件不需要退出vim再敲df、du、ls直接在命令行模式执行:!df -h :!ls -la :!du -sh *执行完按任意键回到vim比来回切换终端窗口高效得多。把vim当作一个内嵌了shell的工作台你会发现它的边界比想象中大得多。5. 我在安装和使用中踩过的两个典型坑很多搜索热词都指向实际问题——package vim is not available和sudo vim这两个我都在真实环境中撞见过。分享一下排查过程比直接给答案更能帮你举一反三。5.1 系统提示package vim is not availablebut is referred to by another package这个报错我在一台Ubuntu服务器上碰到过。执行sudo apt install vim结果apt回了一句Package vim is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source很多人看到这串英文直接懵了以为vim装不上了。其实这句话的意思是apt的包索引里没有vim这个包的信息或者索引太久没更新了。最常见的解决办法是先更新索引再安装sudo apt update sudo apt install vim那次我执行完update后apt install vim就正常了。不过当时我发现update也没用查了一圈才确认是系统的软件源列表sources.list里指向的镜像源有问题。如果你也遇到update之后依然找不到包可以检查/etc/apt/sources.list和/etc/apt/sources.list.d/下的源配置换一个主流的镜像源再update一次问题基本能解决。还有一种情况是你用的发行版比较精简比如容器镜像、最小化安装的服务器系统里压根没配vim相关的包源。这时候用apt-cache search vim看一下可用的候选包名可能是vim-tiny或vim-nox而不是vim。5.2 用sudo vim打开系统文件时的几个注意事项sudo vim /etc/nginx/nginx.conf这种操作我在配服务器时几乎天天干。但也有几个坑我吃过亏提醒大家第一sudo下配置文件归属不同。如果你用sudo vim打开一个本来属于root的文件vim会以root身份创建swap文件.nginx.conf.swp。如果之前用普通用户编辑过同一个文件可能因为swap文件权限冲突出现Swap file already exists的报错。遇到这个提示先确认没有另一个vim进程在编辑同一文件确认没有后再按Ddelete删掉旧的swap文件或者加--noplugin之类的参数绕过。千万别在不明情况下一律按OOpen Read-Only或者EEdit anyway容易把内存中的脏数据写进系统关键文件。第二root的vimrc和普通用户的vimrc不一样。你用sudo vim打开文件时读取的是/root/.vimrc而不是~/.vimrc。如果你在普通用户下配置了set number、set expandtabsudo打开时全部失效表现就是vim突然变回原样。解决方式是单独给/root/.vimrc写一份基础配置或者接受sudo环境下就是干净的默认vim这个设定——我自己是后者因为root环境越干净越安全。第三记住分号沙盒。sudo vim之后如果想执行:!shell命令比如:!rm somefile请先想清楚这个命令是以什么权限执行的——以root权限。在系统关键目录里执行带!的shell命令之前我的习惯是先在脑子里默念一遍完整命令确认路径和参数没有拼错。5.3 从热词vim 查找字符串看真实使用场景一个完整操作演示vim 查找字符串这个搜索词为什么会火我猜测大部分人是出于这两个场景一是接手一段代码想快速定位某个函数或变量二是在日志文件里追踪某个错误关键字。我拿一个排查日志的场景串一遍完整流程假设有一个几百MB的app.log要找里面所有出现ERROR的行还要统计出现位置打开文件vim app.log大文件打开会比较慢vim会提示File is large按回车继续即可输入/ERROR回车vim跳到第一个匹配处并高亮所有匹配按n逐个往后跳N往回跳想看总共出现多少行执行:g/ERROR/vim会把所有包含ERROR的行在底部列出来如果想把所有ERROR行摘出来存到另一个文件执行:g/ERROR/w !grep -c ERROR或者更暴力一点:g/ERROR/yank A把所有匹配行复制到寄存器A再:new开一个新缓冲区按A p粘贴进去保存这个流程里:g/全局命令是比s/替换更常被忽略的宝藏。它能在所有匹配的行上执行任意命令比如:g/ERROR/d删除所有包含ERROR的行——日志清洗时这一条命令能顶半天的重复劳动。6. 学习vim的正确打开方式我的几条实操心得文章最后我不做什么总结就说几条我自己学vim、用vim多年的真实体会希望对正在入门的人有点帮助。第一别挑战一天速成vim。我见过太多人兴冲冲刷了一晚上命令清单第二天打开文件发现全忘光了。vim的学习曲线注定是先陡后缓的真正记住命令靠的是在真实工作里反复用。我自己的节奏是第一天只学移动和i、Esc、:wq第二周才敢用dd和yy一个月后开始录宏。每多记住一个命令就把它变成肌肉记忆而不是停留在我好像学过。第二修改命令永远比删除命令优先学。很多人第一个学的是dd删除行但实际写代码时cw修改词、ci修改引号内内容、ct.修改到某个字符前这些修改命令才真正高频。删除是破坏修改是创作vim的修改命令配合.重复键能让你重构代码的速度快到飞起。第三配置别抄一大份从三行开始。我见过直接把网上几百行的神器配置贴进vimrc的新手结果vim的行为变得自己完全看不懂最后只能全部删掉。正确的做法是set number、set expandtab、set clipboardunnamed三行起步用一周再加一行。配置vim的过程本质上也是理解vim里我到底在乎什么的过程。第四善用vimtutor。每个装有vim的系统基本都带这个交互式教程在终端输入vimtutor回车就能打开。它会手把手教你移动、删除、查找、替换全程30分钟新手跟着走一遍比看任何教程都实在。我自己隔几年都会重新过一遍每次都能发现一两个平时没用透的命令。vim不是什么神秘的工具它只是把一个朴素的理念做到了极致让编辑文本像说话一样直接。学习曲线是存在的但一旦跨过去你会发现它带来的效率提升是长期的、稳定的、不依赖任何IDE厂商的。希望你也能在折腾vim的过程里找到属于自己的那份顺手。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →