【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
文章目录
- S10L45 Working with Multiple Windows
- 1 水平分割窗口
- 2 在水平分割的新窗口中显示其它文件内容
- 3 垂直分割窗口
- 4 窗口的关闭
- 5 在同一窗口水平拆分出多个窗口
- 6 关闭其余窗口
- 7 让四个文件呈田字形排列
- 8 光标在多窗口中的定位
- 9 调节子窗口的尺寸大小
- 10 变换子窗口的位置
- 11 将光标所在的子窗口分别靠进某一边
- 12 将所有缓冲区加载到当前窗口
- 13 对所有子窗口批量执行命令
- 14 关于窗口组合键的按键细节
写在前面
本篇为第十章的最后一节内容。继介绍完 Vim 缓冲区的相关知识后,本节进一步深入探讨了多窗口环境下的各类常见操作。想当年我就是直接先学了这一节内容,成功利用远程服务器的 Vim 界面完成了八个服务器节点的手动配置,要是没有多窗口这个功能,只靠缓冲区频繁切换,遇到需要同时监控某些性能指标时就傻眼了(当然这类问题有更专业的工具,这里只是举例)。今天将这些知识点完整梳理出来,以后就方便多了。
S10L45 Working with Multiple Windows
本节演示文件:vimclass/buf-{ant,bed,cat,dad}.txt、vimclass/nav.txt。
1 水平分割窗口
默认情况下,Vim 一个窗口只会加载一个编辑界面。即便在学习 Vim 缓冲区的概念时,也只涉及单一窗口下的各类操作;多窗口环境只在第四章介绍帮助系统时提到过,并可通过 Ctrl + WW 让光标在两个窗口间切换、用 :q + Enter 命令关闭某个窗口,仅此而已。
其实,Vim 还支持通过 :sp 或 :split 命令实现窗口的 水平分割。
例如,用 vim buf* 批量打开多个以 buf 开头的演示文件后,输入 :sp + Enter 将得到两个上下分布的相同窗口:

【图 45-1:用 sp 命令实现窗口的水平分割】
由于显示的是同一个缓冲区,在其中任一窗口修改内容都会同步影响到另一个窗口。
:sp 命令还可以等效替换为 CtrlW + S(即按住 Ctrl 的同时敲 W 键、然后放开 Ctrl 后再敲 S 键)
2 在水平分割的新窗口中显示其它文件内容
执行命令 :sp <file_name> + Enter 即可。
例如,让新开窗口加载 buf-bed.txt 中的内容,需输入::sp buf-bed.txt + Enter:

【图 45-2:在水平分割窗口时在新窗口显示指定的文件内容(buf-bed.txt)】
3 垂直分割窗口
使用 :vs + Enter 或 :vsplit + Enter。
同理,也可以使用组合键 CtrlW + V 作等效替换:

【图 45-3:使用 vs 命令实现窗口的垂直分割】
同理,执行命令 :vs <file_name> + Enter 可指定新窗口加载的文件内容。
4 窗口的关闭
使用命令 :q + Enter 或者组合键 CtrlW + Q。
5 在同一窗口水平拆分出多个窗口
多次执行 :sp <file_name> 命令即可:

【图 45-4:利用 “sp + 文件名” 的方式依次水平打开不同的文件内容】
6 关闭其余窗口
两种方式:
- 输入
:on+ Enter 或:only+ Enter; - 使用组合键 CtrlW + O
7 让四个文件呈田字形排列
即纵横分割窗口,先后使用水平、垂直分割(无关顺序):
- 先加载
buf-dad.txt文件,然后执行水平分割::sp buf-bed.txt+ Enter; - 再输入
:vs buf-ant.txt+ Enter 垂直分割上半部分窗口; - 按两次【CtrlW + W】将光标切到下方窗口(即
buf-dad.txt); - 输入
:vs buf-cat.txt完成下半部分的垂直分割。
最终实测效果:

