你是不是已经能熟练用hjkl在Vim里移动光标了,
但一到删除、复制、粘贴的时候,手还是忍不住去摸鼠标?
如果是,恭喜你------这篇文章就是为你写的。
问题不在你,在 " 习惯 "
鼠标操作的方式是:先选中,再操作。
你的大脑要经历:定位光标 → 伸手摸鼠标 → 瞄准起点 → 按住拖动 → 松手 → 手回键盘 → 按删除或复制。这一套下来,少说两三秒,思路早就断成渣了。
Vim的方式完全不同:先说什么动作,再说针对谁。
这就好比你跟编辑器说:
"删掉这个词"
"复制这一行"
"把括号里的内容全部换掉"
不需要"选中"这个中间步骤。你说什么,它做什么。

核心语法:动词 + 名词
Vim只有三个最常用的动词,先记住它们就够了:
- d = delete(删除)
- y = yank(复制,Vim里叫"猛拉")
- p = paste(粘贴)
名词就是你已经掌握的移动命令:w(到下一个词开头)、j(向下一行)、$(到行尾)等等。
把它们组合起来:动词**+** 名词 。
"删掉这个词" → d + w = dw
"复制这一行" → y + y = yy(两个y表示"这一行"这个特殊名词)
"删到行尾" → d + = d
你不需要额外学习什么,只是把你已经在用的移动命令,前面加一个动作而已。

最实用的几个组合,背下来就能用
删掉一个词 :dw
光标在词的任意位置,敲dw,这个词从光标位置开始被删掉。注意它会保留空格,删完后光标停在下一个词的开头。
删掉一整行 :dd
不管你光标在这行的哪个位置,敲dd,整行消失,下面的行往上顶。
复制一整行 :yy
和dd同理,复制整行到剪贴板(Vim的寄存器),不会删掉原内容。
删到行尾 :d$
光标之后的所有字符,从当前位置一直到行尾,一次性清空。行首位置用这个,效果等于删掉整行内容但保留空行。
复制光标下的整个单词 :yiw
这个看起来有点怪,拆开就懂了:y(复制)+ i(inner/内部的)+ w(word)。"复制这个单词的内部"------不管光标在单词的第一个字母、中间还是最后一个字母,结果都是复制整个单词。不需要精确定位到词首,省了大事。
替换光标下的整个单词 :ciw
c是"修改"(删除并自动进入插入模式),加上iw就是"删掉整个单词,然后直接开始打新的内容"。比dw再按i省一步,是高频操作里的王者。
加上数字,威力翻倍
Vim支持"数量词",就像自然语言里的"三个"、"五下"。
删掉三行 :3dd
从当前行开始,向下数三行,一起删掉。不用一行一行删,也不用算行号。
删掉三个词 :d3w
删掉当前光标位置开始的三个词。注意3w本身是"向右移动三个词",前面加d就是"一边移动一边删"。
往下复制三行 :y3j
3j是"向下移动三行",前面加y就是"把经过的这些行全部复制"。结果是复制了包括当前行在内的四行(当前行 + 下面三行)。
读起来就是:
"删三个词" → d 3 w
"往下复制三行" → y 3 j
数字放在动词后面、名词前面。这个顺序刚好和英语一致:delete 3 words。

