之前的一系列文章主要介绍了vim文本相关的操作,并且也介绍了vim的几种模式。通过前面的内容,相信各位小伙伴们已经对vim有了一个基本的了解,同时也能够使用vim快速编辑文本,从这篇开始,我们将要介绍vim针对多个文件的操作,例如如何在多个文件中查找、跳转等等方式方法。让我们先从vim如何管理打开的多个文件开始吧

缓冲区列表简介

有过编程经验的小伙伴应该知道,将文件从磁盘读取到内存中时,都会事先分配一块内存缓冲区用来保存读取到的文件内容,vim同样是这么干的。

vim在读取文件时会通过内存映射的方式,将磁盘中的内容映射到一块内存的缓冲中。vim可以打开多个文件,每个文件独立的占有一个缓冲区。为了管理这些打开的文件,vim中有了缓冲区列表的概念,同时也提供了一些配套的命令来操作缓冲区列表。

假设现在在某个目录中有多个文件,我们使用vim同时打开,例如使用vim init.lua test.py。我们发现vim默认只展示一个文件中的内容,但是它打开了两个文件,现在有两个以文件名命名的缓冲区。通过命令:ls 查看当前打开的缓冲区。



:ls 命令显示的内容每一行代表一个缓冲区的信息。它显示的信息如下:

:ls
1 %a ".\test.py" line 1
2 ".\init.lua" line 0

第一列的数字代表缓冲区的编号,该编号由vim随机指定,第二列的%a 代表缓冲区为激活的缓冲区(active)当前窗口显示的内容为激活缓冲区的内容。第三列则是缓冲区的名称,一般vim会将文件名作为缓冲区的名称

我们可以使用:bnext:ls 的显示顺序,显示下一个缓冲区,:bprev 显示上一个缓冲区。:blast 显示最后一个缓冲区,:bfirst显示第一个缓冲区。



在切换过缓冲区之后再次执行:ls 之后发现此时显示的内容已有一些变化。现在显示的内容如下:

:ls
1 #h ".\test.py" line 1
2 %a ".\init.lua" line 1

此时我们发现除了%a 代表当前处于激活状态的缓冲区外,另外一个缓冲区的前面多了个#h# 代表上一次处于激活状态的缓冲区,我们可以使用<ctrl + ^> 来切换到上次处于激活状态的缓冲区。而h 则代表隐藏缓冲区,当一个缓冲区由激活状态变为非激活状态的时候,vim会将其标记为隐藏缓冲区。

除了按照顺序显示缓冲区,还可以通过缓冲区名称或者序号来指定显示某个缓冲区。例如使用:buffer 1 来显示编号为1的缓冲区。



还可以更直观的使用buffer {bufname} 来显示指定缓冲区,其中{bufname} 代表的是缓冲区的名称,例如:buffer init.lua



看到这里,各位小伙伴肯定会觉得不管使用:bnext 之类的命令切换还是使用:buffer 来切换缓冲区,都需要输入这么长的命令,显得既繁琐又低效,那么有没有什么办法来解决这个问题呢?答案是通过快捷键映射。后面介绍我自己的配置时会介绍如何将其映射到快捷键上

如果要删除某个缓冲区可以使用:bdelete {bufname}。该命令支持前面几篇文章中提到的范围操作,即:nstart, nend bdelete 来删除编号nstartnend 的所有缓冲区。缓冲区缓冲区编号是vim自己分配的,要通过编号删除得执行:ls命令,并且有时候删除了后续可能还要再次打开,再退一步说,如果暂时不想用它,vim也只显示后面打开的缓冲区,我们使用这个场景很少,除非有充足的理由,否则不会去删除它。

缓冲区列表参数

在实际开发项目的时候,我们会打开很多文件,如果仅仅使用上述介绍的命令会发现在管理上有诸多不便。例如项目中有ui文件、有python代码、也有c代码、甚至还有java代码,我现在要找一个名为showUserName 的函数,而且我很清楚我要的ui中的内容,但是在python、c或者java中都有类似的函数名,采用全局搜索肯定都搜出来了,但是我只想在ui文件中搜索。这就涉及到项目文件的模块化。使用上述命令肯定无法满足模块化的要求。这个工作可以使用列表参数来完成。

假设现在目录有3个python 文件,5个cpp 文件,还有2个txt 文件,我们按照文件类型进行分组打开,先打开cpp 文件

vim *.cpp

使用 :args 显示参数列表。



它输出的内容如下:

