小甲鱼 发表于 2015-10-27 04:10:41

第三节:删除命令、数字的奥义、撤销和恢复命令

第三节:删除命令、数字的奥义、撤销和恢复命令
<br><br>
删除命令
<br><br>
当然你可以选择在插入模式中使用退格键(Backspace)或删除键(Delete)来删除光标前面或当前的字符。
<br><br>
不过这样做挺麻烦的,因为你需要先通过方向键将光标调整到目标位置才行(h、j、k、l需要在普通模式才能使用,还记得吗?)。
<br><br>
我们曾经说过:“对于真正的 VIM 用户,插入模式根本不存在”。
<br><br>
是的,回到普通模式去吧,那里有更广阔的天地,在那里可以大有作为的!
<br><br>

<br><br>
在普通模式下,删除单一字符可以用 x 命令。跟在插入模式按下 Delete 键一样,x 命令是删除光标指定的字符。
<br><br>
删除更多字符可以使用 d 命令!
<br><br>

<br><br>
<br>
更多删除命令
<br><br>
使用删除操作符 d 的删除命令的格式是 d motion
<br><br>
d 是 Delete(删除)的意思,motion 即指定要删除的对象,所以这个命令可以很灵活!
<br><br>
motion 其实是一些表示操作范围的指令,比如:
<br><br>

按键含义
0 将光标定位到行首的位置
^ 同上
$ 将光标定位到行尾的位置
b 将光标定位到光标所在单词的起始处
e 将光标定位到光标所在单词的结尾处
w 将光标定位到下一个单词的起始处(注意,是光标所在单词的下一个单词噢^_^)
gg 将光标定位到文件的开头
G 将光标定位到文件的末尾

<br>
没错,使用上面这几个按键移动光标,比单纯多次点击 h、j、k、l 按键省心省力。
<br><br>
将 d 命令跟它们结合,无疑是雪上加霜……噢,不,是如虎添翼、珠联璧合、相得益彰!
<br><br>

按键含义
d0 删除光标从当前位置(不包含)到该行行首的所有字符
d^ 同上
d$ 删除从光标当前位置(包含)到该行行尾的所有字符
db 删除从光标当前位置(不包含)到单词起始处的所有字符
de 删除从光标当前位置(包含)到单词结尾处的所有字符
dw 删除从光标当前位置(包含)到下个单词起始处的所有字符
dh 删除光标前面一个字符
dl 删除光标指定的字符
dj 删除光标所在行以及下一行的所有字符
dk 删除光标所在行以及上一行的所有字符
dd 删除光标所在行的所有字符
dgg 删除光标所在行(包含)到文件开头的所有字符
dG 删除光标所在行(包含)到文件末尾的所有字符

<br>
不是说好了不刁难人嘛……
<br><br>

<br><br>
喂喂喂,亲,我说你别走啊,可以学会的啊!!!
<br><br>
其实你需要练习的就只是几个表示操作范围的命令就可以了,另外还有些规律可循的。
<br><br>
比如 0 和 ^ 两个是一样的,你随意记住一个即可;d0、db、dh 这类往前删除字符的命令,它们是不会删除光标所指定的字符;而删除方向是往后的则相反(d$、dw、dl),会将当前字符也一并删除。
<br><br>
另外 dh 和 dl 两个都只是删除一个字符,而 dj 和 dk 则是一次性删除两行,这是为什么呢?我们不妨可以来讨论下,小甲鱼个人认为是这样的:
<br><br>
大家看最后一个命令 dd(这个命令其实是最常用的,最常用的命令一般作者会设置为重复输入某个字符,这样输入速度会更快)
<br><br>
它表示当前行的所有字符,那也就是说我想删除下一行,只需要输入 jdd 即可,dj 命令就显得有点没那么必要了(作者可以良苦用心,尽量让每个按键都能够充分发挥最高效率的输入)。
<br><br>
因此 dj 就给设计成删除当前行以及下一行的所有字符(即 dj == dddd);dk 同理。
<br><br>
最后这个只是小甲鱼个人的瞎想臆测,欢迎提出不同意见。
<br><br>
<br>
数字的奥义
<br><br>
你以为这样就完了?
<br><br>

<br><br>
当然不,VIM 利用数字可以干老多的事儿了。比如普通模式下按一下 h 按键是将光标向左移动一格,而在其前面输入数字 3,即 3h 则是将光标向前移动 3 格。
<br><br>
依此类推 3j 则是将光标向下移动三行,3w 则是将光标跳到三个单词后的开始位置……
<br><br>
同样的,d3h 表示删除光标前的 3 个字符,d3j 表示删除光标所在行以及下面 3 行的所有字符,而 d3w 则表示向后删除当前光标到后面第三个单词前的所有字符。
<br><br>
是不是很容易呢?
<br><br>

