刚接触Linux的人,十有八九会在vim里卡住。图形编辑器里Ctrl+A全选、Ctrl+C复制、Ctrl+D删除,一套肌肉记忆带进终端,结果vim愣是没反应。这个场景我见过太多次:有人以为vim坏了,有人干脆放弃,还有人直接在终端里怒按Esc撞运气。今天这篇就把“vim全选、全部复制、全部删除”这三个最基础也最刚需的操作讲透——这三个操作看着简单,背后牵扯的却是vim最核心的模式概念、寄存器机制和范围语法。读完你会明白:vim里没有全选快捷键,但有比你想的更顺手的全选命令组合。这篇内容适合刚上手Linux、在vim里删东西复制东西不顺手的同学,也适合工作几年但一直靠方向键和退格键凑合的同事。
1. vim全选的底层逻辑:先弄懂模式和“选择”这件事
1.1 vim的三种模式:为什么Ctrl+A在vim里没反应
vim和记事本最大的不同,是它有多套“输入状态”。正常打开文件时你处在普通模式,这时候按什么键都不是往里打字,而是对文本发出命令。按i进入插入模式,才能像记事本一样敲字。按v或V进入可视化模式,这才是用来“选中文本”的地方。
很多新手犯的错,就是在插入模式里按Ctrl+A,结果完全没反应,或者更玄乎——你把光标前面的数字悄悄加了1。没错,vim里的Ctrl+A默认是“将光标前的数字加一”,不是全选。普通模式下按v进入字符可视模式,按V进入行可视模式,按Ctrl+V进入块状可视模式。全选这件事,本质是“从文件第一行选中到最后一行”,对应行可视模式。理解了这套逻辑,你就不会满世界去找“vim全选按钮”了——它根本不存在,有的只是命令组合。这也是Linux常用命令里,vim老是显得难学的真正原因:它不是一套菜单,而是一门语法。
1.2 全选命令是拼出来的:gg + V + G
vim给人“记不住”的感觉,因为它的命令不是孤立快捷键,而是像短语一样有词根。全选最简单的方式:普通模式下依次按gg、V、G。gg是跳到文件首行,V进入行可视模式并选中当前行,G跳到文件尾行——三步一组合,可视高亮区就从第一行覆盖到最后一行,也就是“全选”。
另一条全选思路是“范围选择”。vim的语法是“范围+命令”,%这个符号整体表示“整个文件”,所以许多操作可以直接用:%开头。比如:%d就是删除全部,:%s/foo/bar/g就是全文件替换。这两套思路建议都记住,后面会反复用到。很多网上流传的vim常用命令总结,往往直接甩一串快捷键,其实不如理解这层语法来得牢。你一旦明白“跳到哪、选什么、执行什么动作”的套路,哪怕忘了个别按键,也能自己拼出来。
2. 实操核心:全选、复制、删除、粘贴四组命令
2.1 全选:ggVG,以及如何确认自己全选成功
实操顺序是这样的:先按两下Esc,确保自己处于普通模式。接着依次按gg、V、G。屏幕左侧会出现一个从第一行一直高亮到最后一行的区域,这就代表全选成功。如果文件是空的,你会发现高亮只有一行,因为空文件本来就只有一行。
这里有几个细节值得留意。第一,大小写不能错:V是大写,G是大写,小写g只是滚屏。第二,如果在中文输入法状态下按这些键,vim可能根本收不到正确的字符,所以操作前先切到英文输入法。第三,按得太快也不是不行,有些人会麻利地连击ggVG,挺爽,但前提是你要清楚自己在按什么。我个人建议新手拆开按,按一步停一下,看清楚屏幕反馈,肌肉记忆留给后面那几百次实战。
2.2 全部复制:ggVGy、"+y 与寄存器概念
选中全部之后,按y复制。所以完整的全选复制命令是ggVG再加上y。这里的y是yank(抽出、复制)的意思。复制完按p粘贴到光标之后,按P粘贴到光标之前。这套操作在vim内部是畅通的。
但这里有一个经典大坑:默认情况下,y复制的内容放在vim内部的“未命名寄存器”里,只在vim进程内共享,不会自动进入系统剪贴板。所以你在vim里复制完,切到浏览器Ctrl+V,什么都没发生。想复制到系统剪贴板,就要用"+y:先输入英文双引号,再输入+,再按y。这个操作的意思是“把文本yank到加号寄存器”,而加号寄存器恰好对应系统剪贴板。完整写出来就是ggVG"+y,看着很长,念出来其实就一句:全选,复制到系统剪贴板。
vim的寄存器体系很像一排抽屉:默认的抽屉是未命名寄存器,还有0到9的数字寄存器(存最近删除和复制的历史),以及a到z的命名寄存器,还有+和*这两个跟外界交互的剪贴板通道。搞懂寄存器,你的复制粘贴水平会直接上一个档次。后面第3章我会专门讲系统剪贴板的问题。
2.3 全部删除:ggdG 和 :%d
全选再删除的操作是ggVG再按d,但更直接的做法是普通模式下输入ggdG。拆解一下:gg到首行,d是删除动作,G是“到文件末尾”。连起来就是把从当前行到末尾的所有内容删掉,因为当前行就是首行,所以效果等于删光全部内容。
另一种更通用的方式是:%d。冒号进入命令行模式,%d表示删除所有行。这两种方式有什么区别?直观感受是ggdG按键快,但:%d更符合“范围+命令”的语法习惯,也更方便扩展,比如:5,20d就是删除第5行到第20行。删除之后想反悔,按u撤销,一步就能恢复整份文件。如果你只想删除当前行,按dd就行;想删10行,按10dd。这些组合可以一句一句积累起来。
如果你手头有个文件要“整份清空但要保留空文件”,可以:%d然后:w保存,文件就变成一个空文件。注意,这里删的是文件内容,不是文件本身,文件还占着一个inode,这在后面讲文件删除时会再次提到。
2.4 粘贴、保存退出和撤销:操作闭环
复制和删除之后,通常要落地到文件里。:wq保存并退出,:wq!强制保存退出,ZZ也是保存退出但不用输冒号。误删了全文件,按u撤销;多按几次能一步步回滚。vim的撤销是“按操作记录”的,一个命令组合算一次操作,所以ggdG一个u就能整文件恢复。
很多新手老问“vim如何保存退出”,其实记住三件事就行:半路想退出但不保存,用:q!;保存退出用:wq;顺手保存用ZZ。打开文件一看什么都懂,关上文件又什么都忘,这是正常的,命令不是背的,是用出来的。我建议你新建一个测试文件,把第2章这几条命令从头到尾敲三遍,肌肉记忆基本就形成了。
下面这张速查表可以直接收藏:
| 功能 | 命令组合 | 说明 |
|---|---|---|
| 全选 | ggVG | 从第一行选中到最后一行 |
| 全选复制(vim内部) | ggVGy | 复制到未命名寄存器,只能vim内用 |
| 全选复制(系统剪贴板) | ggVG"+y | 依赖vim的clipboard支持 |
| 全部删除 | ggdG 或 :%d | 两种等价写法 |
| 粘贴 | p / P | p光标后,P光标前 |
| 保存退出 | :wq 或 ZZ | 保存并退出 |
| 强制退出不保存 | :q! | 放弃修改 |
| 撤销 | u | 撤销上一次操作 |
3. 系统剪贴板交互:为什么复制不进系统剪贴板
3.1 检查你的vim是否支持系统剪贴板
在终端输入vim --version | grep clipboard,看结果里是+clipboard还是-clipboard。如果是减号,说明当前vim编译时没带剪贴板支持,这时候你按"+y根本没反应,因为vim根本找不到系统剪贴板。很多Linux发行版默认装的vim-tiny就是这种情况。
解决办法是安装功能完整的vim。Debian/Ubuntu系列装vim-gtk3或者vim-nox,CentOS/RHEL系列装vim-enhanced,macOS自带vim一般也能用,但用MacVim体验更稳。装完再执行一次上面那条检查命令,看到+clipboard就放心了。这个知识点也可以归入“Linux常用命令大全”里的环境排查项:问题往往不是你不懂快捷键,而是软件包本身缺胳膊少腿。
3.2 让复制粘贴跨越应用边界:寄存器+和xclip
vim的寄存器体系里,+号寄存器对应系统剪贴板,*号寄存器在X11环境下常指鼠标中键的“主剪贴板”。想从vim复制到浏览器:进入可视模式选中内容后按"+y,回浏览器Ctrl+V。反过来,在浏览器里复制文本,回vim按"+p,粘贴完成。
Linux图形终端下还有更直接的招:选中内容后,在vim插入模式下按鼠标中键,直接粘贴当前选区。这是X11的primary selection机制,不经过系统剪贴板,很多老Linux用户靠这个“选中即复制、中键即粘贴”过活。如果你是纯SSH环境、没有图形界面,+寄存器可能也不顶用。这时一个可靠方案是:在vim里:%d以外的任何内容,只要想送出去,就可以用命令行的方式执行:w !xclip -selection clipboard,把整个文件内容送入xclip,再到图形端Ctrl+V。关于xclip的具体安装,不同发行版包管理器略有差异,这里不展开,但思路是通用的:vim负责文本,xclip负责和系统剪贴板打交道。
3.3 无权限删除场景:vim保存与系统文件权限
热搜词里有个“你需要来自administrators的权限才能删除”,Windows用户很熟,Linux下同样有类似的权限问题。比如在vim里打开系统文件/etc/nginx/nginx.conf,普通用户保存时很可能提示“E45: 'readonly' option is set”或者“Permission denied”。这不是vim坏了,而是你对这个文件只有读权限、没有写权限。
处理方式有几种。第一种是sudo vim直接打开文件编辑,保存时就有root权限;第二种是修改内容后:w!强制写入,但前提是当前进程有足够权限;第三种是调整文件权限,比如chmod、chown,但系统配置文件不建议乱改属主,用sudo是更稳妥的路子。
这里还要区分“删除文件内容”和“删除文件本身”。vim里的“全部删除”删的是内容,文件还在磁盘上。真正删除文件是shell的活,用rm,遇到Permission denied就sudo rm。Linux删除文件夹命令是rm -rf + 目录名,但这个命令杀伤力极大,我见过不止一次有人手滑把整个项目删了,所以敲之前务必反复确认路径。想清空文件内容又保留文件本身,可以:%d 然后:w,也可以在shell里执行cat /dev/null > 文件名,效果类似。
4. vim常见问题与排查技巧实录
4.1 复制到Word/网页后格式全乱
从vim里复制出来的内容是纯文本,没有富文本格式。如果你从vim复制一段代码到Word,发现换行、缩进全乱,这不是vim的锅,是目标软件接管粘贴时自己动了格式。解决思路之一:粘贴到终端时,先:set paste,再粘贴。set paste的意思是临时关闭自动缩进,这样外来的文本不会在我的行上叠出新缩进。很多新手遇到“复制过去格式不一样”,真正原因往往是粘贴到vim时没有set paste,导致每一行都被塞上前一行的缩进,整个代码块面目全非。
另一个更稳妥的用法是:从vim复制到浏览器或文档之前,先经过一个纯文本编辑器过渡一遍。比如复制到notepad再复制走,格式就干净了。在终端vim里粘贴外部内容,除了:set paste,还可以直接用终端的“粘贴”快捷键,比如Ctrl+Shift+V,绕过vim的自动缩进。记住一个原则:vim里粘贴外部文本,要么:set paste,要么用终端快捷键,别直接Ctrl+V。
4.2 全选删除大文件卡顿或内存占用高
如果vim打开的是一个几百MB的日志文件,执行ggdG或:%d都可能卡几秒甚至无响应。原因是vim要一次性处理所有行的高亮、撤销记录和内存结构。我建议:处理超大文件时别用vim硬扛,确认要清空就直接在shell里用重定向:> 文件名,注意这个命令会瞬间清空文件,没有撤销缓冲,别乱用。
如果只是想快速查看或截取,可以用less、head、tail、grep配合。比如tail -f能看到实时日志,grep能过滤关键行。vim适合编辑中小型文本,100MB往上就该考虑其他工具了。很多人踩过“vim打开大日志然后假死”的坑,其实一开始就不该用vim开这种东西。
4.3 误操作后恢复文本的几种路子
最怕的是复制完没粘贴,手一抖按了d全删,或者保存时手滑:wq把空文件覆盖了原文件。救法有三条。第一,vim里按u撤销,如果已经退出vim,离开前可以用:undo或者查看swap文件——vim异常退出时会留下同目录下的.swp文件,里面存着最近编辑的内容。第二,如果文件被空覆盖,检查有没有.bak备份,很多人配了set backup选项,保存时会自动把原文件复制一份。第三,重要文件编辑前养成cp一份的好习惯,成本非常低。
这里补充一句Linux下的“撤销”哲学:命令行工具大多数没有撤销,rm删了就没了,重定向清了就清了。所以重要的事说三遍:备份、备份、备份。vim里按u撤销只能救编辑过程的错,救不了文件系统的错。
4.4 速查对照表:全选复制删除相关命令一次带走
整理一张比上面更完整的表,照着敲就行:
| 操作 | 命令 | 说明 |
|---|---|---|
| 全选 | ggVG | 普通模式下执行 |
| 复制选中内容到vim内部 | y | 配合可视模式使用 |
| 复制选中内容到系统剪贴板 | "+y | 在选中后执行 |
| 将系统剪贴板内容粘贴进vim | "+p | 粘贴到光标后 |
| 粘贴外部内容并避免缩进错乱 | :set paste 后粘贴 | 粘贴完:set nopaste |
| 全部删除 | ggdG 或 :%d | dG快捷键,%d更通用 |
| 清空并保存 | :%d 然后 :w | 文件变成空文件 |
| 只删除当前行 | dd | 最高频小操作 |
| 删除光标起10行 | 10dd | 可替换任意数字 |
| 保存退出 | :wq 或 ZZ | 常用 |
| 不保存退出 | :q! | 放弃修改 |
5. 从全选全删扩展到高效编辑
5.1 把命令当语法学:操作符+范围
vim为什么强大,是因为它组合性极强。全选全删的本质是三个构件:跳转命令(gg、G)、动作命令(y、d)、模式切换(V)。理解了它们,你可以自由组合:yG复制到文件尾,dgg删除到文件头,10dd删10行,:5,20d删除第5到第20行。除了y和d,还有c(修改)、p(粘贴)、u(撤销),它们都接受范围和量词。这样你的记忆成本大大降低,碰到没见过的需求也能自己推测。
用生活类比来说,vim命令就像中文句子:范围是定语,动作是谓语,对象是宾语。比如“把第5到20行删掉”就是:5,20d,“把当前行复制一份放到下一行”就是yyp。一旦你习惯了这种句法,就不需要再“背命令”了,而是“组织句子”。
5.2 高频场景:批量替换、调整缩进、跳转定位
比如全选后统一缩进:ggVG再按>(增加缩进)或<(减少缩进)。再比如想把文件末尾加一大段内容,直接G跳到末尾,再p粘贴。批量替换是vim最挣效率的场景,比如:%s/8080/9090/g就是把全文件里的8080全部替换成9090,和全选复制删除一样,都依赖“范围”这个核心概念。
建议在.vimrc里配置set number显示行号、set mouse=a允许鼠标拖选。不过开了mouse=a之后要注意,用鼠标选中文本会直接进入可视模式,复制时时选中的是vim内部选区,想进入系统剪贴板还得配合"+y。vi/vim内置的vimtutor命令也值得花半小时走一遍,初学阶段越早过越好。
5.3 我的个人习惯
用vim这些年,我其实很少真的“全选整个文件”,更多是直接用%范围。改配置文件多数是:%s/旧值/新值/g,清空模板文件就ggdG。全选整文件的高频场景,基本是“把日志清理掉”“把一段模板内容整体挪走”这两类。无论哪种,基本功都是先理解模式、寄存器、范围这三个概念。
最后再分享一个小技巧:如果你在vim里全选复制完,发现系统剪贴板里没有,九成是clipboard没开,别急着重装系统,先跑一下vim --version | grep clipboard。另一个我踩了很多年的坑是,在终端里粘贴外部代码时忘了:set paste,导致缩进层层叠加,后面排查了半天发现是自动缩进在捣鬼。如果你刚起步,就从这篇文章里的四组命令开始练,顺手之后你会发现,所谓的“vim难学”,其实只是没人把模式、寄存器、范围这三件事先讲清楚罢了。