上一章一直在讲的是vim的文本的操作,本章主要讲的是vim的文件操作。

  本章的有些概念和传统的文本编辑器也不尽相同。所以需要注意概念或者切切说是思维习惯的区别。

  vim 允许在一个编辑会话中编辑多个文件,我们既可以每次显示一个文件,也可以把工作区分成若干个分割窗口或标签页,每个窗口或标签页包含一个独立的缓冲区。

概念

  在开始学习之前,有必要先弄清楚几个重要的概念:文件、缓冲区、窗口、标签页。以及,他们之间的关系是什么

文件

  这里的文件,指的是存储在磁盘上的文件。在工作过程中,我们通常会说“我们正在编辑一个文件”,但真实情况并不是这样,vim编辑的并不是文件。

缓冲区

  那vim编辑的是什么呢?vim编辑的是文件在内存中的映像,也就是 Vim 术语中的“缓冲区”。

  当 Vim 打开一个文件时,该文件的内容被读入一个具有相同名字的缓冲区。刚开始,缓冲区的内容和文件的内容完全相同,但当我们对缓冲区做出修改时,二者的内容就会出现差别。如果我们决定保留这些修改,就可以再把缓冲区的内容写回到文件里。所以其实我们在vim操作的文本都是针对于缓冲区。

  编辑文件的步骤:

  1. 从文件读到缓冲区
  2. 修改缓冲区的文本。此时原始文件里的文本不会做任何的变化。
  3. 把缓冲区写到文件。此时原始文件的文本才重新又和缓冲区一致。

窗口

  窗口是缓冲区的显示区域。决定要把哪个缓冲区的内容显示在这个区域。

  我们既可以打开多个窗口,在这些窗口中显示同一个缓冲区,也可以在每个窗口里载入不同的缓冲区。

  所有的窗口共享同一个缓冲区列表,即在内存的所有缓冲区。

  缓冲区有以下几个状态:

  • 活动状态:处于这个状态的缓冲区被显示在窗口上。如果一个文件对应的缓冲区被载入内存,一般处于这个状态。
  • 隐藏状态:处于这个状态的缓冲区不会被显示在窗口上。
  • 非活动状态:处于这个状态的缓冲区不会被显示在窗口上。并且什么内容也没有。???具体什么情况,我也还没弄清楚。

标签页

  一个标签页是一系列窗口的集合或者说容器。这里的标签页和其他编辑器的还不太一样。其他的编辑器一个标签页对应的是一个文件对应的缓冲。但是在vim里,一个标签页,更多时候像一个工作空间。

  假设我们正在处理某个工程中的文件,并且已经把工作区分成了几个窗口。然后,突然接到一项紧急任务,我们不得不马上切换工作内容。我们不想在当前标签页里打开新文件,因为这会把我们精心布置的工作区弄乱。此时,我们可以新创一个标签页,并在此标签页中工作。当我们准备继续做原来的工作时,只需切回原来的标签页即可,所有的窗口都保持着我们离开时的模样。

文件

  虽然这里标题叫文件,但是这里面讲的基本上的缓冲区,也稍微涉及到窗口等其他概念。下面会围绕着文件操作的生命周期来展开描述。

  注意事项

  • 所有的操作基本都可以强制操作。统一规则是: :动作!。在动作后面加一个"!"。

打开

  打开文件,指的是把硬盘上的文件的文本读入到内存里,生成一个缓冲区,这个缓冲区的名字和文件名一致。

  打开的方式:

  • 如果还没有打开vim。可以通过"vim file1 file2 ..."直接打开
  • 如果已经打开vim,想在vim里直接打开文件,可以使用:edit来完成。
  • 如果已经打开vim,不知道具体的文件路径,还可以通过:find来完成。

  这里有需要注意的点是:打开文件的路径。

  允许通过文件的绝对路径或相对路径来打开文件。绝对路径好理解,就不赘述了。下面主要说一下相对路径。

  在打开文件,需要输入文件相对路径时结合自动补全命令(Tab和<C-d>)很爽。

相对于当前工作目录

  查看当前工作目录:pwd

  切换当前工作目录:cd

  注意事项

  • cd的时候有一个特殊符号:"-",表示上一次的目录 。使用:cd - 就可以切回上一个目录。

