Vim 实用技巧必知必会
吴咏炜
前 Intel 资深软件架构师
21753 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
Vim 实用技巧必知必会
15
15
1.0x
00:00/00:00
登录|注册

06|窗口和标签页:修改、对比多个文件的正确姿势

类似插件
安装和使用
<C-W>T 命令
标签页的命令
标签页的基本特性
使用 vimdiffgvimdiff 命令比较两个文件
快捷键映射
使用鼠标进行窗口操作
:split:vsplit 命令
课后练习
内容小结
NERDTree 插件
多标签页编辑
双窗口比较
多窗口编辑
Vim 的窗口和标签页

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
上一讲我们讨论了多文件的编辑。不过,迄今为止,我们即使编辑多个文件,也是在单个窗口里进行的。这样做的局限在于,我们既不能同时修改两个文件,也不能在单个 Vim 会话里对比显示两个文件。当然了,在两个 Vim 会话里倒是可以做到,但有很多不足之处,其中之一就是容易出现“已经存在交换文件”这样的冲突。
所以,这一讲我们就来讨论一下如何利用多窗口、多标签页编辑来实现这些功能。

多窗口编辑

Vim 有窗口的概念。事实上,如果你使用过 Vim 的帮助功能的话,那你就已经见过 Vim 的多窗口界面了。在那种情况下,Vim 自动打开了一个水平分割的帮助窗口。
那如果我们想要自己同时查看、编辑多个文件呢?最基本的命令就是 :split(缩写 :sp)了。这个命令后面如果有文件名,表示分割窗口并打开指定的文件;如果没有文件名,那就表示仅仅把当前窗口分割开,当前编辑的文件在两个窗口里都显示。跟显示帮助文件一样,:split 默认使用水平分割的方式。
既然我说了“水平分割”,聪明如你,一定想到了还有竖直分割。
确实如此。由于 Vim 经常是在终端窗口里打开,而终端宽度常常不能允许在竖直分割时显示两个文件,所以 Vim 默认分割是水平方式。竖直分割要求屏幕比较宽,但如果你想对比两个文件时,竖直分割就会更方便了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Vim多文件编辑技巧大揭秘 本文详细介绍了如何在Vim中利用窗口和标签页进行多文件编辑,以及使用快捷键和命令来实现这些功能。通过`:split`和`:vsplit`命令可以实现水平和垂直分割窗口,并且使用`<C-W>`加方向键可以在窗口之间快速跳转。另外,文章还介绍了双窗口比较功能,通过`vimdiff`或`gvimdiff`命令可以方便地比较两个文件的差异。此外,还讨论了多标签页编辑的特性和使用方法。文章还介绍了NERDTree插件,该插件可以方便地在Vim中浏览文件系统并打开文件进行编辑。总的来说,本文详细介绍了Vim窗口和标签页的使用方法,对于提高编辑效率和进行文件比较非常有帮助。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Vim 实用技巧必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 我来也
    老师的每一篇文章都介绍的很详细、全面。 分隔窗口,我一般都只用快捷键`<C-w>v`和`<C-w>s`. 另外的一些命令,虽然看到了也知道,但自己用的确实不多. 在窗口间跳转,使用的还算比较频繁,原本的命令又太繁琐了点. 所以就又被我替换掉了.直接用Ctrl-j/k/h/l来跳转. ``` noremap <C-j> <C-W>j noremap <C-k> <C-W>k noremap <C-h> <C-W>h noremap <C-l> <C-W>l ``` 如果是在Tmux的Vim中切换窗口,借助插件`vim-tmux-navigator`后,用同样的快捷键,可以在tmux和vim的窗口间无缝的切换. 调整窗口大小,虽然可以配合数字+<C-w>-/+/</>来,但真的是没有鼠标操作方便. 我目前好像只在这种情况下会开启鼠标的功能. 我特意配置了快捷键,来临时切换鼠标的模式. ``` " 循环设置鼠标 let g:set_mouse_value = &mouse " 获取当前的mouse值 :set mouse? function! CycleMouseValue() if g:set_mouse_value == 'a' let g:set_mouse_value = 'v' echo 'set mouse=v' elseif g:set_mouse_value == 'v' let g:set_mouse_value = 'a' echo 'set mouse=a' endif execute 'set mouse='.g:set_mouse_value endfunction nnoremap <silent> <leader>sm :call CycleMouseValue()<CR> ``` 还有一些技巧,用的就更少了. 比如`:help CTRL-W_]`用于在新窗口中打开标签所指向的地方. -------------- 多标签编辑,我也是这周才照着这篇4年前的文章简单配置了一下. [更好的使用 Vim的标签(Tab)和 Alt映射功能](https://zhuanlan.zhihu.com/p/20902166) 我操作buffer非常熟练,觉得在vim中搞Tab,还没有在iTerm2的多标签中开vim方便. 现在我能想到使用Vim标签的场景也只有一个: 在浏览项目源码时,在新Tab中不断地跳转到子函数的定义中去. 这样把新Tab一关闭,就可以迅速的退回到之前查看顶层函数的地方. 之前我都是用`<CTRL-O>`或者`<CTRL-T>`不断的回跳,或者是用全局标签,直接跳回. -------------- 提到了多buffer,多窗口,多标签,顺便再提一下`vim-airline`插件. 非常方便的在顶部显示这些信息. 这个也是看了老师的视频直播才知道这插件居然还有这个功能.

    作者回复: 很好的经验总结。 有个疑问,你为什么要把鼠标关掉呢?有什么干扰吗?

    2020-08-05
    3
    4
  • EncodedStar
    <C-W> 键盘上怎么按呢?

    作者回复: 复习一下第 2 讲?这是 Ctrl-W。

    2020-08-10
    8
    2
  • chris
    老师请教一个问题,用vim *.cpp同时打开多文件,然后想用<C-W>T将当前窗口正在看的文件放到tab页里面,却提示“已经是最后一个窗口了”;另外我用<C-W>q只是想关闭当前正在看的文件从而去看下一个文件,但直接vim就退出了。请问这是怎么回事,多文件打开并不是多窗口吗?

    作者回复: 对,打开多个文件本身仍然是一个窗口。如果文件数不多的话,可以在命令行上用 -o 选项打开到多个窗口,或 -p 到多个标签页,但文件多就不合适了。折中方式,用 -p2 这样的选项指定标签页数量。

    2020-09-20
    1
  • Leoorz
    老师,在xshell下映射了<C-Tab>,也关闭了xshell下的这个映射,但是vim中仍然不管用,有没有办法在vim中知道实际接收到终端发给vim的字符序列?

    作者回复: 在shell里直接敲cat命令,然后按特殊按键,看能不能收到、显示出来。

    2020-08-07
    6
    1
  • return
    今天这个 <C-W> 加各种组合, 确实有点难受呀。 老师有没有接触过 space-vim, 想请教一下老师的看法。

    作者回复: 不需要记住所有快捷键的。需要用的多了,自然记住。我也没把所有的都背下来,尤其有命令行替代的。 知道 spacevim,不用。不喜欢隔着一层用,反而还要学它的一套,感觉更折腾。不过,各人口味不同,如果你喜欢就用呗。

    2020-08-05
    2
    1
  • Geek_zhw
    请问怎么用Minpac安装好用的json格式化插件?

    作者回复: 最简单的方式似乎是直接安装工具jq(如 sudo apt install jq),然后在Vim里用 :%!jq 来调用。

    2021-01-07
  • 浩浩
    课程中给出的第一条安装 nerdtree ,现在好像装不了了; 我现在用的是下面第二条安装 "call minpac#add('preservim/nerdtree') call minpac#add('scrooloose/nerdtree')

    作者回复: 我尝试卸载再重装,没有问题。 不过,有一点是 minpac 的修改导致现在配置需要有所变化,以前是: if exists('*minpac#init') " Minpac is loaded. call minpac#init() call minpac#add('k-takata/minpac', {'type': 'opt'}) 现在需要改成: if exists('g:loaded_minpac') " Minpac is loaded. call minpac#init() call minpac#add('k-takata/minpac', {'type': 'opt'}) 不知道这和你的问题是不是有关。如果不是这个问题的话,你可以贴出错误信息来看看。

    2020-10-24
  • 浩浩
    minpac 安装 nerdtree, 显示“nerdtree not installed” 使用的是mac自带的 vim; 不是MACvim。 百度,Google 找不到minpac 安装 nerdtree 的相关资料。请问放弃minpac, 只能自己下zip解压安装吗?

    作者回复: 如果有失败,恐怕需要到 minpac 的页面上去问问看。 或者,可以使用下面的命令手工安装: mkdir -p ~/.vim/pack/my/start cd ~/.vim/pack/my/start git clone https://github.com/preservim/nerdtree.git 不过,强烈推荐安装 MacVim,即使只使用终端下的 Vim。

    2020-10-24
  • 老王
    <C-W>+ 是按哪几个键?ctrl W +一起按吗?没效果啊

    作者回复: Ctrl-W,然后 +

    2020-08-28
  • 光头丙
    老师,您好,NERDtree可不可以关闭预览回到文件夹列表,我查看帮助试了一遍快捷键,好像都没有好的效果。。

    作者回复: 预览窗口就是原先的正常编辑窗口,一直开着,我觉得没问题吧?你难道希望只看到文件列表,看不到文件内容?就为了增大点空间吗?没理解你的意图。 如果真的想只看文件列表的话,用关掉除当前窗口外的其他窗口命令,<C-W>o,即可。

    2020-08-17
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部