Vim实用技巧-文件及跳转

Vim实用技巧-文件及跳转

[TOC]

管理多文件

用缓存列表追踪打开的文件

我们常常会说我们正在编辑一个文件,其实不是这样,我们只是打开了一个内存展示我们的文件,在Vim中叫做Buffer.

文件存在硬盘,而buffer保存在了内存当中

比如我们打开了两个文件

1
vim *.txt

*.txt可以打开目录下的两个文件a.txtb.txt因此会用Vim打开两个文件,当Vim启动的时候,会显示一个窗口.窗口内的缓冲区对应第一个文件,虽然另一个文件不可见,但是内容已经被载入到另一个后台缓冲区了.

我们可以在Vim中查看他们

1
:ls

这个命令会列出所有缓冲区中的Vim文件.

1
2
1 %a   "a.txt"                        line 1
2 "b.txt" line 0

%表示当前哪一个文件是可见的

  • 我们用:bprev:bnext来在列表里面做正向或者反向的移动
  • 也可以用:bfirst:blast跳到头文件和最后的文件

比如说我们用:bnext跳到下一个文件,这是再执行:ls

可以看到A文件前面多了一个#

1
2
1 #    "a.txt"                        line 1
2 %a "b.txt" line 1

这代表我们可以用<C-^>快速的切换文件

:bn:bp也可以快速的切换缓存区中的文件,但是还是比较麻烦,我们可以用

插件中的配置

1
2
3
4
5
6
nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> ]b :bnext<CR>
nnoremap <silent> [B :bfirst<CR>
nnoremap <silent> ]B :blast<CR>

https://github.com/tpope/vim-unimpaired

可以看到每个文件中前面都有一个数字,这是是buffer自动分配的我们可以用:buffer N来切换到对应数字的buffer中.

或者用:buffer {bufname}来跳转,bufname在路径有一个唯一标识此缓冲区的字符即可,若匹配到了多个文件用tab进行切换.

删除缓冲区

我们可以用:bdelete命令删除缓冲区

1
2
:bdelete N1 N2 N3
:N,M bdelete

比如如下就可以删除1号buffer中的文件

1
:bd 1

Vim提供的buffer不够灵活,我们可以用另一个办法将缓冲区分组

参数列表管理缓冲区

参数列表易与管理,适用于将文件进行分组,并且容易导航,我们:argdo命令,可以在参数列表中对每一个文件运行一个Ex命令

比如我们打开了五个文件a,b,c,d,e

执行:args

1
[a.txt] b.txt c.txt. d.txt e.txt

当不带参数的执行:args那么这些文件就会在里面了,如果我们带了参数呢?

首先我们打开vim,然后我们执行

:args index.html app.js

:args

我们可以看到两个文件已经被加入到参数列表里面了

用通配符指定文件

*用于匹配0个或者多个字符,它的范围局限于指定的目录,而不会递归其子目录,**通配符也匹配0或者多个字符,它可以递归进入指定目录的子目录.

image-20190625004746522

用反引号指定文件

我们可以创建一个文件包含了所有要编辑文件的目录,然后执行

1
args `cat .chapters`

Vim会在shell中执行反引号里面的命令,再把cat输出作为args的番薯.

管理隐藏的缓冲区

Vim在对修改过的缓冲区给予特殊的对待,以防未加保存就意外退出.在shell中,启动如下命令Vim:

1
2
cd code/files
vim *.txt

它将会把所有的.txt文件加入到缓存区中,首先我们先对a.txt做修改,然后看一下缓冲区列表:

1
2
1 %a + "a.txt" line 1
2 "b.txt" line 0

a前面有一个+号,表示缓冲区已经修改过了,如果保存文件,就会写入到磁盘里,+也会消失,我们先试着切换一下缓冲区:

1
:bnext

Vim会弹出一条错误的信息,说当前缓冲区有未保存的改动,我们试一下

1
:bnext!

这时候会跳到b.txt文件

如果执行:ls命令,就会发现b.txt被标记为a(active),表示当前是活动缓冲区,a.txt被标记为h为隐藏缓冲区.

如果我们执行quit,vim会将a.txt显示到最前面,如果执行:write则保存修改如果执行:edit!则表示要重新修改这个缓冲区.

如果不想所有文件就执行:qall!命令.

image-20190625010223079

启用hidden设置

整默认情况下,如果我们从一个改动过的Buffer跳到另一个Buffer,我们的命令必须全部加上!

如果我们启用了hidden选项的话,那么就可以不带末尾的!来执行了,如果Buffer的内容被修改,Vim会自动将其设置为hidden,比如我们可以在最后写完了所有文件后,执行

argdo write 或者 wall保存所有的缓冲区

分割窗口

不多做描述

image-20190625011517586

这里需要注意的是在窗口中切换比较常用

image-20190625011639083

窗口的关闭:

image-20190625011701364

窗口大小调整:常用的是<C-w>=<C-w>_

image-20190625012108318

使用标签将窗口分组

打开以及关闭tab

如果没有指定filename则会显示noname

image-20190625012600103

在tab中切换

第一条命令,可以指定切换到第几个tab

image-20190625012742419

打开文件并保存到磁盘

用:edit打开文件

此命令允许打开一个绝对路径和相对路劲的文件.

假设我们正在编辑 app/controllers/Navigation.js,紧接着我们要编辑同一目录下的 Main.js

可以尝试

1
:edit %<Tab>

其中%的意思是缓冲区的完整文路径

1
:edit %:h<Tab>

:h的意思是去除文件名,我们会得到此路径

1
➾ :edit app/controllers/

之后就可以拿到main.js

我们可以做个映射来讲%%替换为%:h

1
cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'

使用:find打开文件

:find可以直接打开一个文件而不需要完整的路径,想用此功能,首先要配置path选项

若果我们不配置path会出现错误,因此配置此path

1
:set path+=app/**

**会匹配所有的目录,

我们可以使用rails.vim来进行路径管理

使用netrw管理文件系统

这个是vim的标准插件,我们需要再vimrc汇总加入以下配置

1
2
set nocompatible
filetype plugin on

然后可以使用vim .进入文件管理系统

image-20190625021558619

我们可以用进入目录或者用-返回上一级目录

在我们打开了一个文件的时候也可以用:edit .打开目录,也可以用:Explore,对应的缩写是:

image-20190625022301889

其还提供了:Sexplore和:Vexplore命令,用于水平以及垂直窗口分屏管理文件

我们可以使用<C-^>来切换会之前的页面

其还可以通过网络来读写文件….这是最牛逼的功能,可以用:h netrw-ref来查看

把文件保存到不存在的目录当中

比如说我edit了一个不存在的目录,之后写入,它会报错

1
2
:edit madeup/dir/doesnotexist.yet 
:write

这时候我们可以调用!make -p %:h来补救,之后执行:write即可

超级用户权限保存文件

我们常常比如修改hosts文件,我们没有权限.先打开后看看权限<C-g>

1
"/private/etc/hosts" [readonly] line 1 of 20 --5%-- col 1

如果我们执行了wirte!它会告诉我们没有写入权限

我们可以执行以下这句

1
:w !sudo tee % > /dev/null

在这里tee将以root权限运行,%为完整路径,因此这段话就是tee /etc/hosts > /dev/null这里将缓冲区的内容当做标准输入,并覆盖/etc/hosts文件的内容

谢谢您的鼓励~