当前位置: 首页 > news >正文

Vim学习笔记【Ch02】

Vim学习笔记

  • 系列笔记链接
  • Ch02 Buffers, Windows, Tabs
    • Buffers
      • 什么是buffer
      • 查看所有buffer
      • buffer之间的切换
      • 删除buffer
      • 退出所有窗口
    • Windows
      • 窗口的创建
      • 窗口切换快捷键
      • 其他快捷键
    • Tabs
      • 什么是tab
      • tab相关命令
    • window和buffer结合的3D移动
    • 小结

系列笔记链接

Ch00,Ch01

Ch02 Buffers, Windows, Tabs

.vimrc配置文件中加入set hidden,可以隐藏一些提示信息,比如切换不同的缓存区buffer时,未保存当前缓存区的内容,Vim会提示先保存文件。隐藏提示信息可以使切换操作更流畅。

Buffers

什么是buffer

缓存区buffer是一个内置的内存空间,可以在其中写入和编辑文本。Vim中每打开一个新文件,其数据都会关联到一个独立的buffer。
比如通过Vim打开file1.txt,此时Vim关联的就是file1.txt的buffer:

vim file1.txt

同时打开多个文件时,Vim也会为这些文件创建独立的buffer,默认展示的是第一个文件的buffer:

vim file1.txt file2.txt

查看所有buffer

在命令行模式下输入:buffers(或:ls:files),Vim窗口底端会列出当前打开的所有buffer。
buffers

buffer之间的切换

:buffers输出结果中,每一行第一列标识了每个buffer的编号(按文件打开的顺序,从1开始计数),第二列表示buffer的状态,%a表示Vim当前所处的buffer,第三列就是每个buffer对应的文件,最后一列是每个buffer中光标所处的位置(行)。
通过:buffer+n的方式可以切换到第n个buffer,比如:buffer2可以切换到file2.txt的buffer。
其他buffer切换命令:

:bnext  # 转到下一个buffer,或者快捷键Ctrl + I
:bprevious  # 转到上一个buffer,或者快捷键Ctrl + O
:buffer + 文件名  # 转到指定文件的buffer

此外,Ctrl + ^可以切换到前一次编辑的buffer中。

删除buffer

删除指定的buffer的两种方式(命令行模式下):

:delete n  # 根据编号删除
:delete filename  # 根据文件名删除

退出所有窗口

同时打开多个buffer时,可以通过以下指令退出所有buffer(命令行模式下):

:qall  # 直接退出所有buffer
:qall!  # 感叹号强制退出所有buffer
:wqall  # 先保存再退出所有buffer

Windows

窗口的创建

窗口window是展示缓存区buffer内容的媒介,可以类比于普通编辑器的窗口。Vim中也可以同时打开多个窗口,包括对同一个buffer打开多个窗口,以及不同的buffer用不同的窗口打开。
结合buffer和window两个概念,当我们用Vim打开一个文件时,比如vim file1.txt,打开的是file1.txt的buffer,通过一个窗口查看、编辑这个buffer;在file1.txt的基础上,运行:split file2.txt,会在file1的窗口之上打开一个新的窗口,显示file2的buffer,这样就用不同的窗口打开了不同的buffer。
window,split
:split是将窗口纵向排列,而:vsplit则是将多个窗口横向排列,比如在两个窗口的基础上继续执行:vsplit file3.txt,就会得到第3个窗口:
window,vsplit
执行vsplit前处于file1的窗口中,vsplit会在当前窗口的左侧打开新的窗口。

窗口切换快捷键

Ctrl + W + H   # 将光标移动到左侧的窗口
Ctrl + W + J   # 下
Ctrl + W + K   # 上
Ctrl + W + L   # 右

PS:说实话这个不是很好操作,初学不好记的同时,手指灵活度还差点,只能说熟能生巧,但我现在不熟,并且是差点玩坏键盘的程度…

其他快捷键

Ctrl + W + V   # 打开一个新的垂直窗口
Ctrl + W + S  # 打开一个新的水平窗口
Ctrl + W + C   # 关闭一个窗口(当前)
Ctrl + W + O   # 除了当前窗口,关闭其他所有窗口

