vim-03-掌握 vim 的语法
# 任务点
# vim 语法
操作符(operator)+ 动作(区域范围)
操作符:指删除、复制等操作字符的字符,如上节课所学的 d、y
动作:指可以将当前光标移动到另一位置的字符,如 hjkl, ^$ 等
# 操作符
d: 删除
当按下 d 后,可以在 vscode 下方状态栏看到当前输入到 d,此时 vim 就进入 pending 的状态,等待我们后续输入的动作
当我们输入 操作符 + 动作 后,vim 就会去执行这个命令
比如输入 d + h 就是向左删除一个字符,d + $ 就是删除到行尾
但当我们输入 d + H/L 的时候,却不是删除到行首/尾
这是因为我们改键只改了 normal 模式,而没有改 operatorPending 模式
还是在 settings.json 中增加配置:
"vim.operatorPendingModeKeyBindings": [
{
"before": ["H"],
"after": ["^"]
},
{
"before": ["L"],
"after": ["g", "_"]
}
]
2
3
4
5
6
7
8
9
10
如果要在终端中改键:
.vimrc
onoremap H ^
onoremap L g_
2
onoremap表示在输入完操作后等待时间按键绑定
c: 删除并进入 insert 模式
y: 复制
d/c/y 删除/复制后,都会把字符存储在寄存器中
# 基于单词/字串的移动
单词:字母组成的单词、括号等
一个单词的定义是连续的「数字 + 字母 + 下划线」,或者连续的「特殊字符」。比如 hello, world!!! 里包含 hello、,、world 和 !!! 四个单词。按 w 跳转时,会跳过单词后面的所有空白字符,落在下一个单词的开头。示例:
↓ 光标在这里
Hello, world!
↑ 按下 w
↑ 按下 e
Hello, world!
↑ 按两下 w
↑ 按两下 e
2
3
4
5
6
7
e: 移动到单词的结尾 (从左到右移动)
w: 移动到单词的开头(从左到右移动)
b: 移动到单词的开头(从右到左移动)
ge: 移动到单词的结尾 (从右到左移动)

我们可以认为这些动作命令是成对出现的。w 和 b 命令都以词首为目标,而 e 和 ge 命令则是以词尾为目标。w 和 e 都正向移动光标,而 b 和 ge 命令则反向移动光标。下图展示了这些面向单词的动作命令的效果:

字串:空格、tab、换行分割的字符,比如 hello, world!!! 里,包含 hello, 和 world!!! 两个字串。
E: 移动到字串的结尾(从左到右移动)
W: 移动到字串的开头(从左到右移动)
B: 移动到字串的开头(从右到左移动)
gE: 移动到字串的结尾 (从右到左移动)
我们经常提到单词,但迄今为止,我们都一直未定义过究竟什么是一个单词。Vim 对此有两种不同的定义,并且分别用“单词”(word)和“字串”(WORD)对其进行区分。我们之前遇到过的每个面向单词的动作命令,都有一个面向字串的命令与其对应,这当中包括 W、B、E 和 gE。
一个单词由字母、数字、下划线,或其他非空白字符的序列组成,单词间以空白字符分隔。而字串的定义则更简单,它由非空白字符序列组成,字串间以空白字符分隔。
我们可以这样简单地想:字串比单词更长!请看下面这段文本,然后快速数一下当中单词的个数:
e.g. we're going too slow
你是不是数到 5 个或 10 个单词(或二者中间的某个值)?上例中包含了 5 个字串及 10 个单词。句号及单引号都被当成了单词,因此,如果我们用 w 命令在这段文本中移动的话,会显得很慢:

相反,如果我们基于字串移动,用更少的按键就可以达到同样的效果:

在本例中,面向字串的动作命令似乎是更好的选择,然而这并不是绝对的。因为有时候,我们可能会想把“we”当成一个单词来进行操作。
例如,如果我们想把“we”改成“you”,可以这样做:

在另外一些时候,我们可能更想把“we’re”当作一个字串来进行处理。例如,如果我们想把它改成“it’s”的话,可以这样做:

如果你想更快地移动的话,可以用面向字串的动作命令;而如果你想以更细的粒度移动的话,则可以用面向单词的动作命令。你自己试着用一下这些命令,然后就会知道什么时候该用单词,什么时候该用字串了。你可以训练一下自己对这些命令的直觉,用不着理解其实现的细节。
# 组合
cw: 删除当前单词并进入 insert 模式
ea: 在当前单词结尾处添加

# 社群讨论
感觉第三章节讲的灵活性都开始变大了,循序渐进的一个过程也挺有意思的
其实写代码就是最好的练习,因为肌肉记忆有部分是和场景有关系
是的 像操作性的东西大部分就是肌肉记忆,练久了感觉就熟悉了,不过前期确实挺难受
其实就是第一次的痛苦期难熬 劝退了很多人,只要你有一次渡过痛苦期的经验 下一次在遇到痛苦期就心里有数有信心了,比如很多从全拼转到双拼的同学 就非常容易习得,因为他们知道痛苦期只是暂时的
两个问题
d ^: 删除到行首操作会有光标所在的字母没有删除到
c w:删除到下个单词前会保留下个单词前的空格,d w 则不会
嗯 这是一些小细节
有谁知道怎么快速打开 setting.json 这样的文件吗
command+shift + p
我还想问下 command + shift + p 和 command + p 有什么区别


观察一下 自己说答案
command + shift + p 是配置 和 command + p 是找文件?
加 shift 是命令,普通的就是文件
setting.json 不是文件吗?哦哦是打开这个文件的命令
也可以用 f1 代替 cmd + shift + p
cw 只能先移动到单词开头才可以,有那种光标在单词中间,也可以直接删除单词的操作吗?
ciw
我想在单词的末尾,删除这个单词,有什么办法么?例如:abcef,向前删除 f 还会留着
diw 吧
diw 删除光标所在单词
ciw 删除光标所在单词,并开始插入
yiw 复制光标所在单词
dL 可以用 D 代替
此外,P 是粘贴到光标前,p 是粘贴到光标后
有一个问题是如何快速删除 html 的属性及对象解构赋值的属性,百度找到了答案:使用大写的 W,比如 diW,ciW 等,这个 W 就记成字串了,以为没啥用,其实左右有空格就算字串,所以可以删除属性
比较常见的操作符