进阶语法:文本对象 ------Vim 最被低估的设计
上面的iw你已经见过了。它就是"文本对象"的一种。
文本对象不是"光标往哪走",而是"这一段文本是什么类型"。你不需要告诉Vim从哪里开始到哪里结束,只需要说"对这个类型的东西动手"。
常见的文本对象:
- iw = inner word(一个完整的单词)
- ip = inner paragraph(一个段落,以空行分隔)
- i" = inner double quote(双引号里面的所有内容,不包括引号本身)
- i' = inner single quote(单引号里面的内容)
- i( 或 ib = inner parentheses(小括号里面的内容)
- i{ 或 iB = inner braces(花括号里面的内容)
- it = inner tag(HTML/XML标签内的内容)
用法极其简单:动词**+ i +** 文本对象
di" :光标在某个双引号字符串的任意位置,敲di",引号里面的内容全部删除,引号本身留下。用来清空字符串参数、JSON值,一把好手。
yi( :复制括号里的所有内容。函数调用的参数想复制一份改一改?光标放括号里任意位置,yi(,然后找个地方p粘贴,完美。
cip :删除当前整个段落,然后进入插入模式让你重写。重构一段文字时,不用一行一行删,一次搞定。
ci" :修改引号里的内容。最常见场景:改一个字符串的值,先删掉旧的,光标停在引号之间等你写新的。省了di"再i两步。
文本对象的好处是:你完全不需要关心光标在这个对象的具体哪个位置。只要在里面,结果都一样。

实战一:修改一个 HTML 标签内的所有内容
场景:光标在<div>...</div>里面的某个位置,可能是第一行、中间、最后一行。
你想把div里的所有内容全部换掉。
不用鼠标选中,不用反复按l或w一点点挪,甚至不用关心这个div有多少行。
只需要:
text
cit
拆解:
- c = 修改(删除内容并自动进入插入模式)
- i = inner(内部的)
- t = tag(HTML标签)
Vim会自动识别光标当前所在的HTML标签,找到它的开标签和闭标签,删除中间的全部内容,然后把光标放在开标签后面,让你直接开始写新的内容。
这就是"像说话一样"的真实体验------你说"改标签里的内容",它就照做。不管div里有几十行代码、嵌套了多少其他标签,一次搞定。
实战二:删除函数的所有参数
场景:你有一个函数调用 calculateTotal(price, quantity, taxRate, discount),光标在括号里任意位置。
你想删掉所有参数,重新写。
用鼠标?你需要选中price, quantity, taxRate, discount这一整段,中间可能因为逗号和空格点不中。
用Vim:
text
di(
d + i + ( = 删除括号内的所有内容。括号本身保留,光标停在括号之间。然后你可以直接开始写新参数。

实战三:复制整个段落并在下方粘贴一份
场景:你写了一段文字,想复制一份放在下面修改。
用鼠标?选中一个段落经常拖过头或者没选全。
用Vim:光标放在这个段落的任意位置。
text
yip
复制整个段落(不会删除原内容)。然后:
text
p
粘贴到光标下方。如果你用的是p(小写),粘贴到当前行的下一行;P(大写)粘贴到当前行的上一行。
一个小建议:从这 5 个动作开始练
不用一下子记住所有组合。先练这5个,覆盖日常80%的操作:
dd -- 删一行。最常用的删除操作,没有之一。
yy -- 复制一行。配合p使用,行级复制粘贴的基础。
p -- 粘贴。小写贴在后面,大写贴在前面。
dw -- 删一个词。比按着x一个个删快十倍。
ciw -- 替换一个词。比dw再i少按一个键,养成习惯后改变量名、改文案都靠它。
练到手指不经过大脑就能按出来,再往后加这几个:
d$ -- 删到行尾。写了一半想删掉后面内容时用。
yiw -- 复制光标下的单词。复制配置项、变量名时高频使用。
cit -- 改HTML标签内容。前端开发必备。
3dd -- 批量删多行。处理日志、数据时非常爽。
di" -- 清空引号内的内容。改配置、改字符串时天天用。

总结一句话
Vim不是编辑器,是一门编辑语言。
语法是:动词 + 名词,前面可以加数字。
名词可以是移动命令(w、j、$),也可以是文本对象(iw、ip、it、i")。
你想做什么,就说什么。
当你不再"选中 → 操作",
而是直接"删掉这个词 / 复制这整段 / 改掉引号里的内容 / 清空标签内部"时------
你会第一次感觉到,手速跟上了脑子。
那时候再看鼠标,就像看算盘。
一件趁手的工具,不是让你更努力,而是让你更少打断、更多沉浸。
Vim的语法,就是那把趁手的工具。