vim可以同时处理多个文件,这一部分一定要学习,如果时间没有那么多,下面的技巧一定要重点看一下
- 1.技巧39:将工作区切分成窗口;最常用的就是
vsp
和sp
来分割窗口,来切换活动窗口,鼠标调节窗口大小
- 2.技巧43:使用
netrw
管理文件系统;主要就是edit.
和Explore
命令,结合技巧39能增加操作文件的层次结构
Vim 允许在一个编辑会话中编辑多个文件,可以把工作区分成若干个分割窗口或标签页,每个窗口或标签页包含一个独立的缓冲区
在一次编辑会话中,可以打开多个文件。用 Vim 的缓冲区列表(记录了一次编辑会话中打开的所有文件)可以对这些文件进行管理
提示:这个技巧用处感觉没有
sp
命令同时打开多个窗口的实用意义大我们通常会说“我们正在编辑一个文件”,但真实情况并不是这样,我们所编辑的只是文件在内存中的映像,也就是 Vim 术语中的“缓冲区”
文件
是存储在磁盘上的,而缓冲区
则存在于内存中part1:结识缓冲区列表
示例:同时打开几个文件,查看缓冲区列表
test目录有下面的4个文件,用
vim test*
打开,输入ls查询的缓冲区列表信息如下显示:当 Vim 启动时,它会显示一个窗口,窗口内的缓冲区对应着第一个文件。虽然另外几个文件当前不可见,但其内容已经被载入到一个后台的缓冲区
说明:
:ls
命令:会列出所有被载入到内存中的缓冲区的列表;列表中开头的数字是vim自动分配的%
符号:指明哪个缓冲区在当前窗口中可见#
符号:代表轮换文件,按可以在当前文件和轮换文件间快速切换
a
符号:当前是活动缓冲区(active),h
符号:是一个隐藏缓冲区(hidden)part2:使用缓冲区列表
- 常规:跳转到指定文件
- 更灵活的跳转
上面几个命令还是不够灵活,可以用下面的方式
# :buffer N 命令直接凭编号(每个文件前的数字)跳转到一个缓冲区 # :buffer {bufname} {bufname} 只需包含文件路径中足以唯一标识此缓冲区的字符即可。如果输入的字符串匹配了不止一个 缓冲区列表中的条目,此时可以用 Tab 补全的方式在这些条目中选择(左右键选择合适文件)
- 1
- 2
- 3
- 4
- 5
- 删除缓冲区
每次打开一个文件时,Vim 就会创建一个新缓冲区,如果想在缓冲区中删除几个文件,可使用如下格式:
# :bdelete N1 N2 N3 # :N,M bdelete
- 1
- 2
参数列表易于管理,适用于对一批文件进行分组,使其更容易访问;用
:argdo
命令可以在参数列表中的每个文件上执行一条 Ex 命令下面列举一下平时可能用到的部分,详细看书籍相关章节
示例:
:args
列表并不一定反映启动 Vim 时所传的参数用vim打开一些文件后,参数列表记录了在启动时作为参数传递给 Vim 的文件列表
提示:输出中的“
[]
”字符则指明了参数列表中的哪个文件是活动文件下面是填充参数列表的方法
- 1.使用文件名
- 2.使用命令
Vim 对被修改过的缓冲区会给予特殊对待,以防未加保存就意外退出
本节将介绍如何隐藏一个被修改过的缓冲区,以及如何在退出 Vim 时处理隐藏缓冲区
什么是隐藏缓冲区?
a
符号:当前是活动缓冲区(active),h
符号:是一个隐藏缓冲区(hidden)
+
号:表示这个缓冲区被修改过且没有被保存到磁盘中,如果现在保存文件的话,缓冲区的内容就会被写入磁盘里,而+
号也会消失提前总结一下:最有用的几个命令
在退出时处理隐藏缓冲区,下面是常用的方式
- 1.推出是报错、处理
下面是实际操作的效果图
- 2.多个隐藏缓冲区的处理
Vim 允许我们将工作区切分成若干窗口,在这些窗口里并排显示多个缓冲区
在 Vim 术语中,窗口是缓冲区的显示区域
part1:创建分割窗口
把工作区切分为窗口的几种方式
提示:用
:edit
命令把另外一个缓冲区载入活动窗口,这个感觉没有好用
s 下面是分割示意图,阴影部分代表活动窗口
part2:在窗口间切换
提示:平时操作只要记住
就可以了;其实,
w 完成的功能和
相同,
w 就是说我们可以一直按住
键,然后再输入
ww
(或wj
,或上表中的其他命令)来切换活动窗口鼠标选窗口
也可以通过鼠标点击来激活一个窗口;如果你用不了鼠标,请检查一下 ‘mouse’ 选项是否被正确设置了(参见
:h mouse
),可以先用:set mouse?
看一下默认值是否是a
,或者看看下面哪种参数适合,直接进行设置就可以了part3:关闭窗口
part4:改变窗口大小及重新排列窗口
提示:如果不能用鼠标拖拽来调整大小,可以用下面2种方式来解决
- 更改鼠标配置(推荐)
:set mouse=a
- 1
- 命令模式调整
# 1.纵向调整 :res[ize] num - 指定当前窗口为num列num行 :res[ize] +num - 当前窗口高度增加num行 :res[ize] -num - 当前窗口高度减少num行 # 2.横向调整 :vert[ical] res[ize] num - 指定当前窗口为num列 :vert[ical] res[ize] +num - 当前窗口增加num列 :vert[ical] res[ize] -num - 当前窗口减少num列
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
在 Vim 里,我们可以用标签页把窗口组织到一系列工作区里;标签页是可以容纳一系列窗口的容器
用
:edit
命令打开一个文件时,Vim 却不会自动创建一个新标签页,而是会创建一个新缓冲区,并把该缓冲区显示到当前窗口暂时不需要这个功能,未整理
:edit
命令打开文件在 Vim 中,
:edit
命令允许通过文件的绝对路径或相对路径来打开文件。另外,我们也将学会如何指定一个相对于活动缓冲区的路径
- 相对于
当前工作目录
打开一个文件当 Vim 启动时,它会采用 shell 的活动目录作为其工作目录。这一点可以通过执行
:pwd
(print working directory,这和 bash 是一样的)命令得到印证
:edit {file}
命令可以接受相对于工作目录的文件路径
- 相对于
活动文件目录
打开一个文件用
:edit
打开时,可以用键自动补全文件路径
:find
打开文件
find
命令允许我们通过文件名打开一个文件,但无需输入该文件的完整路径
- 引入原因
工作的工程中包含了多级嵌套目录呢?每次打开文件都得输入完整路径,这着实令人生厌。这就是为什么要引入
:find
命令的原因
- path设置
注意:要想利用此功能,我们首先要配置 ‘path’ 选项;‘
path
’ 选项允许我们指定一些目录,当调用:find
命令时,Vim 会在这些目录中进行查找顺序:可以先使用
:set path?
查看路径时候在设置中,如果不在,使用:set path+=路径
将需要的路径添加好(只对当前vim有效,关闭vim失效,想一直有效就要修改vimrc
配置文件),再用:find
查找下面是path的默认情况(使用
:h path
查看):
netrw
管理文件系统Vim 发行版中自带的
netrw
插件允许我们对文件系统进行管理重视:这个技巧一定要学会,对管理大型工程很有用,可以模拟类似VScode中工程目录树(project drawer),即使用侧边栏显示文件管理器
part1:netrw(Vim 原生的文件管理器)简单介绍
- netrw文件管理器的样式
- netw常规操作说明
part2:打开方式
用一个指向目录的路径启动 Vim 的话,Vim 就会打开一个文件管理器窗口
- 方式1:下面是最常用的打开方式
细节:注意
:edit
和.
之间的空格可以省略
- 工作目录:
.
代表的是工作目录(:pwd
的结果),执行:edit .
命令,就会在文件管理器里打开工程的根目录- 当前目录:想在文件管理器里打开当前文件所在的目录,可以输入
:edit %:h
- 方式2:如果想用分割窗口的方式,可以尝试使用下面的命令(强烈推荐)
我们可以认为 Vim 的窗口有两种模式:一种模式针对文件,另一种针对目录:一个窗口一次只能显示一个
part3:扩展
netrw 插件不仅可以浏览文件系统,还可以创建新文件(参见
:h netrw-%
)及目录(参见:h netrw-d
),重命名已有的文件及目录(参见:h netrw-rename
),或是删除它们(参见:h netrw-del
)netrw 可以通过网络读写文件。该插件可以利用多种协议读写网络文件,包括 scp、ftp、curl及 wget,这取决于你的系统上可以用哪些协议。要了解更多这方面的内容,请查阅
:h netrw-ref
即使缓冲区的路径中包含了不存在的目录,Vim 仍允许我们对该缓冲区进行编辑,只是在我们试图将缓冲区写入文件时,Vim 会报错
本节介绍了该如何处理这种情况
1.场景:下面是
:eidt
打开一个不存在的目录时的情况(test_dir目录是存在的)
:eidt ./test_dir/areyouok.log
2.报错:此时,使用write命令会报错
3.补救:此时可以用外部的
mkdir
程序进行补救
以超级用户运行 Vim 的情况并不常见,然而有时我们不得不把修改保存到一个需要
sudo
权限的文件中无需重启 Vim 就能实现这一功能,我们可以把这个任务委派给一个以
sudo
运行的 shell 进程来完成示例:修改
/etc/hosts
文件(属于 root 用户,我们以“drew”登录,因此我们只具有该文件的读权限),出现不能保存的问题
- step1:查看
/etc/hosts
文件属性# ls -al /etc/ | grep hosts -rw-r--r--. 1 root root 209 Jun 17 03:58 hosts
- 1
- 2
- step2:以用户 drew 打开此文件,会出现只读标识
# whoami drew # vim /etc/hosts
- 1
- 2
- 3
- step3:保存(失败)
Vim 不会阻止我们修改一个只读缓冲区,但它不会让我们以通常的方法把修改保存到磁盘上
# :write E45: 'readonly' option is set (add ! to override) # :write! "/etc/hosts" E212: Can't open file for writing
- 1
- 2
- 3
- 4
补救:现在的问题是,我们没有写 /etc/hosts 文件的权限;此时如果修改的少,一种解决方案是重新用
sudo vim
打开文件,如果修改的太多,那只能在vim里使用sudo
命令了
- step4:vim中使用
sudo
命令# :w !sudo tee % > /dev/null Password: W12: Warning: File "hosts" has changed and the buffer was changed in Vim as well [O]k, (L)oad File, Load (A)ll, (I)gnore All:
- 1
- 2
- 3
- 4
- 5
Vim 需要与我们进行两次交互:1.输入用户
drew
的密码;2.vim给出了告警信息,我们要输入o
(保存修改),l
(重新将该文件载入缓冲区,相当于放弃修改)等按键解释
:write !{cmd}
命令:会把缓冲区的内容作为标准输入传给指定的{cmd}
,{cmd}
可以是任何外部程序- 权限:在本例中,
tee
程序将以sudo
权限运行,也就是说它拥有写/etc/hosts
文件的权限%
:在 Vim 命令行中,%
符号具有特殊含义;它会展开成当前文件的完整路径- 后半部分展开:
tee /etc/hosts > /dev/null
。这条命令会把缓冲区的内容当作标准输入,并用它来覆盖 /etc/hosts 文件的内容