【图 45-5:用水平垂直分割实现四个文件呈田字形分布实测效果截图】
8 光标在多窗口中的定位
除了用 CtrlW + W 逐一切换光标位置,还可以使用导航键实现上下左右移动:
- CtrlW + H:光标左移;
- CtrlW + J:光标下移;
- CtrlW + K:光标上移;
- CtrlW + L:光标右移;
注意到涉及窗口操作的组合键都有相同的前缀 CtrlW。为方便后续操作,也可以使用 map 命令重新指定快捷键并写入 vimrc 配置文件:
map <C-h> <C-w>hmap <C-j> <C-w>jmap <C-k> <C-w>kmap <C-l> <C-w>l
或者利用 Leader 键重写快捷键:
map <leader>h <C-w>hmap <leader>j <C-w>jmap <leader>k <C-w>kmap <leader>l <C-w>l
如果是在图形界面下操作,还可以直接用鼠标单击快速定位。
9 调节子窗口的尺寸大小
两种方式:
- 图形界面:鼠标拖拽窗口边缘即可调整;
- 键盘操作:
- 增加高度:CtrlW + +
- 减少高度:CtrlW + -
- 增加宽度:CtrlW + >
- 减少宽度:CtrlW + <
- 高度最大化:CtrlW + _
- 宽度最大化:CtrlW + |
- 设置等宽等高:CtrlW + =
10 变换子窗口的位置
使用 CtrlW + R 可将当前水平排列的窗口依次 往右 挪动一格,最右边的窗口则挪到 最左边 位置;若子窗口均为垂直堆叠分布,则依次 往下 挪动一格,同时最下方窗口挪到 最上方 位置。
使用 CtrlW + ShiftR 则刚好反向操作:水平排列的子窗口 向左 移动、垂直堆叠的则 向上 移动。
注意:组合键中的 R 代表 Right,向右;ShiftR 则表示反向。
11 将光标所在的子窗口分别靠进某一边
通过组合键 CtrlW + 大写的导航键,还可以分别令光标所在的子窗口分别靠近大窗口的上、下、左、右侧。
例如,在刚才的田字形排列的多窗口界面,再使用 :vs nav.txt 垂直分割出第五个子窗口:

【图 45-6:在田字形多窗口界面引入第五个子窗口(左上角)】
按 CtrlW + ShiftH 实现靠左显示:

【图 45-7:让子窗口(nav.txt)靠左显示后的效果图】
按 CtrlW + ShiftL 实现靠右显示:

【图 45-8:让子窗口(nav.txt)靠右显示后的效果图】
按 CtrlW + ShiftK 实现靠上显示:

【图 45-9:让子窗口(nav.txt)靠上显示后的效果图】
按 CtrlW + ShiftJ 实现靠下显示:

【图 45-10:让子窗口(nav.txt)靠下显示后的效果图】
12 将所有缓冲区加载到当前窗口
使用命令 :ball + Enter 或 :ba + Enter。
此时 Vim 默认通过水平分割的方式加载每个子窗口:

【图 45-11:使用 ba 命令一次性加载所有缓冲区的实测效果图】
13 对所有子窗口批量执行命令
与缓冲区的 :bufdo 命令类似,多窗口也支持批量执行命令 :windo。
例如,在垂直排列的子窗口 buf-ant.txt 和 buf-bed.txt 中,批量执行替换命令,将文件中的 # 全部替换为 @,则相应的批量替换命令为::windo %s/#/@/g + Enter。

【图 45-12:对所有子窗口批量执行替换命令后的效果图】
注意
值得注意的是,
:windo命令只对打开的子窗口生效,未打开的子窗口则不受影响 ;而:bufdo命令则会对所有缓冲区生效,无论它是不是隐藏缓冲区都会执行命令。本例可以通过:ls+ Enter 命令加以佐证:
【图 45-13:用 ls 命令查看缓冲区列表,可以看到本例中的批量替换命令 windo 只对打开的子窗口生效】
14 关于窗口组合键的按键细节
本课涉及大量组合键,对于 CtrlW + <KEY> 的操作,既可以放开 Ctrl 键后再按后面的 <KEY> 键,也可以一直按住 Ctrl 键不放、并依次按 W 键和 <KEY> 键。
查看帮助文档 :h ctrl-w + Enter 可以获得更多操作说明:

