Linux 编辑器之神 vim 的 IO 存储原理
扫描二维码
随时随地手机看文章
故事起因
无意间用 vim 打开了一个 10 G 的文件,改了一行内容,
:w
保存了一下,慢的我哟,耗费的时间够泡几杯茶了。这引起了我的好奇,vim 打开和保存究竟做了啥?vim — 编辑器之神
vim 号称编辑器之神,以极其强大的扩展性和功能闻名。vi/vim 作为标准的编辑器存在于 Linux 的几乎每一种发行版里。vim 的学习曲线比较陡峭的,前期必须有一个磨炼的过程。
vim 是一个终端编辑器,在可视化的编辑器横行的今天,为什么 vim 还如此重要?因为有些场景非它不可,比如线上服务器终端,除 vi/vim 这种终端编辑器,你别无选择。vim 的历史很悠久,Github 有个文档归纳了 vim 的历史进程:vim 历史,Github 开源代码:代码仓库。笔者今天不讲 vim 的用法,这种文章网上随便搜一大把。奇伢将从 vim 的存储 IO 原理的角度来剖析下 vim 这个神器。思考几个小问题,读者如果感兴趣,可以继续往下读哦:
- vim 编辑文件的原理是啥,用了啥黑科技吗?
- vim 打开一个 10G 的大型文件,为什么这么慢,里面做了啥?
- vim 修改一个 10G 的大型文件,
:w
保存的时候,感觉更慢了?为什么? - vim 好像会产生多余的文件?
~ 文件
?.swp 文件
?都是做啥的呢?
vim 的 io 原理
声明,系统和 Vim 版本如下:
操作系统版本:Ubuntu 16.04.6 LTSVIM 版本:VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jul 25 2021 08:44:54)测试文件名:test.txtvim 就是一个二进制程序而已。读者朋友也可以 Github 下载,编译,自己调试哦,效果更佳。一般使用 vim 编辑文件很简单,只需要 vim 后面跟文件名即可:
vim test.txt
这样就打开了文件,并且可以进行编辑。这个命令敲下去,一般情况下,我们就能很快在终端很看到文件的内容了。这个过程发生了什么?先明确下,vim test.txt
到底是啥意思?本质就是运行一个叫做 vim 的程序,argv[1]
参数是 test.txt 嘛。跟你以前写的 helloworld 程序没啥不一样,只不过 vim 这个程序可以终端人机交互。所以这个过程无非就是一个进程初始化的过程,由 main
开始,到 main_loop
(后台循环监听)。1 vim 进程初始化
vim 有一个
main.c
的入口文件,main
函数就定义在这里。首先会做一下操作系统相关的初始化( mch 是 machine 的缩写):mch_early_init();
然后会,做一下赋值参数,全局变量的初始化:/*
* Various initialisations shared with tests.
*/
common_init(