[a.cpp] b.cpp   c.cpp   d.cpp   e.cpp

该列表记录了通过命令行另vim打开的所有文件缓冲区。其中使用[] 包裹起来的是当前处于激活状态也就是当前窗口显示的的缓冲。注意请不要被这个名字迷惑了,它并不是传递给vim的参数,而是作为参数传递给vim的文件的列表。也就是这条命令所打开的文件的列表。本质上仍然是一个缓冲区列表

除了使用:args查看参数列表,也可以在:args 命令后添加缓冲区名称,例如:args init.lua 这样就将一个新的文件纳入之前的缓冲区列表中进行管理。后续可以将需要统一管理的缓冲区使用该命令添加进来,除了使用详细的文件名一个个添加之外,vim也支持使用通配符来进行匹配。甚至也可以在后面添加shell命令,以shell命令的输出作为缓冲区列表的参数,添加到参数列表,它的形式为

:args `cmd`



上述事例中,我们通过args 来将ls 输出的结果作为参数列表。再通过:ls 命令查看一下当前缓冲区列表,发现之前打开的仍然存在,只是我们将test.pyinit.lua 这两个文件形成一组作为缓冲区的参数列表。

当我们指定好了一组缓冲区列表参数之后,可以使用:next:prevfirstlast 在这组缓冲区列表中进行切换。