实际操作时:
Ctrl + W + V无法指定打开的窗口对应哪个buffer,会直接为当前光标所处buffer打开一个新的垂直窗口;
Ctrl + W + S有个bug,这样操作之后容易锁定终端的操作,这之后无论按什么都没有反应,我还不知道做错了什么,只能强制杀死该进程;
尝试Ctrl + W + C时同样出现终端“死机”的状态,于是开始想是不是模式切换的问题,这几个快捷键操作的实际效果还有待探索(结合window帮助文档:h window

  • 还有待探索的window快捷键操作

对比起来,在命令行模式下直接输入指令更直观可控,但教程中明确的指令只有split、vsplit和new(:qa退出所有窗口),不如快捷键丰富。

Tabs

什么是tab

熟悉Linux环境和终端命令,对Tab应该不陌生,常用Tab键进行文件名、路径补全,Vim中也可以在输入命令时使用Tab补全文件名。但这里说的Tabs,指窗口的集合(a collection of windows),类似浏览器新开一个标签页,称之为tab。在Vim中,通过:tabnew xxx打开一个tab,tab的形式也和浏览器标签页类似,好比不创建新的终端窗口,而是在同一个终端窗口中新开了一个Vim终端。window让我们在同一个Vim终端中打开不同的文件,每个tab之下可以有不同的window布局。
tab

tab相关命令

在命令行模式下:

:tabnew file.txt   # 打开一个新的tab
:tabclose  #关闭当前tab
:tabnext   # 打开下一个tab,或使用快捷键gt(注意不是命令行输入)
:tabprevious   # 打开前一个tab,或使用快捷键gT
:tablast  # 打开最后一个tab
:tabfirst  # 打开第一个tab

PS:其实只有快捷键gt已经足够在不同的tab之间切换,因为在最后一个tab执行gt之后会到第一个tab,很难想象怎么打出gT的快捷键?

在启动Vim时同时打开多个tab(-p参数):

vim -p file1 file2 file3

同样可以通过qa直接退出所有tab。

window和buffer结合的3D移动

我们可以在一个终端(可以理解为一个tab)中打开多个window,每个window又可以包含多个buffer,窗口之间的切换可以类比于在一个X-Y平面中上下左右移动,而同一个窗口中不同buffer的切换可以类比于在Z轴上移动,因此结合使用window和buffer时,就好像在一个3D空间移动。

小结

作者介绍了他对Vim中这几个概念的用法:一般来说,在同一个窗口中打开多个buffer(对应不同的文件),可以方便进行文件切换;打开多个窗口则是为了便于查看/对比等操作,而tab则是为了区分不同的并行任务。

相关文章:

Vim学习笔记【Ch02】

Vim学习笔记 系列笔记链接Ch02 Buffers, Windows, TabsBuffers什么是buffer查看所有bufferbuffer之间的切换删除buffer退出所有窗口 Windows窗口的创建窗口切换快捷键其他快捷键 Tabs什么是tabtab相关命令 window和buffer结合的3D移动小结 系列笔记链接 Ch00,Ch01 …...

《低代码指南》——低代码维格云能源行业解决方案

目录 典型场景介绍: 一、能源资产管理 二、碳核查 三、配电运营 总 结: 从业界实际情况来看,流程建设本身是一个对业务现实进行抽象的过程,这个过程即使不考虑软件开发的门槛,对于很多客户而言也是个涉及较长周期的复杂工作,往往需要咨询专家或专业公司帮助其建设内…...

【自制C++深度学习推理框架】Layer的设计思路

Layer的设计思路 Layer的抽象 如果将深度学习中的所有层分为两类, 那么肯定是"带权重"的层和"不带权重"的层。 基于层的共性,我们定义了一个Layer的基类,提供了一些基本接口,并可以通过继承和多态机制实现不同类型的L…...

Rust每日一练(Leetday0011) 下一排列、有效括号、搜索旋转数组

目录 31. 下一个排列 Next Permutation 🌟🌟 32. 最长有效括号 Longest Valid Parentheses 🌟🌟🌟 33. 搜索旋转排序数组 Search-in-rotated-sorted-array 🌟🌟 🌟 每日一练刷…...

STL --- 五. 函数对象 Function Objects

目录 1、函数对象的定义和作用 2、函数对象的分类和使用 3、std 常用的函数对象 4、函数对象的适配器 5、std 算法和函数对象区别 1、函数对象的定义和作用 STL(Standard Template Library)中的函数对象(Functor)是一种重载…...

Java IO 流操作详解

Java IO 流操作详解 一、简介1. 什么是IO流2. IO流的分类3. IO流的作用 二、Java IO流的输入操作1. 文件输入流2. 字节输入流3. 缓冲输入流4. 对象输入流 三、Java IO流的输出操作1. 文件输出流2. 字节输出流3. 缓冲输出流4. 对象输出流 四、Java IO流的常用方法解析1. 字节读写…...

Halcon 形状匹配参数详解

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score) find_shape_model(Image : : //搜索图像 ModelID, //模板句柄 AngleStart, // 搜索时的起始角度 AngleExte…...

C++11强类型枚举

C11引入了强类型枚举(enum class),也称为枚举类。 强类型枚举是一种更加类型安全的枚举类型,相对于传统的枚举类型,强类型枚举可以提供更好的安全性和可读性。 强类型枚举的格式如下: enum class 枚举名 …...

pytorch讲解(部分)

友爱的目录 自动求导机制从后向中排除子图自动求导如何编码历史信息Variable上的In-place操作In-place正确性检查 CUDA语义最佳实践使用固定的内存缓冲区使用 nn.DataParallel 替代 multiprocessing 扩展PyTorch扩展 torch.autograd扩展 torch.nn 多进程最佳实践共享CUDA张量最…...

C++ 基本的7种数据类型和4种类型转换(C++复习向p3)

文章目录 基本内置类型存储范围typedef 声明新名字enum 枚举类型类型转换 基本内置类型 boolcharintfloatdoublevoidwchar_t ⇒ short int 存储范围 可以这样 sizeof(int) 来确认 int 占用字节数 char,1字节,-128~127 或 0~255 wchar_t,2…...

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的,在Leangoo中,我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog(迭代)看板,用于管理当前Sprint的需求和开发任务,可视化展示每…...

智警杯赛前学习1.1---excel基本操作

修改默认设置 步骤一:打开“Excel选项”窗口,打开“文件”菜单,选择“选项”标签 步骤二:在“Excel选项”窗口中,选择“常规与保存”标签,在“常规与保存”标签中,可以修改录入数据时的默认字体…...

【Android】Handle(一) 主要特点和用途

在Android中,Handler是一种消息处理机制,它允许我们在不同线程之间交换信息并更新UI。具体来说,Handler可以将一个Runnable或Message对象加入到消息队列中,并在合适的时间去执行它们。 以下是Handler的主要特点和用途&#xff1a…...

40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】

前几天发现一个有趣的文章 “40亿个QQ号,限制1G内存,如何去重?”,发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一、审题分析 一个 QQ 号现在最长有 11 位,因为 int 是四字节,数值范围是2的31次方,因此得使用 long 存储,但考虑到实现,使用 int 存储(1…...

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型

本期为TechBeat人工智能社区第502期线上Talk! 北京时间06月01日(周四)20:00,新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”,届时将介…...

从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法

前面已经对 string 类进行了简单的介绍和应用,大家只要能够正常使用即可。 在面试中,面试官总喜欢让学生自己 来模拟实现string类, 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL,下面我…...

reduce()方法详解

一、 定义和用法 reduce() 方法将数组缩减为单个值。 reduce() 方法为数组的每个值(从左到右)执行提供的函数。 函数的返回值存储在累加器中(结果/总计)。 注释:对没有值的数组元素,不执行 reduce() 方法。…...

C++虚假唤醒

概念: 虚假唤醒是指在使用条件变量时,线程被唤醒但条件并没有满足,导致线程执行错误的情况,这个过程就是虚假唤醒。 虚假唤醒弊端: 虚假唤醒会导致程序的正确性受到影响,因为唤醒的线程并没有满足条件&…...

【AI】dragonGPT - 单机部署、极速便捷

dragonGPT 从数据私有化,到prompt向量库匹配,再到查询,一条龙服务,单机部署,极简操作 pre a.需要下载gpt4all model到本地. ggml Model Download Link 然后将存放model的地址写入.env MODEL_PATH your pathb.…...

Uuiapp使用生命周期,路由跳转传参

Uniapp生命周期: 1. beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。 2. created:在实例创建完成后被立即调用。 3. beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。 …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...