Vim 命令从头学习记录

学习链接:eleon-vim基础教程

Vim - 基础翻屏操作

光标移动:hjkl 20j 向下移动20行,w 向后移动一个字符,b 向前移动一个字符。

Ctrl + u 向上翻半页 UP
Ctrl + d 向下翻半页 Down
Ctrl + f 向下翻整页 Forward
Ctrl + b 向上翻整页 Backward

大写M 跳转到屏幕中间 Middle
大写L 跳转到屏幕最后一行 Last Line
大写H 跳转到屏幕第一行 Home

Count + 大写H 光标移动到顶部下面的count行。
Count + 大写L 光标移动到底部上面的count行。

Ctrl + e 向下翻一行,光标不动
Ctrl + y 向上翻一行,光标不动

Vim - 编辑操作

复制yy=Y 复制光标所在行,3yy 复制光标所在行以在内的三行, y$ 复制光标所在字符至行尾的内容。
粘贴p P 一个是粘贴到光标或行之前,一个是之后。
删除dd 删除本行,3dd 删除光标所在行以在内的三行,D = d$删除光标所在字符至行尾的内容。
剪切x 剪切当前字符,3x 剪切当前字符在内的三个字符
交换字符顺序xp ,其实就是先剪切后粘贴
合并行:大写J 无论光标在哪里,都能把下一行的内容补到当前行尾,间隔一个空格。(在代码整理的时候用吗???)
替换光标处字符(单词打错了后很常用):rb 就可以把光标所在位置字符替换成b,Rccc 就可以把光标所在位置和其后面的俩字符都替换成b。
s 会删除掉单个字符然后进入插入模式。 S会删除掉光标所在行让后进入插入模式。
变更ccS的作用一样。
撤销u 或者 U 都行,撤销上一步。
重做Ctrl + ru作用的反向
大小写转换gu + Motion , gU + Motion 其中Motion可以是w表示转换单词,如果是2w就是转换当前单词在内的俩单词。
重复上次修改:点“.” 可以重复上次的命令操作。

Vim - 文本对象(常用)

