• Vim实用技巧_4.管理多个文件(打开 + 切分 + 保存)


    vim可以同时处理多个文件,这一部分一定要学习,如果时间没有那么多,下面的技巧一定要重点看一下

    • 1.技巧39:将工作区切分成窗口;最常用的就是vspsp来分割窗口,来切换活动窗口,鼠标调节窗口大小
    • 2.技巧43:使用 netrw 管理文件系统;主要就是edit.Explore命令,结合技巧39能增加操作文件的层次结构

    管理多个文件

    Vim 允许在一个编辑会话中编辑多个文件,可以把工作区分成若干个分割窗口或标签页,每个窗口或标签页包含一个独立的缓冲区

    技巧036:用缓冲区列表管理打开的文件

    在一次编辑会话中,可以打开多个文件。用 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

    在这里插入图片描述

    技巧037:用参数列表将缓冲区分组

    参数列表易于管理,适用于对一批文件进行分组,使其更容易访问;:argdo命令可以在参数列表中的每个文件上执行一条 Ex 命令

    下面列举一下平时可能用到的部分,详细看书籍相关章节

    示例: :args 列表并不一定反映启动 Vim 时所传的参数

    用vim打开一些文件后,参数列表记录了在启动时作为参数传递给 Vim 的文件列表

    在这里插入图片描述

    提示:输出中的“[]”字符则指明了参数列表中的哪个文件是活动文件

    下面是填充参数列表的方法

    • 1.使用文件名

    在这里插入图片描述

    • 2.使用命令

    在这里插入图片描述

    技巧038:管理隐藏缓冲区

    Vim 对被修改过的缓冲区会给予特殊对待,以防未加保存就意外退出

    本节将介绍如何隐藏一个被修改过的缓冲区,以及如何在退出 Vim 时处理隐藏缓冲区

    什么是隐藏缓冲区?

    在这里插入图片描述

    • a符号:当前是活动缓冲区(active),h符号:是一个隐藏缓冲区(hidden)

    • + 号:表示这个缓冲区被修改过且没有被保存到磁盘中,如果现在保存文件的话,缓冲区的内容就会被写入磁盘里,而 + 号也会消失

    提前总结一下:最有用的几个命令

    在这里插入图片描述

    在退出时处理隐藏缓冲区,下面是常用的方式

    • 1.推出是报错、处理

    在这里插入图片描述

    下面是实际操作的效果图

    在这里插入图片描述

    • 2.多个隐藏缓冲区的处理

    在这里插入图片描述

    技巧039:将工作区切分成窗口

    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

    技巧040:用标签页将窗口分组

    在 Vim 里,我们可以用标签页把窗口组织到一系列工作区里;标签页是可以容纳一系列窗口的容器

    :edit 命令打开一个文件时,Vim 却不会自动创建一个新标签页,而是会创建一个新缓冲区,并把该缓冲区显示到当前窗口

    暂时不需要这个功能,未整理

    打开及保存文件

    技巧041:用:edit命令打开文件

    在 Vim 中,:edit 命令允许通过文件的绝对路径或相对路径来打开文件。另外,我们也将学会如何指定一个相对于活动缓冲区的路径

    • 相对于当前工作目录打开一个文件

    当 Vim 启动时,它会采用 shell 的活动目录作为其工作目录。这一点可以通过执行:pwd (print working directory,这和 bash 是一样的)命令得到印证

    :edit {file} 命令可以接受相对于工作目录的文件路径

    • 相对于活动文件目录打开一个文件

    :edit打开时,可以用 键自动补全文件路径

    在这里插入图片描述

    技巧042:使用:find打开文件

    find 命令允许我们通过文件名打开一个文件,但无需输入该文件的完整路径

    • 引入原因

    工作的工程中包含了多级嵌套目录呢?每次打开文件都得输入完整路径,这着实令人生厌。这就是为什么要引入 :find 命令的原因

    • path设置

    注意:要想利用此功能,我们首先要配置 ‘path’ 选项;‘path’ 选项允许我们指定一些目录,当调用 :find 命令时,Vim 会在这些目录中进行查找

    顺序:可以先使用:set path?查看路径时候在设置中,如果不在,使用 :set path+=路径将需要的路径添加好(只对当前vim有效,关闭vim失效,想一直有效就要修改vimrc配置文件),再用:find查找

    下面是path的默认情况(使用:h path查看):

    在这里插入图片描述

    技巧043:使用 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

    技巧044:把文件保存到不存在的目录中

    即使缓冲区的路径中包含了不存在的目录,Vim 仍允许我们对该缓冲区进行编辑,只是在我们试图将缓冲区写入文件时,Vim 会报错

    本节介绍了该如何处理这种情况

    在这里插入图片描述

    • 1.场景:下面是:eidt打开一个不存在的目录时的情况(test_dir目录是存在的)

      :eidt ./test_dir/areyouok.log

      在这里插入图片描述

    • 2.报错:此时,使用write命令会报错

      在这里插入图片描述

    • 3.补救:此时可以用外部的mkdir程序进行补救

    在这里插入图片描述

    技巧045:以超级用户权限保存文件

    以超级用户运行 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 文件的内容

    参考

    • 《Vim实用技巧》,书籍写的很好,强烈建议读一读
  • 相关阅读:
    快速搭建接口自动化测试框架
    vim打开文件时执行命令
    抽象类和接口
    恒生电子笔试题
    网络学习(十) | 深入学习HTTPS与安全传输
    一文讲解Linux内核中的设计模式
    J2EE基础-自定义MVC(中)
    含文档+PPT+源码等]精品基于SpringCloud实现的商品服务系统-微服务毕业设计项目源码-分布式毕设项目[包运行成功]
    降噪蓝牙耳机哪个牌子好?最便宜的蓝牙主动降噪耳机推荐
    linux使用脚本安装redis
  • 原文地址:https://blog.csdn.net/weixin_44531336/article/details/126187768