Vim 管理多个文件

来源:互联网 发布:淘宝售假是什么意思 编辑:程序博客网 时间:2024/06/02 02:22

Vim 允许我们同时在多个文件上工作。 

缓冲区列表:记录了一次编辑回话中打开的所有文件。

参数列表:是缓冲区列表的强烈补充。:args 命令可以把缓冲区的文件分组,然后就可以遍历这个参数列表。

  或者采用 :argdo 命令在参数列表中的每个文件上执行 Ex 命令。


Vim 还会允许把工作区划分成窗口。

Vim 可以利用标签页将分割的窗口组织到一起。


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

------------------------------------------------------------------------------------------------------------------------------------------------

在一次编辑回话中可以打开多个文件,使用Vim的缓冲区列表可以对这些缓冲区文件进行管理。

我们编辑的只是文件在内存中的映像,也就是vim中的“缓冲区”。


1. 文件是存储在磁盘上的,而缓冲区是存在于内存中的。当Vim打开一个文件的时候,该文件的内容会被读入一个具有相同名字的缓冲区中。

2. 刚开始,缓冲区中的内容和文件中的内容完全相同。但是当我们读缓冲区进行编辑的时候,差别就会体现了。

3. 如果我们保存这些修改,就可以把缓冲区的内容写回到文件中。

4. Vim中的绝大部分命令都在操作缓冲区,当然也有一些命令操作磁盘上的文件:  :write,  :update  :saveas 命令。


:ls 命令 可以列出来所有的缓冲区。 ("缓冲区列表")

:bnext 前往下一个缓冲区

:bprev 前往前一个缓冲区

:bfirst  跳转到列表的开头

:blast  跳转到列表的结尾


%符号指示 哪个缓冲区在当前窗口中可见, #符号表示轮换文件。按下 <C-^> 可以在当前文件盒轮换文件之中快速切换。

:ls 列表的开头有一个数字,它是在缓冲区创建的时候由Vim自动分配的编号。

我们可以用 :buffer n  命令直接凭编号跳转到一个缓冲区。

或者用更加直观的 :buffer {bufname}格式实现同样的功能。 {buffername}只需包含文件路径中唯一标识此缓冲区的字符即可。并且可以使用<Tab>补全。


:bufdo  命令允许我们在 :ls 列出的所有缓冲区上执行 Ex命令。 


删除缓冲区:

:bdelete N1 N2 N3   删除几个缓冲区,N1是缓冲区的编号。

:N,M bdelete 删除编号范围内的缓冲区。


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

Vim内置的缓冲区管理功能缺乏灵活性。如果我们想要对缓冲区进行组织,时期满足工作过程的需要,使用缓冲区列表并不是最佳的选择。

相反最好是把工作区域分成多个分割窗口,标签页,或是使用参数列表


技巧37  使用参数列表将缓冲区分组

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参数列表易于管理,适用于对一批文件进行分组,使其更加容易访问。

用 :argdo 命令可以在参数列表中的每一个文件上执行一条 Ex 命令。


:args 打印参数列表的内容

输出如下: [a.txt] b.txt c.txt d.txt e.txt


:args  {arglist} 可以向参数列表中增加新的文件(其实也就是增加缓冲区)

{arglist} 可以包括文件名,通配符,甚至是一条shell 命令的输出结果。

举例:

:args index.html app.js 增加缓冲区,如果此时文件中含有index.html 和 app.js这样子的文件,那么会读取到对应的缓冲区中。

当切换缓冲区的时候,如果此时缓冲区已经修改,但是没有保存,就不可以切换缓冲区。如果强制切换的话, 对缓冲区的修改会丢失。


也可以用 Glob  模式指定 {arglist}的文件

-------------------------------------------------------------------------------------------------------------------------

* 匹配0个或者多个字符, 但是它的范围仅仅是局限于指定的目录,而不会递归其子目录。

** 可以匹配0个或者多个字符,但是它可以递归进入指定的子目录。

举例:

Glob 模式 所匹配的文件

:args *.* index.html

app.js


:args **/*.js app.js

lib/framework.js

app/controller/Mailer.js

....etc

:args **/*.* 可以匹配所有的文件(递归进入所有的子目录)


这就体现出了差别,采用edit 编辑文件的时候,一次只能编辑一个文件, 不能编辑多个文件。但是 args 命令可以编辑多个文件。


就像我们可以在{arglist} 中使用多个文件名一样

我们也可以指定多个Glob模式 

:args **/*.js **/*.css  我们想构造一个指包含.js和.css文件,但是不包含其它类型的文件的参数了列表。


用反引号结构指定文件

---------------------------------------------------------------------------------------------------------------------------------

:args 'cat chapter'

会将shell 命令cat  chapter的执行结果作为 args的输入。


使用参数列表。

参数列表比缓冲区列表更加容易管理,这使得其成为对缓冲区进行分组的理想方式。