【图 45-14:查看 ctrl-w 帮助文档了解组合键的更多细节说明】
需要注意的是,按住 Ctrl + S 在某些命令行中可能会引发冲突(例如暂停屏幕刷新),此时使用 Ctrl + WS 来水平拆分窗口就会失效;同理,Ctrl + WQ 也可能因为 CtrlQ 被占用而导致窗口拆分失败。不过具体问题具体分析,遇到组合键冲突,最好通过帮助文档寻求解决方案。
想了解更多关于 Vim 窗口的用法细节,可以查看 Vim 内置的帮助文档::h windows + Enter。
后记
从本节课开始,讲师不再提供专门的同步练习环节。因为这些内容大部分在讲解过程中就能同步操练。想要真正用好 Vim,还得自己多花心思学以致用,方为上策。切莫过分依赖课程本身,丧失了自学的主观能动性。
相关文章:
【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…...
包文件分析器 Webpack Bundle Analyzer
webpack-bundle-analyzer 是一个非常有用的工具,用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小,以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍,包括它的安装、使用以…...
代码随想录day14
二叉树的反转,采用迭代,只能用前序和后序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(i…...
react19新API之use()用法总结
React use() Hook 使用指南 概述 use() 是 React 19 引入的新 Hook,它允许你在组件内部直接使用 Promise、Context 和其他可订阅的值。它是一个更通用的数据获取和订阅机制。 基本语法 const value use(resource);主要用途 1. Promise 处理 function UserDet…...
67,【7】buuctf web [HarekazeCTF2019]Avatar Uploader 2(未完成版)
进入靶场 和上一题一母同胞,先把上一题的答案拖进去看看 区别在于上一题这块直接显示了flag,这里并没有 看看源码 加载不出来,ctrlu <!-- 上传头像的提示信息,说明上传要求 --><p>Please upload a PNG image less th…...
ANSYS HFSS 中的相控天线阵列仿真方法
概述 相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境&…...
stm32 L051 adc配置及代码实例解析
一 cude的设置: 1. 接口的基本设置: 2. 参数的设置: 二 代码的逻辑: 1. 上面的直接生成代码,然后使用下面源码即可读到adc的数据: void adc_battery_start(void) {uint32_t ADC_value 0;HAL_ADC_Start(&…...
KUKA示教器仿真软件OfficeLite8.6.2,EthernetKRL3.1.3通信
一、准备软件。 1、vmware17.6.1 2、OfficeLite8.6.2 3、EthernetKRL3.1.3 4、KUKA Router 5、EthernetKRL_Server 通过网盘分享的文件:库卡相关软件 链接: https://pan.baidu.com/s/1NwvR3RVP0edLBeZnnnCYvw 提取码: smys 二、安装vmware17.6.1 1、找到下载…...
Erlang语言的并发编程
Erlang语言的并发编程 引言 并发编程是现代软件开发中的一个重要领域,尤其是在面对需要高效处理大量任务的应用时。Erlang是一种专门设计用于并发编程的编程语言,由于其在电信和即时通信系统中的广泛应用,逐渐引起了开发者的关注。Erlang的…...
【数据挖掘实战】 房价预测
本次对kaggle中的入门级数据集,房价回归数据集进行数据挖掘,预测房屋价格。 本人主页:机器学习司猫白 机器学习专栏:机器学习实战 PyTorch入门专栏:PyTorch入门 深度学习实战:深度学习 ok,话不多…...
我的创作纪念日,纪念我的第512天
目录 年末 年初 入围 博客 变动 生活 期待 年末 很快,2024年已经过去了,本想在跨年夜的时候营造一点小小的仪式感,结果也因为身体的原因放弃了,浑身感觉疼痛,躺在床上,闭上眼睛,什么也不…...
【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解
Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…...
PHP语言的网络编程
PHP语言的网络编程 网络编程是现代软件开发中不可或缺的一部分,尤其是在日益发展的互联网时代。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,专门用于Web开发。它的灵活性、易用性以及强大的社区支持使得PHP在网络…...
计算机的错误计算(二百一十八)
摘要 大模型能确定 sin(2.6^100) 的符号吗?实验表明,大模型给的结论是正确的,但其证明过程是错误百出。大模型的推理实在是不敢恭维。 就同样题目,测试一下另外一个大模型。 例1. 能确定 sin(2.6^100) 的符号吗? 下…...
《鸿蒙Next原生应用的独特用户体验之旅》
界面设计与交互方面 简洁性与一致性:iOS界面以简洁统一著称,而鸿蒙Next的界面设计同样主打简洁,各部件采用悬浮效果,营造出空间感,如天气App的展示更加逼真。安卓系统由于不同厂商的定制化程度较高,导致用户…...
MDX语言的字符串处理
MDX语言的字符串处理 引言 MDX(Multidimensional Expressions)是一种专门用于多维数据库查询和分析的语言,特别是在Microsoft SQL Server Analysis Services(SSAS)中使用广泛。MDX不仅用于查询多维数据,还…...
游戏AI,让AI 玩游戏有什么作用?
让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年,图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序,图灵是想说明,机器理论上能模拟人脑能做的任何事情,包括下棋这样复杂的智力活动。 可惜的是…...
Java 设计模式 二 单例模式 (Singleton Pattern)
单例模式 (Singleton Pattern) 是一种常见的设计模式,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景,比如配置管理、日志系统、数据库连接池等。 1. 单例模式的…...
Java 中 final 关键字的奥秘
目录 一、final 修饰类:封印的 “永恒之石” 二、final 修饰变量:锁定的 “不变之值” 三、final 修饰方法:不可撼动的 “坚固堡垒” 四、总结 在 Java 编程的世界里,final 关键字就像一把神奇的 “锁”,一旦使用&…...
C# 通用缓存类开发:开启高效编程之门
引言 嘿,各位 C# 开发者们!在当今快节奏的软件开发领域,提升应用程序的性能就如同给跑车装上涡轮增压,能让你的项目在激烈的竞争中脱颖而出。而构建一个高效的 C# 通用缓存类,无疑是实现这一目标的强大武器。 想象一…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

