之前的一系列文章主要介绍了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. SpringBoot Docker 发布到 阿里仓库

    1. 创建仓库 管理里面,可以查看详细的信息 设置登录密码 2. 接下来,将本地镜像推到阿里 : SpringBoot Docker 发布 docker commit 这部分可以不操作 docker ...

  2. Linux day2:文件和文件夹相关命令 文件内容编辑命令 Linux常用目录 Linux重要文件

    目录 问题说明 前期必备知识 系统运行命令 shutdown -c 快捷方式命令 ctrl+e 目录结构相关命令 mkdir -p 文件和文件夹相关命令 创建文件 touch 查看文件和目录 ls - ...

  3. VL02N、VL09交货单相关增强

    一.业务需求 当前台操作过账发货或冲销时,需要将数据实时同步到第三方系统,因此需要开发增强 在用户出口MV50AFZ1->userexit_save_document中加入接口逻辑即可 定期更文 ...

  4. 【MFC】CSingleLock的使用

    转载文章:CSingleLock的使用 // 先看看其代码: // 声明 class CSingleLock { // Constructors public: CSingleLock(CSyncOb ...

  5. Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别

    数组:.长度固定.可以存储基本类型,也可以存储引用类型.存储元素类型一致数组可以在内存中连续存储多个元素的构造,在内存中的分配也是连续的数组中的元素通过数组的下标进行访问的,下标从0开始的优点 :按照 ...

  6. 【Serverless实战】传统单节点网站的Serverles

    什么是函数?刚刚考完数学没多久的我,脑里立马想到的是自变量.因变量.函数值,也就是y=f(x).当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的 ...

  7. SpringCloud学习 系列二、 简介

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  8. 三、docker容器的常用命令

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  9. liunx基础概述

    一.liunx起源 1.1991,芬兰研究生Liunus Torvalds编写了liunx的代码,并上传到互联网 2.Liunx基于UNIX,但是有别与UNIX 3.Liunx的软件产品使用了社区开发 ...

  10. Web API接口返回实现类集合的姿势了解

    大家好,我是沙漠尽头的狼. 一. 问题描述 如下图,定义两个子类Student和Employ,都继承自抽象类PersonBase: public abstract class PersonBase { ...