Solution-编辑器 (Vim)
- 完成 vimtutor。 备注: 它在一个 80x24(80 列,24 行) 终端窗口看起来最好。
vimtutor
- 下载我们的 vimrc,然后把它保存到
~/.vimrc
。 通读这个注释详细的文件 (用 Vim!), 然后观察 Vim 在这个新的设置下看起来和使用起来有哪些细微的区别。 - 安装和配置一个插件:
ctrlp.vim
.- 用
mkdir -p ~/.vim/pack/vendor/start
创建插件文件夹 - 下载这个插件:
cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
下载后需要在~/.vimrc 中添加如下设置,参考 这里set runtimepath^=~/.vim/pack/vendor/start/ctrlp.vim
- 请阅读这个插件的 文档。 尝试用 CtrlP 来在一个工程文件夹里定位一个文件, 打开 Vim, 然后用 Vim 命令控制行开始 : CtrlP.
- 自定义 CtrlP: 添加 configuration 到你的 ~/.vimrc 来用按 Ctrl-P 打开 CtrlP
let g:ctrlp_map ='<c-p>' let g:ctrlp_cmd = 'CtrlP' let g:ctrlp_working_path_mode = 'ra' #设置默认路径为当前路径
- 用
- 练习使用 Vim, 在你自己的机器上重做演示。
- 下个月用 Vim 完成_所有_的文件编辑。每当不够高效的时候,或者你感觉 “一定有一个更好的方式”, 尝试求助搜索引擎,很有可能有一个更好的方式。如果你遇到难题, 来我们的答疑时间或者给我们发邮件。
- 在你的其他工具中设置 Vim 快捷键 (见上面的操作指南)。
- 进一步自定义你的 ~/.vimrc 和安装更多插件。
安装插件最简单的方法是使用 Vim 的包管理器,即使用 vim-plug 安装插件:
- 安装 vim-plug
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 修改 ~/.vimrc
call plug#begin() Plug 'preservim/NERDTree' #需要安装的插件 NERDTree Plug 'wikitopian/hardmode' #安装 hardmode ..... # 更多插件 call plug#end()
- 在 vim 命令行中执行
:PlugInstall
- 安装 vim-plug
-
(高阶)用 Vim 宏将 XML 转换到 JSON (例子文件)。 尝试着先完全自己做,但是在你卡住的时候可以查看上面 宏 章节。
可以先查看 转化后的 JSON 文件,了解最终的转换效果。
vim example-data.xml
在
vim
编辑页面中执行以下步骤:- 删除首尾两行
Gdd
:跳转到最后一行,并删除该行ggdd
: 跳转到第一行,并删除该行
- 录制寄存器
e
,实现对<name>
标签的处理/<name>
,再键入Enter
,然后键入N
:查找<name>
并跳转到文件的最后一个<name>
- 接下来,录制宏(即寄存器
e
):
qe
:即将录制名为e
的宏^r"
:^
跳转到当前行的首个非空字符,即<name>
的<
,r"
将<
替换为"
f>s": "
:f>
查找>
,此处即匹配刚才的<name>
的>
;s"
将>
替换为": "
<Esc>
:回到正常模式f<C"
:查找下一个<
,由于 xml 文件的特征,此时匹配到的是刚才修改的<name>
对应的</name>
的<
;然后,将当前位置到本行末尾的内容删除,同时插入"
<Esc>
:回到正常模式q
:停止录制,寄存器e
完成- 寄存器
e
的效果示例:将<name>Mike</name>
修改为"name": "Mike"
- 寄存器
- 录制寄存器
p
,实现对<person>
标签的处理gg
:跳转到文件开头(本例中,正好处于一个<person>
标签)- 接下来,录制宏(寄存器
p
)
qp
:即将录制宏p
S{
:将当前行删除,并替换为{
<Esc>
:回到正常模式j@e
:移到下一行,并执行宏e
(因为本例的 xml 文件中,<person>
的下一行为<name>
)A,
:在本行的末尾添加上,
<Esc>
j@e
:移到下一行,并执行宏e
(本例中,完成对<email>
标签行的处理,其处理与<name>
标签行的一致)jS},
:跳转到下一行,并删除整行,同时添加上},
(本例中该行内容为:</person>
)<Esc>q
:回到正常模式,并停止录制,完成宏p
- 录制寄存器
q
,实现从一个<person>
标签到另一个<person>
标签的跳转/<person>
:从第三步的位置开始查找下一个<person>
标签qq
:开始录制宏q
@p
:执行宏p
,可以将这一组<person>
标签包含的内容修改为 json 格式jq
:移到下一行,并停止录制,完成宏q
(此时,刚好处于下一个<person>
标签行)
- 执行宏
q
到文件尾999@q
:执行 999 次宏q
(本文档总行数为 1002 行,执行 999 次能确保到达文件末尾)
- 手动修改文件内容
gg
O
:(大写的o
)在开头插入如下内容{ "people": { "person": [
<Esc>
/<email>
:跳转到文件末尾唯一未处理的<email>
标签行@e
:对该标签行进行处理jS}
:移到下一行,删除</person>
标签<Esc>
o
:在文件末尾插入以下内容] } }
- 删除首尾两行
Licensed under CC BY-NC-SA.