第二部分 文件
第六章 管理多个文件
缓冲区 —— vim引入的增强功能
-
缓冲区是文件在内存中的映像,大多数Vim命令编辑的是缓冲区,也有一些命令针对文件进行操作,如
:write
,:update
及:saveas
-
常用命令:
命令 | 作用 |
---|---|
:ls |
列出所有缓冲区的列表(可以同时打开多个缓冲区,如vim *.txt |
:bn[ext] |
切换到列表中的下一个缓冲区 |
:bp[rev] |
切换到列表中的上一个缓冲区 |
:bf[irst] |
跳到列表的开头 |
:bl[ast] |
跳到列表的结尾 |
:buffer N |
可以凭编号跳转到指定缓冲区 |
:buffer {bufname} |
根据足以识别一个缓冲区的文件名字符段进行跳转,可以使用Tab 进行自动补全 |
:bufdo |
允许我们在所有 缓冲区上执行Ex命令,实际中更多使用:argdo ,见参数列表 |
:bdelete N1 N2 / :N,M bdelete |
删除缓冲区 |
:w[rite] |
把缓冲区内容写入磁盘 |
:e[dit] |
把磁盘文件内容读入缓冲区(即回滚所做修改) |
:qa[ll] |
关闭所有窗口,摒弃修改而无需警告 |
:wa[ll] |
把所有改变的缓冲区写入磁盘 |
【注】为方便遍历,可以使用下列映射 (unimpaired.vim插件)
nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> ]b :bnext<CR>
nnoremap <silent> [B :bfirst<CR>
nnoremap <silent> ]B :blast<CR>
- 缓冲区列表
1 %a + "1.txt" 第 1 行
2 #h + "2.txt" 第 2 行
3 "3.txt" 第 0 行
- 开头的数字是Vim自动为缓冲区分配的编号
%
表示当前窗口中的缓冲区#
代表轮换文件,按<C-^>
可以在当前文件和轮换文件间快速切换a
表示活动缓冲区(active)h
表示隐藏缓冲区(hidden),例如做出修改但没保存,直接:bnext!
跳转,原缓冲区就会隐藏- ⭐️ 当
:q
时,如果有未处理的隐藏缓冲区 ,Vim会将它加载入窗口中,此时可以使用:write
保存到文件,或者使用:edit!
重新从磁盘读取文件覆盖修改
- ⭐️ 当
参数列表 —— vi的功能
- 参数列表
[1.txt] 2.txt 3.txt
-
[]
指明当前活动文件 -
:args
打开参数列表 -
:next
切换到下一缓冲区 -
:prev
切换到上一缓冲区 -
:first
跳转到第一个缓冲区 -
:last
跳转到最后一个缓冲区
-
:args {arglist}
清空并重新设置参数列表的内容(实测是添加???)-
可以在任意时刻改变参数列表的内容!
-
{arglist}
可以包括文件名、通配符,甚至是一条shell命令的输出结果① 用文件名指定文件,如
:args index.html app.js
② 用Glob模式指定文件
-
*
通配符:匹配0个或多个字符,仅限指定目录内 -
**
通配符:匹配0个或多个字符,可以进入指定目录的子目录 -
* + ** + 部分文件名或目录名
构造出来的就是Glob模式例如
:args **/*.*
可以匹配当前目录和所有子目录中有后缀名的文件,包括c.js
,b/c.js
,a/b/c.txt
等 -
可以使用多个Glob模式,如
:args **/*.js **/*.css
③ 用反引号结构指定文件
- 反引号中的命令会被执行,例如 :args `ls` 会把当前目录下的所有文件加载入缓冲区
-
-
-
用
:argdo{cmd}
命令可以在参数列表中的每个文件上执行一条Ex命令:argdo {cmd}
实际工作流程是:first
-:{cmd}
-:next
-:{cmd}
…- ⭐️ 为了修改能够顺利进行,需要打开
hidden
选项,不然会警告没有保存 - 修改结束后,可以使用
:wall
或者:argdo write
进行保存
窗口 —— 缓冲区的显示区域
- 可以打开多个窗口,这些窗口可以显示同一个缓冲区(例如一个长文件的不同部分),也可以显示不同的缓冲区
- 划分窗口
命令 | 用途 |
---|---|
<C-w>s |
水平切分(新窗口在上面,仍显示当前缓冲区) |
<C-w>v |
垂直切分(新窗口在左边,仍显示当前缓冲区) |
:sp[lit] {file} |
水平切分,新窗口载入file |
:vsp[lit] {file} |
垂直切分,新窗口载入file |
【注】:可以使用:edit
更改当前窗口载入的文件
- 在窗口间移动
命令 | 用途 |
---|---|
<C-w>w |
在窗口间循环切换,按住Ctrl,没按两个w就可以切换 |
<C-w> +h/j/k/l |
左/下/上/右 |
【注】:设置mouse
选项或者使用GVim时,可以使用鼠标来激活窗口
- 关闭窗口
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:clo[se] |
<C-w>c |
关闭活动窗口 |
:on[ly] |
<C-w>o |
只保留活动窗口,关闭其他所有窗口 |
- 调整窗口大小及重新排列窗口
命令 | 用途 |
---|---|
<C-w>= |
使所有窗口等宽、等高 |
<C-w>_ |
最大化活动窗口的高度 |
<C-w>| |
最大化活动窗口的宽度 |
[N]<C-w>_ |
把活动窗口的高度设为[N]行 |
[N]<C-w>| |
把活动窗口的宽度设为[N]行 |
- 调整窗口大小还是用鼠标方便一点
- 重排窗口可以通过
:h window-moving
了解
标签页 —— 将窗口分组,往往对应着一个新的工作
-
标签页:可以容纳一系列窗口的容器(
:h tabpage
) -
打开和关闭标签页
命令 | 用途 |
---|---|
:tabe[dit] {filename} |
打开一个新的标签页,省略filename会创建一个新标签页,其中包含一个空缓冲区 |
<C-w>T |
把当前窗口移动到一个新标签页 |
:tabc[lose] |
关闭当前标签页 |
:tabo[nly] |
关闭除当前标签页外的所有其他标签页 |
- 在标签页间切换
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:tabn[next] {N} |
{N}gt | 切换到编号为{N}的标签页 |
:tabn[next] |
gt | 切换到下一个标签页 |
:tabp[revious] |
gT | 切换到上一标签页 |
- 重排标签页
Ex命令 | 用途 |
---|---|
:tabm[ove] [N] |
把当前标签页移动到第N位,索引从0开始 |
:tabm[ove] |
把当前标签页移动到末尾 |
- 设置工作目录
命令 | 用途 |
---|---|
:lcd {path} |
设置当前窗口的本地工作目录 |
:windo lcd {path} |
设置当前标签页中所有窗口的本地工作目录 |
第七章 打开及保存文件
-
:pwd
打印工作目录 -
:edit {file}
-
可以接受相对于工作目录的文件路径
-
:edit %:h<Tab>
%代表活动缓冲区的完整文件路径,:h
会去除文件名,只保留路径-
建议将
%:h
映射为%%
cnoremap <expr> %% getcmd-type() == ':'? expand('%:h').'/':'%%'
-
-
-
:find
- 通过文件名打开一个文件,而不需要输入完整路径
- 需要配置‘path’选项,将根据path指定的目录进行查找
:set path+=app/**
将app/目录下的所有子目录加入path
-
netrw —— vim发行版标配插件,为Vim原生的文件管理器
-
必须确保Vim被配置成可加载插件
// .vimrc essential.vim set nocompatible filetype plugin on
-
用vim打开一个目录:
①
$ vim {drectory}
②
:edit {directory}
③
:E[xplore]
=:edit %:h
打开活动缓冲区所在的目录④
:S[explore]
在一个水平切分窗口里打开文件管理器⑤
:Ve[xplore]
在一个垂直切分窗口里打开文件管理器 -
显示形式:
-
在目录处按<CR>会进入该级目录
-
在文件处按<CR>则会进入该文件的缓冲区,此时按
<C-^>
可以切换回目录 -
按
-
可以快捷返回上级目录 -
工程目录树始终居于一个窗口的方式不适合Vim,更适合Vim的工作方式是:把每个窗口想象成纸牌,一面显示文件内容,一面显示文件管理器,除了第一次需要用
:E
打开外,之后都可以使用<C-^>
进行切换 -
netrw
还可以创建(:h netrw-%/nwtrw-d
)、重命名(:h netrw-rename
)、删除(:h netrw-del
)新文件和目录,杀手锏是利用多种协议读写网络文件,如scp, ftp, curl及wget,参见:h newtrw-ref
-
-
怎么把文件保存到不存在的目录?
:edit {file}
创建空缓冲区!mkdir -p %:h
创建中间目录:write
写入
-
以超级用户权限保存文件
:w !sudo tee %>/dev/null
% 会被展开为当前文件的完整路径
-
<C-g>
查看文件状态