:args 命令本身也支持使用通配符来将所有匹配的文件名设置为缓冲区列表参数,例如:args *.py 将当前目录中所有py文件加入,或者使用:args **/*.py 来将当前目录下所有子目录中的py文件加入。一般来说使用shell命令或者使用通配符的方式居多,但是也有直接使用文件名的情况出现

后面我们可以根据参数列表,对列表中所有的缓冲区进行统一的修改或者在这些缓冲区中进行跳转之类的操作,当然这些等我们介绍到了对应的基础知识后再进行演示。

vim退出

好像现在才讲到退出操作已经有点晚了,很多用上vim的小伙伴肯定也搜到如何退出了。不知道怎么退出的,应该已经退坑了。但是我在这里并不介绍使用何种命令来退出。而是介绍vim如何处理未同步到磁盘上的缓冲区的。

我们随便打开多个文件,在任意一个或者多个缓冲区中执行o 或者其他能另其修改的命令。然后执行切换缓冲区的命令,例如:bnext 之类的,切换之后再次执行:ls

  1 #h + ".\init.lua"                   line 2
2 %a ".\test.py" line 1

我们发现在之前的基础之上,多了一个 + 它代表着这个缓冲区上的修改并未同步到磁盘文件中。此时如果执行:q 进行退出的话,会提示当前有缓冲区未同步到文件中,并且跳转到未同步的缓冲区。我们可以执行:w 来写入将缓冲区内容磁盘,也可以使用:q! 来忽略该缓冲区的修改,或者使用:edit!来强行的从磁盘读取内容并覆盖本次修改。这个时候vim将会切换到下一个未保存的缓冲区。如果嫌每次都这样比较麻烦,可以执行:qall! 忽略所有未修改的缓冲区并退出,或者使用:wall 来写入所有修改。

总结

本文到此就结束了,最后再来总结一下该文中使用到的命令和快捷键:

  • bnext: 切换到缓冲区列表中的下一个缓冲区
  • bprev: 切换到缓冲区列表中的下一个缓冲区
  • blast: 切换到缓冲区列表中的最后一个缓冲区
  • bfirst: 切换到缓冲区列表中的第一个缓冲区
  • <Ctrl+^>: 在上一个被激活的缓冲区和当前被激活的缓冲区之间进行轮换
  • args: 显示当前缓冲区列表参数。后面也可以跟上文件名、shell命令和通配符,设置对应的缓冲区列表参数
  • next: 切换到缓冲区列表参数中的下一个缓冲区
  • prev: 切换到缓冲区列表参数中的上一个缓冲区
  • last: 切换到缓冲区列表参数中的最后一个缓冲区
  • first: 切换到缓冲区列表参数中的第一个缓冲区

vim 从嫌弃到依赖(10)——缓冲区列表的更多相关文章

  1. vi/vim使用进阶: 文件浏览和缓冲区浏览

    原文:https://blog.easwy.com/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/ 本节所用命令的帮 ...

  2. Vim新手节省时间的10多个小技巧

    Vim新手节省时间的10多个小技巧 Vim 是很多开发者的首选编辑器,通过设置正确的命令和快捷方式,它可以帮你更快的完成工作.这篇文章我们为 Vim 新手提供一些快捷键等方面的小技巧,帮你提升工作效率 ...

  3. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  4. 零基础入门学习Python(10)--列表:一个打了激素的数组

    前言 有时候我们需要把一些东西暂时保存起来,因为他们有着一些直接或间接的联系,我们需要把它们放在某个组或者集合中,未来可能用得上. 很多接触过编程的朋友都知道,都接触过数组这个概念,那么数组这个概念事 ...

  5. vim 配置 jedi-vim( ubuntu:15.10 )

    确保 vim 支持 python3 或者 python 如果你已经安装了 vim, 可以通过vim --version, 在输出中找到 +python3 或者 +python 字样的话, 就可以跳过该 ...

  6. (四)、vim的缓冲区、标签、窗口操作

    1.缓冲区的基本操作 a.文件与缓冲区的区别 vim file1   打开一个文件时,其实是从磁盘中读取文件到内存中,文件的内容会被加载到缓冲区中, 这个缓冲区在一个窗口上显示,所以他是一个已激活的缓 ...

  7. 4. VIM 系列 - 认识VIM的缓冲区、窗口、标签页

    目录 1. 缓冲区 2. 窗口 3. 标签页 4. 设置一下热键 1. 缓冲区 文件和缓冲区的区别 vim 打开一个文件时,其实是从磁盘中读取文件到内存中,vim的一些操作其实是在操作缓冲区, 当使用 ...

  8. Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)

    网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...

  9. 第10章 网络安全(5)_访问控制列表ACL

    6. 访问控制列表ACL 6.1 标准访问控制列表 (1)标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件.即,所有的条件都是基于源IP地址的. ②基本不允许或拒绝整个协议组 ...

  10. vim 使用说明

    =========================================================本使用说明与 把VIM打造成IDE 配套======================= ...

随机推荐

  1. WPF 对Border 边框进行投影

    画一个 Border 对边框进行投影 <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.micr ...

  2. 解密Prompt系列23.大模型幻觉分类&归因&检测&缓解方案脑图全梳理

    上一章我们主要聊聊RAG场景下的幻觉检测和解决方案,这一章我们单独针对大模型的幻觉问题,从幻觉类型,幻觉来源,幻觉检测,幻觉缓解这四个方向进行整理.这里就不细说任意一种方法了,因为说不完根本说不完,索 ...

  3. 100天搞定机器学习|Day59 主成分分析(PCA)原理及使用详解

    数学概念 方差:用来衡量随机变量与其数学期望(均值)之间的偏离程度.统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数. $$Var(X)=\frac{1}{n}\sum(x_i- ...

  4. C#9.0:Improved Pattern Matching

    增强的模式匹配 C#9.0添加了几种新的模式.我们可以参阅模式匹配教程 ,来了解下面代码的上下文: 1 public static decimal CalculateToll(object vehic ...

  5. 解决Github中使用Octotree时,出现 Error: API limit exceeded 报错 或者 Error: Connection error报错的问题(详细操作)

    对于科研工作者来说,Github 是不可多得的利器,那么Octotree 插件的使用将会让用户在使用 Github 时拥有更好的体验,提高学习工作的效率.但是笔者在使用的过程中遇到以下这样的问题,下面 ...

  6. VueRouter和ReactRouter路由对比

    https://blog.csdn.net/xinxin_csdn/article/details/124652160

  7. el-date-picker 组件时间格式化方式

    1 <el-form-item label="安放龙骨时间"> 2 <el-date-picker 3 v-model="baseInfoForm.se ...

  8. idea 配置 service 服务,多模块同时启动

    转载请注明出处: 1,打开IDEA项目 .idea 下 的workspace.xml 2,查找"RunDashboard" 节点 3,添加如下内容 <option name= ...

  9. 他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险

    一.前言 新年就要到了,祝大家新的一年: 龙行龘龘, 前程朤朤! 白泽花了点时间,用 800 行 Go 代码写了一个控制台的小游戏:<模拟龙生>,在游戏中你将模拟一条新生的巨龙,开始无尽的 ...

  10. [转帖]OceanBase实验4:迁移MySQL数据到OceanBase集群

    服务器环境 1)12核48G,操作系统为centos 7.9系统,单节点三副本1-1-1集群. 2)源MySQL数据库:与OceanBase同一台服务器,版本为MySQL 5.7. 1.使用 mysq ...