通过使用 :args {arglist} 命令,一下子就可以清空并且重新设置参数列表,接着就可以使用 :next  ;prev 命令遍历参数列表中的文件。

或者是使用 :argdo 命令在参数列表的每个缓冲区上都是执行同样的一条命令。


技巧38  管理隐藏的缓冲区

--------------------------------------------------------------------------------------------------------------------------------------------------------------

当对一个缓冲区进行修改之后,如果要切换缓冲区,Vim会阻止。

如果采用 :bnext! 的方式强制切换缓冲区,那么这个未修改的缓冲区就会成为一个隐藏(hidden)的缓冲区。



退出的时候处理隐藏缓冲区

但是,当我们想要关闭编辑会话的时候,Vim就会提醒我们某个缓冲区中有未保存的修改: (现在也终于理解了  会话是什么概念 )

:quit

会输出: No write since last change (add ! to override)


Vim会把一个有改动的缓冲区载入当前的窗口,这样我们就可以决定如何处理它。

如果想要保留修改,可以执行 :write 命令把缓冲区保存到文件中。

:edit!  重新从磁盘读取文件,这样会用文件的内容覆盖缓冲区的内容。当缓冲区的内容和磁盘的文件一致之后,我们就可以再次执行 :quit 命令了。



:w[rite]   把缓冲区的内容写入磁盘

:e[dit]     把磁盘文件的内容读入缓冲区 (即回滚所做的修改)。

:wa[ll]!   把所有修改之后的缓冲区都写入磁盘

:qa[ll]!  关闭所有的窗口,摒弃修改而无需警告。


在运行 argdo 和 bufdo"命令之前,启动 "hidden"设置。

如果 :argdo {cmd} 的命令执行方式为:

: first

:{cmd}

:next     /*如果对上一个缓冲区修改之后,就无法跳转到下一个缓冲区,但是启用 hidden 设置之后就可以了,Vim 会将其设置为隐藏的缓冲区*/

:{cmd}

etc.


启用了 "hidden"设置,可以让我们修改一组缓冲区。

:argdo write  保存所有的缓冲区

:wall  也是保存所有的缓冲区


技巧39   将工作区切分窗口

----------------------------------------------------------------------------------------------------------------------------

窗口是缓冲区的显示区域。

我们可以打开多个窗口,显示同一个缓冲区, 也可以每个窗口显示不同的缓冲区。


创建分割窗口

<C-w>s 水平切分窗口

<C-w>v  垂直切分窗口

这样分割之后的窗口显示同一个缓冲区。

我们可以使用 :edit 命令把另一个缓冲区载入活动窗口中。


<C-w>s        水平切分缓冲区,新窗口显示当前缓冲区

<C-w>v 垂直切分窗口,新窗口显示当前缓冲区

:sp[lit] {flile} 水平切分窗口,新窗口载入 {file}

:vsp[lit] {file} 垂直切分窗口,新窗口载入 {file}



在窗口之间进行切换

------------------------------

<C-w>w 在窗口之间循环切换

<C-w>h 切换到左边的窗口

<C-w>j 下边的

<C-w>k 上边的

<C-w>l 右边的



<C-w>w 和命令 <C-w><C-w>是一样的, 但是后者更加好按一些。可以一直按住Ctrl 然后按下 ww键。


关闭窗口

-------------------------------------------------

Ex 命令 普通模式命令用途

:clo[se] <C-w>c关闭当前活动窗口

:on[ly] <C-w>o只是保留活动窗口,关闭其他所有窗口。



改变窗口大小 以及重新排列窗口

-------------------------------------------------

可以用鼠标改变



技巧40  用标签页将窗口分组

------------------------------------------------

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


:lcd {path}  命令可以让我们设置当前窗口的本地工作目录。不是标签页的工作目录,是当前窗口的工作目录

:windo lcd {pat}可以让我们这是这个标签页所有的窗口的本地工作目录。


打开以及关闭标签页

-----------------------------

tabedit {file}  命令可以打开一个新的标签页,如果省去了{filename}参数,那么Vim会创建一个新的标签页,这个标签页会包含一个新的缓冲区。

如果当前标签页包含了不止一个窗口,我们可以用 <C-w>T 命令把当前窗口移动到一个新的标签页中。

:tabclose 可以关闭当前标签页

:tabonly  保留当前标签页,关闭其他标签页。


在标签页之间相互切换

----------------------------------

Ex 命令 普通模式命令用途

:tabn[ext] {N} {N}gt 跳转到编号为n的标签页

:tabn[ext] gt跳转到下一个标签页

:tabp[revious] gT 跳转到上一个标签页


重新排列标签页

----------------------------------

:tabmove [N]   命令重拍标签页。

如果 [N]是0,当前标签页会被移动到开头。

如果省去了 N, 当前标签页会被移动到结尾.










































0 0