关于文件的保存前面已经说了 :wq、q、:q!,但还有一些保存文件的细节需要知道。

当 vim 打开文件,如果没有任何修改,:q 可以顺利退出,如果有修改,vim 会提示 “已修改单位保存,可用 ! 强制执行”,执行 :q! 放弃所有修改,并且这种情况下 vim 不会再警告提示。

如果 vim 打开文件后,没有做任何修改,然后输入 :w 后接着 :q 退出(2次命令),文件有没有修改呢? 答案是有,文件的属性被修改了,:w 命令就是写入文件,文件的时间会修改。

wangbo@wangbo-VirtualBox:~/test/vim$ ls -l 1.txt -rw-rw-r-- 1 wangbo wangbo 14 12月 17 10:50 1.txt wangbo@wangbo-VirtualBox:~/test/vim$ vim 1.txt // 不修改内容,输入 :w 和 :q 后 wangbo@wangbo-VirtualBox:~/test/vim$ ls -l 1.txt -rw-rw-r-- 1 wangbo wangbo 14 12月 17 10:51 1.txt

同理即便内容不改变 wq 也会写入文件,为了清楚的演示,给 ls 加上 --full-time 参数,它可以显示文件的准确时间。

wangbo@wangbo-VirtualBox:~/test/vim$ ls --full-time 1.txt -rw-rw-r-- 1 wangbo wangbo 14 2020-12-17 10:58:04.489510495 0800 1.txt wangbo@wangbo-VirtualBox:~/test/vim$ vim 1.txt // 使用 :wq 退出 wangbo@wangbo-VirtualBox:~/test/vim$ ls --full-time 1.txt -rw-rw-r-- 1 wangbo wangbo 14 2020-12-17 10:59:32.386770991 0800 1.txt wangbo@wangbo-VirtualBox:~/test/vim$ vim 1.txt // 使用 :wq 退出 wangbo@wangbo-VirtualBox:~/test/vim$ ls --full-time 1.txt -rw-rw-r-- 1 wangbo wangbo 14 2020-12-17 10:59:42.105943076 0800 1.txt

干嘛纠结这个? 改变文件时间有那么重要么? 有! 有些场合真的很重要,举 2 个例子:

第一: 在文件同步操作中,可能会先比较文件的属性,以此来判断文件是否被修改而不依赖于文件的内容,如果大量的文件时间被修改,但是内容没有变,这样的同步可能显示效率低下无意义,浪费带宽和时间;

第二: 更常见的是在程序编译中,由于文件的时间被修改了,系统需要重新把这些文件编译,对于特别的大的工程,一个文件的修改会导致依赖文件都要重新编译,这会导致程序编译时间边长,浪费资源和时间。

因此我们希望当文件内容没有修改的时候,不要强制写入文件,有修改的时候才写入,vim 提供的 :x (exit) 就能符合这种要求,所以 :x 是更好的保存退出 vim 的方式。

如果希望把文件另存为可以使用 :w 3.txt 或 :wq 3.txt 的方式,使用 :w 还可以选择要保存的行到另外的文件,:2,10 w 2-10.txt 表示把第2行到10行保存到文件 2-10.txt 中,: 后跟数字在 vim 里一般表示行数,比如输入 :2 会让当前光标跳转到第 2 行,在以后的章节还会详细讲解。

你可能会看到 :qa!,它用于多窗口的时候退出所有的缓冲区并且放弃修改,目前还没有讲到 vim 的多窗口模式,暂且了解。

vim小知识大全(大白话vim教程-04-保存文件)(1)

如果在编辑过程中,想放弃上次 :w 之后的修改,可以使用 :e! 命令丢弃修改,如果打开文件后没有执行过 :w,那 :e! 相当于恢复到打开文件的初始状态。

vim小知识大全(大白话vim教程-04-保存文件)(2)

执行 :e! 后,最近的修改 wronge somthing 将被丢弃,继续 :q 退出 vim,就像文件从未被打开过一样。

,