相对于活动文件目录

  有的时候,我们在编辑一个文件A。这个文件A并不在当前的工作目录下。此时,我们又想编辑另一个文件B,这个文件B和文件A在同一个目录。

  一种做法是输入从工作目录开始的路径,直到抵达该文件,然而这似乎有点儿舍近求远。想打开的文件和活动缓冲区中的文件在同一个目录里,如果能用活动缓冲区作参考点岂不是更理想吗

  % 符号代表活动缓冲区的完整文件路径。%:h去除文件名,但保留路径中的其他部分(这里当前于目录的路径)。

:e %:h<Tab>Ma<Tab>

#输入%:h<Tab>会被展开为当前文件所在目录的路径 

通过查找打开文件

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

  只要给出了一个文件的完整文件路径,我们始终可以用:edit 命令打开此文件。然而,如果我们工作的工程中包含了多级嵌套目录呢?每次打开文件都得输入完整路径,这着实令人生厌。这就是为什么要引入:find 命令的原因。要想利用此功能,我们首先要配置‘path’ 选项。

  要想利用此功能,我们首先要配置‘path’ 选项。:set path+={path}

  {path}支持通配。

:set path+=./**

# ** 通配符会匹配当前目录下的所有子目录
# * 和 ** 在'path' 设置中的处理与前文略有不同
# 更多详情查看:h file-searching

  输入文件名后,然后按一下<Tab> 键,Vim 就会在命令行上展开第一个匹配文件的完整文件路径;再按一次<Tab> 键,又会换成下一个匹配文件的完整文件路径

列表

  显示缓冲区列表。语法: :files|:buffers|:ls ,这三个都可以。不过我一般比较懒,喜欢少打几个字,一般使用:ls

  

  请注意状态区,就是截图的部分。这里面有4个位置:第一位(u),第二位(#,%),第三位(h,a),第四位(+)。

  1. 第一位:这个一般是没有的。如果有的话是u,表示用于显示帮助文档。 一般可以设置没有这个状态,通过:setlocal nobuflisted设置就可以
  2. 第二位:%表示的是当前活动(窗口显示)的缓冲区,#表示的是上一个活动的缓冲区。
  3. 第三位:缓冲区的状态。上面说过了。a表示激活状态,h表示隐藏状态
  4. 第四位:表示当前文件的状态
    1. - :不允许修改
    2. =:只读
    3. +:已经被修改过
    4. x :载入的时候错误

切换

  窗口只显示一个缓冲区,那如何在不同的缓冲区切换呢?

  在cmd-line模式下的切换语法

命令 用途
:bn 切换到下一个缓冲区
:bp 切换到上一个缓冲区
:b{buffername} 切换名为{buffername}的缓冲区
:b{n} 切换到编写为n的缓冲区
:bfirst 切换到第一个缓冲区
:blast 切换到最后一个缓冲区
:b# 切换到上一个显示的缓冲区

  可以通过映射更快捷的来切换。

  

保存

  把缓冲区的文本写入文件中。需要注意的是,只要没保存之前,所有的操作就是在缓冲区操作的。对原始的文件根本没有任何影响。

  这个语法在cmd-line模式的动作里已经说过了。就不在这里说了。对应的是:w。

删除

  

删除一个缓冲区并不会影响缓冲区所关联的文件,而只是简单地把该文件
在内存中的映像删掉

  语法:bd {buffername}

退出

  其实退出的是窗口

  语法:q

窗口

分隔

  有很多种分隔方式,每种略微不一样

通过vim分隔

  在还没打开文件之前,想就分隔,可以使用。

  语法:vim -(o|O) file1 file2 ...

  • o(小写o)代表的是横向分屏
  • O(大写o)代表的是竖向分屏。

通过快捷键

  如果想对当前窗口分屏,可以直接使用快捷键。

  • <C-w>s |<C-w><C-s>  表示的是横向分屏
  • <C-w>v |<C-w><C-v>  表示的是竖向分屏

通过ex命令

  如果在当前窗口,想对其他文件分屏,可以使用ex命令

  • :vs file   表示的是竖向分屏
  • :sp file   表示的是横向分屏

  注意事项

  • 如果不跟 file ,则相当于对当前文件分屏

设置大小

  一般是在分屏的情况下,有些屏想当作主屏,可以把这个窗口设置显示大些。

操作 用途
z{height} 设置窗口大小。一般比较喜欢这个用法,操作起来快。
<C-w>- 减少窗口大小
<C-w>+ 增加窗口大小
<C-w>= 所有窗口等宽、等高
<C-w>_ 最大化活动窗口的宽度
<C-w>| 最大化活动窗口的高度

  更多详细可以参见 :h window-resize

移动

  移动指的是移动光标位置

操作 用途
<C-w>h 光标移动到左边的窗口
<C-w>j 光标移动到下面的窗口
<C-w>k 光标移动到上面的窗口
<C-w>l 光标移动到右边的窗口
<C-w>t 光标移动到最顶端的窗口
<C-w>b 光标移动到最底端的窗口
<C-w>w|<C-w><C-w> 光标在窗口中循环移动

布局

  想移动窗口在标签页中显示的位置

操作 用途
<C-w><S-h> 把当前窗口移动到最左侧
<C-w><S-j> 把当前窗口移动到最下面
<C-w><S-k> 把当前窗口移动到最上面
<C-w><S-l> 把当前窗口移动到最右侧

关闭

  关闭窗口,窗口显示的缓冲区还在内存中。关闭窗口有这几类

  • 关闭当前窗口 。语法: :q|:clo[se]
  • 关闭其他窗口(除了当前窗口的当前标签页的其他窗口)。语法: :on[ly]
  • 关闭当前标签页所有窗口。语法 :qall

标签页

  用 Vim 的标签页可以把工作分隔到不同的工作区。Vim 中的标签页更像是Linux 中的虚拟桌面,而不是像其他文本编辑器中的标签页。

  在 Vim 中,标签页是可以容纳一系列窗口的容器(参见:h tabpage )

  Vim 的标签页与缓冲区并非一一对应的关系,相反,应该把标签页想成容纳一系列窗口的容器


  


打开

  用:tabedit {filename} 命令可以打开一个新的标签页, 如果省略了{filename} 参数的话,那么 Vim 会创建一个新标签页,里面包含一个空缓冲区。

  还有一种做法,如果当前标签页中包含了不止一个窗口,我们可以用<C-w>T 命令把当前窗口移到一个新标签页中(参见:h CTRL-W_T )。

  在任何命令打开一个窗口的Ex命令前端加一个":tab",则会打开一个新的标签。特别是在使用帮助文档时特别好用。比如: tab h gt

切换

  切换当前活动的标签页

Ex命令 普通模式命令 用途
:tabn {N} {N}gt 切换到编号为{N}的标签页
:tabn gt 切换到下一个标签页
:tabp gT 切换到上一个标签页

重排

  重新排序标签页。

  用:tabmove [N] 命令可以重新排列标签页。当[N] 为0 时,当前标签页会被移到开头;如果省略了[N],当前标签页会被移到结尾。如果你的终端支持鼠标,或是你正在使用GVim,那么你也可以通过鼠标拖曳来进行重排操作。

关闭

  关闭标签,只是关闭标签页下面显示的窗口。关闭标签页有这几类

  • 关闭当前标签页 。语法: :tabc[lose]
  • 关闭其他标签页(除了当前标签页的当前标签页的其他标签页)。语法: :tabon[ly]

 

菜鸟vimer成长记——第3章、文件的更多相关文章

  1. 菜鸟vimer成长记——第0章、我眼中的vim学习

    这是一系统总结vim的学习文章,记录我自己学习vim的过程和感悟.与此同时也想分享出来给大家,欢迎大家互相讨论和学习. 在这里假设你们对vim已经有了一些基本的认识或者说已经使用过几个月的vim.该系 ...

  2. 菜鸟vimer成长记——第1章、统一概念

    不管学什么技术,我都深信概念是最重要的.是影响整个学习轨迹,决定能在这个技术领域高度. 当然如果你现在的目的不是在学习而在于解决问题(很多人不愿意承认,或者没发现),那概念就暂时没那么重要了. 目的 ...

  3. 菜鸟vimer成长记——目录

    菜鸟vimer成长记——第0章.我眼中的vim学习 菜鸟vimer成长记——第1章.统一概念 菜鸟vimer成长记——第2.0章.模式初探 菜鸟vimer成长记——第2.1章.normal模式 菜鸟v ...

  4. 菜鸟vimer成长记——第2.4章、cmd-line模式

    cmd-line模式又有3个类型:Ex 命令(ex commands).查找模式(Search patterns).Filter 命令(Filter commands).本文主要重点的是Ex 命令和S ...

  5. 菜鸟vimer成长记——第2.1章、normal模式

    目的 掌握normal模式下常用操作的语法和概念,这些操作对应的应用场景以及实用技巧. 通过normal模式举一反三掌握cmd-line和visual的常用文本操作. 简介 文本操作的理想状态为:一个 ...

  6. 菜鸟vimer成长记——第4.2章、编程插件

    简介 这部分的插件是与编程相关的插件.主要涉及两大块:所有编程语言通用的插件,以及各个语言独有的插件.插件的数量和合理性,这可能是一个不断累积和修正的过程. 个人感觉,现在比较适合sh,html,ma ...

  7. 菜鸟vimer成长记——第4.1章、通用插件

    简介 关于插件的分类,此系列只会简单的区分为通用插件和编程插件.通用插件的意思是,不基于任何编程语言都可以使用的插件.编程插件,是针对于编程习惯,或者说是针对于某种语言的插件. 计划中,是先把基本常用 ...

  8. 菜鸟vimer成长记——第4.0章、Vim插件管理利器-Vundle

    定义 Vundle是vim bunler和简称,它是一个vim插件管理器. Vim本身缺乏对插件的有效管理,安装插件并配置.vimrc文件非常不便.gmarik受到Ruby的bunler的启发,开发了 ...

  9. 菜鸟vimer成长记——第2.3章、insert模式

    大部分的Vim 命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些. 如果没有输入当前文件不存在的新文本的需求时,建议通过其他模式来操作完成. 目的 掌握inser模式下常用操作的语法和概 ...

随机推荐

  1. Linux setenforce命令详解[SeLinux操作]

    SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统. 关闭SELinux 临时生效: 命令临时 ...

  2. Nginx 泛解析配置请求映射到多端口实现二级域名访问

    由于想实现一个域名放置多个应用运行的目的,而不想通过域名后加端口号方式处理,这种方式处理记起来太麻烦,偷懒党简直不能忍,故而考虑了使用二级域名来处理多个应用同时运行.Google了一番资料并进行了尝试 ...

  3. web.config设置之system.webServer 详细介绍,为网站设置默认文档

    如何:为 IIS 7.0 配置 <system.webServer> 节2008-06-14 22:26http://technet.microsoft.com/zh-cn/sysinte ...

  4. ASP.NET MVC 5 开发环境配置

    Install-Package Ninject -Version 3.2.2 -ProjectName SportsStore.WebUIInstall-Package Ninject.Web.Com ...

  5. python3: 字符串和文本(3)

    11. 删除字符串中不需要的字符  strip() 方法能用于删除开始或结尾的字符: lstrip() 和 rstrip() 分别从左和从右执行删除操作 >>> s = ' hell ...

  6. Windows10自动更新之后,无线有线都连不上网

    大概浪费了我至少6个小时. 一个是无线网卡,这个后来可以修复,其实也不是网卡的原因.最主要的原因是 Realtek PCIe GBE Family Controller  这个驱动.只找到一个win1 ...

  7. Mina源码研究

    目录 1. NioSocketAcceptor初始化源码研究 1.1 类图 1.2 方法调用时序图 1.3 初始化NioSocketAcceptor 1.4 SimpleIoProcessorPool ...

  8. NSPredicate的使用

    简述 NSPredicate谓词条件过滤器,一般用于过滤数组数据,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 常用函数 创建谓词 + (NSPredicate *)predic ...

  9. 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  10. CSU 1547: Rectangle (思维题加一点01背包)

    1547: Rectangle Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitted: ...