Operation + type + Object 的组合
Operation: 可能是d,y, c, v
Type:只有两种 ai,分别表示all和in
Object:可以是一堆括号{ [ ( " '等,也可也是w(word)s(句子)t(tab,html用到)

Vim - 缩进

1 手动缩进
>> :增加缩进
<< :减小缩进
3>> :当前行以下3行增加缩进,减小缩进类似。
> % :当光标放在大括号上时有效,对当前块进行增加缩进操作,减小缩进类似。
> i { :为{}内的内容(不含{})增加缩进
> a { :为包含{}在内的块儿内内容增加缩进

2 自动缩进
== :对当前行自动缩进
4== :对当前行及下面三行执行自动缩进
=i{ :对{中的内容自动缩进
=a{ :对{中的内容包括{自动缩进(常用)
=% :当贯标在括号上时自动缩进整个块

3 缩进格式设置
set shiftwidth=8 设置缩进操作长度为8个空格的长度(如果tab为4个空格,则缩进就是两个制表符,如果tab为8个空格,则缩进就是1个制表符)
set tabstop=4 设置tab的长度为4,当在命令模式下进行缩进时起作用。
set expandtab插入模式和命令模式都起作用,使用手动缩进插入的是空格。此时如果在插入模式下敲入tab,则插入的是空格
set noexpandtab expandtab 的反面,使用手动缩进插入的是制表符。此时如果在插入模式下敲入tab,则插入的是制表符
上面的命令与手动自动缩进命令的配合来编写符合原代码规范的代码。
set softtabstop=8 只在插入模式起作用。 注意与tabstop的不同。如果你想手动写tab则要修改这个命令。
在检查更改时如果要检查自己的设置是否正确使用俩命令:
set list 显示特殊符号,如$表示行尾,Ctrl+I表示tab制表符
set nolist 隐藏特殊符号

4 插入模式下编辑下一行时如何自动缩进
set <自动缩进类型>: 类型有四种,autoindentsmartindent, cindent, indentexpr;
我现在先使用cindent, 是用于c语言时的缩进格式。 我找了很长时间,网上的教程都是东拼西凑,原来学习还得需要系统,这块东西如果光靠一个博客就搞明白的确很费精力。

Vim - 折叠-Floding

如果有不需要的代码可以折叠起来。也可以参考手册命令模式输入:help folding
当前我,几乎不咋用,只有使用vim -d 进行文件对比的时候使用。仅列在这,详情参考vim 基础教程
z + f + Motion : 创建当前行至Motion为一个折叠。
count + z + F: 创建当前行之后count行的折叠。
z + f + %:查找光标所在的块进行块儿折叠。
z + o 打开折叠,z + O 递归打开折叠。
z + c 折叠起来,z + C 递归折叠起来。
z + d 删除光标所在行折叠,z + D 递归删除光标所在块折叠。
z + E 删除所有折叠。

Vim - Buffers 多文件(很重要)

命令模式下有如下命令,我曾苦苦找寻,如今发现vim本身就特么强大的一批了,我还装个毛线的nvim. lvim,骑驴觅驴而已。
e + 文件名 打开并激活指定文件(e为edit)
ls, buffers, files 列出缓冲区文件,这仨命令一样的作用
b add b.txt 向缓冲区列表添加新文件但不激活。
b d 3 删除缓冲区编号为3的文件,d也可写作delete, 如果删除当前文件不需要加数字即可。
b+空格+Tab 先在命令模式输入ls进入buffer列表,然后输入该命令tab就可实现文件跳转,哈哈好方便啊,我之前都打开一堆vim窗口,简直是浪费声明卧槽了。
bn, bp 可以切换到buffer中下一个nexp文件,上一个privious文件
b3 ,buffer3 都可以切换到buffer中符号为3的文件。
b# 访问刚刚访问的文件,这个应该最常用了。
bf, bl 可以跳转到buffer中第一个文件,最后一个文件
b1.txt, buffer1.txt 都可以切换到指定文件名的文件,支持tab补全。
set hidden 当写入内容后不保存也能切换不同文件 set nohidden作用相反。

Vim - Windows 多窗口

可以将一个窗口分隔成多个窗口,不常用,如果对比文件直接vim -d 不更方便?但是还是记录下基本用法,以免以后用到查找。
sp + 文件名,split的缩写,横向分隔窗口打开指定文件
vs + 文件名,vertical split缩写,纵向分隔窗口打开指定文件
Ctrl + W + Motion Motion 可以是hjkl实现窗口切换
Ctrl + W + w 轮换窗口
Ctrl + W + + 增加窗口高度。Ctrl + W + -减小窗口高度。
Ctrl + W + > 增加窗口宽度。Ctrl + W + <减小窗口宽度。
Ctrl + W + Count + action 其中action可以是上面的窗口操作,比如窗口宽度增大4个格:ctrl + W + 4 + >
Ctrl + W + _ 最大化窗口高度; Ctrl + W + | 最大化窗口宽度;
Ctrl + W + = 调整窗口为一致性大小。
Ctrl + W + H/J/K/L 注意motion为大写,用于调整光标所在窗口在屏幕的位置。
Ctrl + W + q 退出当前窗口
Ctrl + W + = 除当前窗口之外全部退出,等价于on。

Vim - tabs 多标签

vim -p 文件1 文件2 以TAB形式打开指定文件
vim -p * 以TAB形式打开当前目录所有文件
:tabe + 文件名 以TAB形式打开新文件,常用(tab edit)
gt:tabn跳到下一个tab.
gT:tabp跳到上一个tab.
数字 + gt:tabn + 数字 跳到指定序号的的tab
:tabl 跳到最后一个tab
:tabm + 数字 (tab move)将当前tab插入到指定数字的位置
:tabc (tab close)
:tabo 只保留当前窗口 (tab only)

《思考 buffers Windows tabs 的关系》

之前都是先搜索怎么配置,网上找到博客一通复制粘贴,跟着人家的命令就开始用,也不知到为啥,但是最终还是被这些概念搞烦了,最后使用最简单的vim 打开一个文件的最原始状态。现在机缘成熟,我学到这里了,也该搞明白他们的关系了,看这个大佬博客:如何理解并正确使用 Vim 中的 Buffer、Window 和 Tab

总结
buffers: 为文件在内存中的缓存数据,每个文件对应内存中唯一的buffer。
Windows: 在一个电脑屏幕大小的空间,划分不同的小窗口,每个小窗口可以显示一个打开的文件。可以说Windows可以规定一个窗口的布局。
tabs:每个tab可以理解为一个电脑屏幕,每个tab里面都可以有一种窗口布局。不同tab之间的窗口没关系。

我应该如何使用 tabs 和 buffer ?
Windows使用的很少,当我使用vim filename.c 打开一个文件,找到一个目标函数,转到定义时此时跳到另外一个文件,此时通过:ls可以到这个文件的buffer也被激活了,这就已经打开了多buffer.
当我要 porting 两个不同工程的代码时,我可以为每个工程打开一个tag。这样可以方便的实现复制。
之前我都是使用多tag, 每个tag显示一个文件,但是当你使用ctags工具跳转时,tag显示的名称已经不是原来的文件了,会把自己搞晕。(如果能时刻显示当前打开buffer对应的文件就好了)

Vim 寄存器

无名寄存器(Unnamed): (没错就是个双引号)
用于保存d, c, x, s, y操作的内容。可以通过命令行输入:reg "来查看无名寄存器的内容。

数字寄存器(Number): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 一共10个数字寄存器。
0号寄存器 保存y操作的内容。
1-9 号寄存器 保存d, c操作的内容,且保存的内容会随着操作的进行逐渐向后搬移,1号寄存器始终保存着最新删除的内容。
搜索寄存器/,当执行搜索字符后,这个寄存器保存刚刚的搜索记录。
系统剪切板寄存器:+ 和 * 。在ubuntu中看到两个寄存器的内容一致,都来自鼠标或键盘复制得到的内容。

只读寄存器:有三个,分别为:

  • 文件名寄存器:%
  • 命令寄存器::
  • 插入文本寄存器:.

Named - 寄存器a-z 共26个寄存器。比较常用,如果想要将指定内容复制到指定寄存器,需要" + 寄存器 + 操作,其中寄存器小写表示替换大写表示追加,vim普通命令模式下例子:
"ayaw :将单词 复制 到 a 寄存器。
"byiw :将单词 复制 到 b 寄存器。
"Cyaw :将单词 追加 到 c 寄存器。
"ap :将 a 寄存器中的内容粘贴到光标位置。

思考:这一堆寄存器什么时候用?
当我们要跨文件进行大量复制粘贴时,如果只是使用0号寄存器,我们就得来回切换文件,此时若使用vim提供的Named寄存器单次保存不同内容就可以提升编辑效率。还有就是用于存储录制的宏。

寄存器内容查看reg + 寄存器名
寄存器内容操作Count + " + 寄存器名 + 操作
举例:3"+p"+3p 都是将+寄存器中的内容粘贴到光标处重复3次。

Vim - Macro 宏(需要用寄存器存储)

宏就是一个录制好的一串命令,如果这个命令需要多次重复操作,你就可以录制一个宏到指定的Named 寄存器,这样下次就不用一个一个敲了(但是觉的还是很少用到)。
记录宏的步骤:
开始记录宏:q + 寄存器名
输入宏命令
按下q结束宏录制

使用宏的步骤:
使用录制的宏命令:@ + 寄存器名
使用最近一次录制的宏命令:@@

追加宏内容:q + 大写寄存器名
多次重复宏命令:count + @ + 寄存器名

举例子:
比如我想要实现按下@c来快速将本行行首添加//注释掉本行(想法牛逼,很实用)。
比如我想要实现按下@d来快速将本行行尾添加;

Vim - Marks书签(需要用寄存器存储)

用到小写和大写两种寄存器,每个文件内有一套小写Named寄存器提供文件内书签跳转(局部跳转),而文件之间有大写Named寄存器可以实现文件之间书签跳转(全局跳转)。
添加书签:m + Named寄存器
清理书签:delmarks a 可清理a书签
查看书签:marks + 要查看的寄存器(此时区分小写还是大写)
跳转到书签所在行: ' + Named寄存器 (单引号)
跳转到书签所在行与列: ` + Named寄存器(反引号)

范式:Operation + ' + Named寄存器(单引号)
比如:
d'a :删除当前光标所在行至a寄存器书签所在行之间的内容。
y'a :复制光标所在行至a寄存器书签所在行之间的内容。
c'a :删除当前光标所在行至a寄存器书签所在行之间的内容并进入插入模式。

思考:书签什么时候用?
通过marks查看寄存器存储的标签,可见他会随着你删除代码动态更新,这比较有用。
1,多文件穿梭,可能你说用buffers的命令bn就够了,但是书签可以更快的跳转到目标位置,还能跟随删除粘贴等命令移动。
2,调试过程中,可以标记报错位置,快速往返于代码和日志。

Vim - 插入模式下的快捷键

  1. 进入插入模式常用的有:i, l, a, A, o, O, ea
  2. Ctrl + y : 插入光标之前行的内容,一直操作就可以一直复制。
  3. Ctrl + e : 插入光标之后行的内容,一直操作就可以一直复制。
  4. Ctrl + r + =:将表达式求值并插入。(会议一下:在命令模式使用“ap插入寄存器内容)
  5. Ctrl + r + 寄存器将寄存器内容插入
  6. Ctrl + t当前行增加缩进
  7. Ctrl + d当前行减小缩进
  8. Ctrl + w删除光标前面的单词
  9. Ctrl + h:删除光标前面的字符
  10. Ctrl + o:切换到普通模式,完成一个命令后,重新进入插入模式。

插入模式下比较常用的操作
缩进应该比较少用,我只需要知道如何在命令模式自动管理缩进就够了。删除操作吧,都是退回到命令模式切换光标位置或者按上下左右切换位置,感觉都不咋用。

Vim - 视图模式

之前我只知道Ctrl+V, 用来对那几行前面插入注释,但不知道为何他只能选择一个方块儿,后面的内容就无法选中。。。
小写v: 基于字符模式选择,从光标所在字符开始选中。
大写V:基于行选择,从光标所在行开始选中整行。
Ctrl + v:基于块,可以选中方块儿形状的内容。(可配合小写o,大写O来快速跳转光标位置)
gv:选中之前选择的内容。
小写u大写U来切换文本大小写,~也可切换大小写。
> 增加缩进,< 减小缩进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程--基础指令(!!详细讲解+知识拓展)

第一讲 基础指令 ​ 我们现如今自己使用的电脑大部分是用的都是windows或者macOS&#xff0c;并配合上由微软和苹果开发的图形化界面&#xff0c;所以使用鼠标再屏幕上进行点击即可完成许多任务。但是作为操作系统的学习者&#xff0c;在linux的基础上不再使用图形化界进行操作…

ADK 第四篇 Runner 执行器

智能体执行器 Runner&#xff0c;负责完成一次用户需求的响应&#xff0c;是ADK中真正让Agent运行起来的引擎&#xff0c;其核心功能和Agents SDK中的Runner类似&#xff0c;具体作用如下&#xff1a; 会话管理&#xff1a;自动读取/写入 SessionService&#xff0c;维护历史信…

【Tauri2】37——后端处理invoke

目录 前言 正文 随便看看 看看get 看看parse_invoke_request 看看message_handler 看看handle_ipc_message 看看webview的on_message方法 第一种情况的处理 第二种情况的处理 运行通信函数 返回的处理 整个流程 前言 【Tauri2】033 __TAURI_INTERNALS__和invoke-C…

kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程

一 从 LiveData 迁移到 Kotlin Flow 完整教程 LiveData 长期以来是 Android 架构组件中状态管理的核心&#xff0c;但随着 Kotlin Flow 的成熟&#xff0c;Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节&#xff0c;完成平滑迁移。 一、为什…

C++负载均衡远程调用学习之获取主机信息功能

目录 01Lars-lbAgentV0.2-赋值均衡数据结构关系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb数据结构的定义 03Lars-lbAgentV0.2-proto协议的定义 04 Lars-lbAgentV0.2-route_lb与UDP server的关联 05 -Lars-lbAgentV0.2-route_lb与UDP server的关联 06Lars…

2025系统架构师---论软件的设计模式论文

2023 年,我所在的公司承担了某部网络靶场的研发任务。我作为公司的技 术总监,希望能打造基于网络靶场的系列产品,参与到项目的设计中,以期开发 扩展性和可维护性良好的网络靶场,为以后的产品开发打下基础。网络靶场是网 络安全技术研究的基础支撑平台,它利用虚拟的和实物…

Kubernetes排错(七)-节点排错

1、节点 Crash 与 Vmcore 分析 kdump 介绍​ 目前大多 Linux 发新版都会默认开启 kdump 服务&#xff0c;以方便在内核崩溃的时候, 可以通过 kdump 服务提供的 kexec 机制快速的启用保留在内存中的第二个内核来收集并转储内核崩溃的日志信息(vmcore 等文件), 这种机制需要服务…

【QT】QT中的软键盘设计

QT的软键盘设计 1.软键盘制作步骤2.介绍有关函数的使用3.出现的编译错误及解决办法示例代码1&#xff1a;按键事件实现软键盘现象&#xff1a;示例代码2&#xff1a;按键事件实现软键盘&#xff08;加特殊按键&#xff09;现象&#xff1a; 软键盘移植到新的工程的步骤&#xf…

【LaTeX+VSCode本地Win11编译教程】

LaTeXVSCode本地编译教程参考视频&#xff1a; LaTeXVSCode本地编译教程 下面提供一种Win11的Latex环境配置和设置方案&#xff0c;首先vscode安装参考博客&#xff1a;【VscodeGit教程】&#xff0c;然后准备安装Latex相关组件 在 https://miktex.org/download 下载 miktex 并…

2025五一杯数学建模ABC题赛题已出

2025五一杯数学建模ABC题赛题已出 A: B: C:

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自己的地址。 提供者&#xff1a;启动后向Eureka注册自己信息&#xff08;地址&#xff0c;服务名称等&#xff09;&#xff0c;并且定期进行服务续约 …

Docker —— 隔离的基本操作(2)

Docker —— 隔离的基本操作&#xff08;2&#xff09; unshareunshare 命令详解基本语法常用选项常用示例实际应用场景注意事项与 Docker 的关系1. 执行命令2. 修改主机名3. 退出命名空间4. 验证宿主机主机名关键原理类比 Docker 容器总结 实战操作一&#xff08;PID 隔离&…

Java List分页工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分页工具类*…

中阳策略:如何从K线行为中提取交易逻辑信号?

中阳策略&#xff1a;如何从K线行为中提取交易逻辑信号&#xff1f; 在量化趋势研究中&#xff0c;中阳形态常被视作市场动能变化的重要标志。它不仅代表价格的强势上行&#xff0c;更隐含着主力资金换手与情绪转换的信号。将“中阳”这一结构元素抽象为模型中的“强动能突破”…

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…

Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)

目录 引言一、背景&#xff1a;为什么代理IP是爬虫的“第二生命”&#xff1f;1.1 反爬系统的IP检测三把刀1.2 代理IP的核心价值 二、基础实战&#xff1a;快速搭建代理IP系统2.1 免费代理IP的获取与筛选2.2 代理IP的智能容错机制 三、高阶攻防&#xff1a;突破企业级反爬封锁3…

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…

ByteArrayInputStream 类详解

ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流&#xff0c;位于 java.io 包。它允许将内存中的字节数组当作输入流来读取&#xff0c;是处理内存数据的常用工具。 1. 核心特性 内存数据源&#xff1a;从字节数组&#xff08;b…

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据&#xff0c;令是序列的第i个元素&#xff0c;那么就是一个长度为的序列&#xff0c;NLP中最常见的元素是单词&#xff0c;对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时&#xff0c;为了表示序列的…