<br><br>
<br>
撤销和恢复命令
<br><br>
人总难免会做错事,尤其是在进行删除操作的时候。
<br><br>
那一不小心……删错了……怎么办?
<br><br>
没关系,VIM 有后悔药提供:u 和 U
<br><br>
其中小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。
<br><br>
<br>
可是……我又后悔我吃了后悔药……怎么办?
<br><br>

<br><br>
VIM 还是有办法!Ctrl + r 快捷键可以恢复撤销的内容!!
<br><br>
<br>
特大备注
<br><br>
最后,有一个件特大的事儿要跟大家说:这上面所有的“删除”操作并不是真的删除,它们事实上是存放在 VIM 的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能!!!
<br><br>

<br><br>
本节课附带的练习小游戏:
<br><br>
<iframe
    src="https://ilovefishc.com/demo/vim/vim_3.html"
    width="100%"
    height="1480"
    frameborder="0"
    allowfullscreen
    scrolling="no"
    allow="clipboard-write"
    style="border-radius:12px;box-shadow:0 2px 16px #42929633;">
</iframe>



小甲鱼 发表于 2026-7-22 23:07:28

程序已更新~

稻草人@麦田 发表于 2024-2-28 23:56:30

我又学习了很多有用的知识,谢谢小甲鱼。

稻草人@麦田 发表于 2024-2-28 23:40:50

其实0和^还是有点区别的。
比如:      123
如果按0会定位到行首,如果按^会定位到1处。
^是定位到当前行有字符的位置。这个位置可能不在行首。

1003464880 发表于 2024-1-25 12:30:11

小甲鱼 发表于 2023-10-6 22:29
没了~

{:10_266:}能补一个吗

1003464880 发表于 2024-1-25 12:19:15

小程序怎么没了{:10_299:}

♂靇龍龘龘♂ 发表于 2023-12-12 16:02:24

感觉这个de和dw的效果区别不大啊??有大佬能举个例子区分一下de和dw的效果吗?

ylc77 发表于 2023-10-16 20:27:28

已第一次看完,打卡

小甲鱼 发表于 2023-10-6 22:29:05

歌者文明清理员 发表于 2023-10-6 19:45
@小甲鱼

{:10_282:} 没了~

歌者文明清理员 发表于 2023-10-6 19:45:43

2049570842 发表于 2018-8-7 22:15
额,你的小程序呢?

@小甲鱼

舒澈大大 发表于 2023-1-11 15:55:20

还有类似第一节的小游戏么

lskjlx 发表于 2022-12-9 16:43:39

小程序呢

不要懒惰 发表于 2022-9-28 16:42:49

简直恐怖如斯

12053 发表于 2022-9-25 20:32:07

这神来之笔的配图,让我欲罢不能

sinsis 发表于 2022-7-8 23:58:01


小bai学c 发表于 2021-12-20 21:51:44

学到了

underkilling 发表于 2021-12-5 20:00:04

感谢教学

Mocca 发表于 2021-11-12 00:54:23

好不容易跟上了{:5_92:}

ochenxingo 发表于 2021-9-30 14:29:24

学习 ing

广陵伞 发表于 2021-8-25 16:08:05

普通模式删除:
x   :删除光标字符

motion指令:
0(^)    :光标定位行首                           
$         :光标定位行尾                           
b         :光标定位单词起始处                  
e         :光标定位单词结尾处                  
w      :光标定位下一个单词起始处
gg       :定位文件开头
G         :定位文件末尾

d motion:         // d n motion:操作范围扩大n倍(d3j:删除当前以及下三行)
向前删除:(不包含光标位置)
    d0:当前位置到行首      db:当前位置到单词起始处      
向后删除:(包含当前位置)
    d$:当前位置到行尾      de:当前位置到单词末尾         dw:当前位置到下个单词起始处
单个字符:
    dh:光标前一个字符      dl:光标当前字符
行操作:
    dj:光标所在行&下一行(2)   dk:光标所在行&上一行(2)
    dd :光标所在行   
文本:(包含本行)
    dgg:光标所在行到文件开头      dG:光标所在行到文件末尾

撤销:
u:撤销最后一次修改      U   :撤销对整行的修改
恢复撤销:
ctrl + r
页: [1] 2 3
查看完整版本: 第三节:删除命令、数字的奥义、撤销和恢复命令