写在前面
本篇为上节课 Vim 文本对象操作的同步练习,已根据英文表述进行了全文翻译,方便今后快速查找、练习。从文本的增删改、再到上一章的查找检索替换、再到本节的文本对象操作,每一部分要么讲解十分详细,要么加大练习量,足以看出这些知识点在 Vim 中的核心地位。这就是刻意思考后的刻意练习,望各位着眼长远,且行且珍惜。
熟悉 Vim
中的各类文本对象。1
用 Vim
打开源码包内的练习文件 textobjectspractice.txt
(默认解压到 Downloads
文件夹下):
cd Downloads
cd vimclass
vim textobjectspractice.txt
将光标定位到首行单词 Time
的任意位置,例如按 FI 定位到最近的 i
字符下。然后按 DAW 删除该单词。注意观察,此时整个单词都被删除了,与使用 DW 删除的结果不同。
接下来再将单词 Traveller
改为 tourist
。具体做法:用 CIW 更改内部单词(inner word),然后输入 tourist
。最后按 Escape 键返回常规模式。
( )
练习 Block Object ( )按 W 将光标移至左小括号位置,然后将括号内的文本改为 as we will call him
。具体做法:按 CI( 或 CI) 变更该区块内的文字内容。注意观察,此时光标刚好位于小括号内,接着输入 as we will call him
,再按 Escape 键返回常规模式。
此时文档第一行如下所示:
The tourist (as we will call him) was expounding.
再定位到如下文本行,并令光标处于小括号内部、或就在小括号上:
print("The weatherman said, 'This weekend will be warm,' but that was a lie.")
这是其中一种实现方案:按 /( + Enter。接着,试通过三个字符的组合命令删除小括号这一整块内容(即 ("The weatherman said, 'This weekend will be warm,' but that was a lie.")
)。该命令为 DA( 或者 DA)。
光标移至下一行,并将其定位到双引号内的任意位置(例如使用 /" + Enter)。然后将下列文字:
print("The weatherman said, 'This weekend will be warm,' but that was a lie.")
改为:
print("It was cold!")
具体做法:键入 CI",并输入 It was cold!
,再按 Escape 键返回常规模式。
接着移至下一行,这次需要将单引号内的文字由 'This weekend will be warm,'
改为 'It is hot outside,'
。为此,先用 /‘ + Enter 进行正向搜索,然后输入 CI’,并将原文本改为 It is hot outside,
。最后按 Escape 键返回常规模式。
[ ]
练习 Block Object [ ]快速删除下列括号内所有文字内容。这是删除前的原始文本:
scripts=[ 'bin/backup',
'bin/backup-all',
'bin/backup-db-only',
'bin/backup-files-only' ]
删除后将变为:
scripts=[]
先将光标定位到括号内的任意位置,例如通过检索 bin
实现:执行命令 /bin
+ Enter。然后,按 DI[ 或者 DI] 删除方括号内的所有内容。
< >
练习 Block Object < >按 JJ 将光标移至如下这行:
接着,将尖括号内的文本复制到 "i
寄存器中。具体做法:输入 "iyi>
或者 "iyi<
。然后查看寄存器 "i
中的内容是否为 yank_me
,方法是:输入命令 :reg i
+ Enter 。
然后,再连同尖括号本身,将文本
复制后存入寄存器 "a
。具体做法:输入命令 "aya<
或 "aya>
,并通过命令 :reg a
+ Enter 进行确认,看看寄存器中的内容是否为
。
试将下列文本行中的 Linux Training Academy
改为 LTA
。改动前的原始文本如下:
<p><a href="https://linuxtrainingacademy.com">Linux Training Academya>p>
这是变更后的效果:
<p><a href="https://linuxtrainingacademy.com">LTAa>p>
注意观察,目标文本位于 HTML 标签 内部。为此,需要先将光标定位到
标签内,例如通过 /H + Enter 实现。然后按 CIT,即在标签内变更内容(change inside tag),然后输入
LTA
+ Escape。
下一段练习文本是 XML 格式的,改动前如下所示:
<CATALOG>
<CD>
<TITLE>Jazz At Massey HallTITLE>
<ARTIST>The QuintetARTIST>
CD>
<CD>
<TITLE>Blue TrainTITLE>
<ARTIST>John ColtraneARTIST>
CD>
<CD>
<TITLE>Saxophone ColossusTITLE>
<ARTIST>Sonny RollinsARTIST>
CD>
CATALOG>
试将 CATALOG
中标题为 Jazz At Massey Hall
的 CD 条目完整删除,改动后的效果如下所示:
<CATALOG>
<CD>
<TITLE>Blue TrainTITLE>
<ARTIST>John ColtraneARTIST>
CD>
<CD>
<TITLE>Saxophone ColossusTITLE>
<ARTIST>Sonny RollinsARTIST>
CD>
CATALOG>
要删除
标签,需要先将光标定位到包含 Jazz At Massey Hall
的条目对应的
或 位置。接着输入 DAT,表示删除该标签(delete a tag)。注意:如果光标定位到其他地方,可能只会删除内部嵌套的标签
或者
,而不是题目要求的整个
标签。
{ }
练习 Block Object { }试对如下这段文字进行相关文本对象操作:
musicians = {
'Charlie Parker': 'alto sax',
'John Coltrane': 'tenor sax',
'Sonny Rollins': 'tenor sax'
}
使其最终变为:
musicians = { }
具体做法:先将光标定位到 { }
区块的任意位置,例如检索关键字 alto
,键入命令 /ALTO + Enter。然后输入 DI{ 或 DI} 删除该区块内的文本,此处光标应位于下列内容所示的右大括号 }
位置:
musicians = {
}
按 K 令光标上移一行,然后按 ShiftJ 合并这两行即可。
复制下列句子内容并存入寄存器 "s
中。将光标定位到这句话的任意位置:
Praesent rutrum purus ultricies, dignissim massa id, elementum felis.
注意观察,这句话并不是真正意义上的句子。切记,Vim
关注的是文本对象的边界,而非边界内的文字内容。句子是通过是否由标点符号 .
、!
或者 ?
结尾判定的。后面可以紧跟一个行终止符(the end of a line)或者一个空格或制表符。
按 "SYAS 将这句文本复制到寄存器 "s
中,并通过命令 :reg s
+ Enter 进行确认。
按 DAP 删除整个段落。
若要放弃文件变更以便下次重新练习,使用退出命令 :q!
+ Enter。
无增补知识点,多思多练即可。
本节练习另附精美排版 PDF 格式,阅读体验更佳,详见:vimclass/Exercise-08-TextObjects.pdf
↩︎