Vim 基础和常用命令整理
时间:2022-07-24
本文章向大家介绍Vim 基础和常用命令整理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0. 前言
大家好,我是多选参数的程序锅,一个正在”捣鼓“操作系统、学数据结构和算法以及 Java 的废物菜鸡。
由于自己比较喜欢 Vim(VSCode 下都在使用 Vim 的插件),并且 Vim 操作起来也比较方便,所以整理了一下 Vim 的基础和常用命令的整理(PS:说到 Linux ,大炮是我心中的 Linux 大神)。
另外,程序锅整了一个关于算法的 github 仓库:https://github.com/DawnGuoDev/algorithm,该仓库除包含基础的数据结构和算法实现之外,还会有数据结构和算法的知识内容整理、LeetCode 刷题记录(多种解法、Java 实现) 、一些优质书籍整理。
1. Vim 的模式
Vim 相比其他编辑器最特别的地方应该是它的模式。进入 Vim 后,在缺省状态下,你键入的字符并不会插入到所编辑的文件中。下面来介绍以下 Vim 的四种模式:
- 正常模式(normal mode,也被称为普通模式):缺省状态下的编辑模式,一般用到的命令都是在这个模式下的。另外,在任何其他模式中,都可以通过
<ESC>
键位返回到正常模式。 - 插入模式(insert mode):这个模式主要用来输入文本使用。在正常模式下按下 i(insert) 或 a(append) 之后,即可进入插入模式。
- 可视模式(visual mode):这个模式主要用来选定文本块。在正常模式下,按下 v 或者 V 之后进行可视化模式,前者是进入按字符方式选定的,后者是进入按行的方式选定的。
- 命令行模式(command-line mode):用于执行一些较复杂的命令。在正常模式下键入冒号(:)即可进入命令行模式,除了使用
<ESC>
键回到正常模式之外,还可以将命令行的内容(包括冒号)都删除之后也可以回到正常模式。命令行模式中输入命令之后,记得再按回车键(Enter)才能执行输入的命令。 另外,使用斜杠(/)和问号(?)开始搜索也算是命令行模式。
Vim 还会有个选择模式,但是这个选择模式并不是 Vim 的主要用法,一般提到的话都是提上述几个模式。在这些模式中最重要的是正常模式,我个人相当于把正常模式当成中间过渡的模式。
2. Vim 的基本使用
2.1. bash 下的操作
vim <FILENAME> # 使用 vim 打开个文件
vim -o <FILENAME1> <FILENAME2> # 水平分割(默认)
vim -O <FILENAME1> <FILENAME2> # 垂直分割
vim -On <FILENAME1> <FILENAME2> # n 表示分几个屏,可不填,不填时按照需要打开的文件个数来
2.2. 正常模式
###### 进入其他模式 ######
i # 光标前面插入并进入插入模式
a # 光标后面插入并进入插入模式
I # 行首插入并进入插入模式
A # 行末插入并进入插入模式
o # 在光标的下一行刚开始插入并进入插入模式
O # 在光标的上一行插入并进入插入模式
: # 进入命令行模式
/ # 进入命令行模式开始搜索,从光标处开始向下搜索。使用 n 是向下查找搜索内容,N 是反方向
? # 进入命令行模式开始搜索,从光标处向上搜索。使用 n 是向上查找搜索内容,N 是反方向
# 在使用 / 或者 ?搜索之前,使用 set ic(:set ic) 表示忽略大小写;
# set noic(:set noic) 表示不忽略大小写;
# set hls(:set hls) 那么在搜索的时候会高亮,set nohlsearch
# set is(:set is) 那么表示会自动跳转,set noincsearch 表示取消
# 假如就想一次搜索的时候忽略大小,那么使用c,比如使用 /ignorec
#(set xxx 表示设置 xxx 选项,上述的选项分别对应的是 ic(ignorecase)、is(incsearch)、hls(hlsearch),你可以输入缩写也可以全输进去,在前面加上 no 就表示关闭这个选项)
v # 进入 visual 模式,按字符来选择
V # 进入 visual 模式,按行来选择
###### 光标移动 ######
hjkl # 左下上右
w(word) # 移到下一个 word 之前,可在前面加数字
2w # 移过两个 word,并在第三个 word 之前
e # 移动到当前 word 的最后,可在前面加数字
3e # 移到第三个词的最后
$ # 移动到当前 line 的最后,可在前面加数字
2$ # 当前行的下一行的行末
0 # 移动到当前 line 的开始
[line number] G # 跳转到文件底部(:$也可以);假如有加 line number 的话,那么跳转到相应行数
gg # 文件顶部
% # 停留在 ([{}]) 处, 那么会跳转到另一个匹配的括号处;不停留的在括号处的话,那么会跳转到离光标最近的那个括号相匹配的括号处
CTRL-O # 跳转到更旧的光标所处(可结合搜索)
CTRL-I # 跳转到更新一点的光标所在处(可结合搜索)
###### 文本操作 ######
# 正常模式下改变文本内容的命令,通常由 opeartor、number 和 motion 组成。
# operator [number] motion
# operator 是要执行的操作命令
# number 是可选的,用于表示重复的 motion 次数;
# motion 是 opeartor 操作的内容
# 常见的 opeartor
d(delete) # 单个 d 无作用(在 normal mode 中),但是在 visual mode 中有用
c(change) # 单个 c 无作用(在 normal mode 中),但是在 visual mode 中有用,删除所选并进入 insert mode
y(yank) # 单个 y 无作用(在 normal mode 中),但是在 visual mode 中有用
# 常见的 motion
w(word) # 移到下一个 word 之前
e # 移动到当前 word 的最后
$ # 移动到当前 line 的最后
0 # 移动到当前 line 的开始
# number 和 motion 组合示例
2w # 移过两个 word,并在第三个 word 之前
3e # 移到第三个词的最后
2$ # 当前行的下一行的行末
# 常用示例
dw # 删除一个单词
de # 删除从光标处到 word 末的内容
d$ # 删除从光标处到行末的内容
d2w # 删除两个单词
dd # 删除一行
2dd # 删除两行
ce # 效果其实就是删除从光标处 word 最后字符的内容并进入 insert mode
cc # 删除整行,并进入 insert mode
yw # 复制一个 word
yy # 复制当前行的数据
2yy # 复制两行数据
#######################################
D # 删除整行
C # 删除整行,并进入 inser mode
Y # 复制光标所在的一整行内容
s # 删除光标所在字符,并进入 insert mode
S # 删除光标所在行,并进入 insert mode
p # 粘贴文本,比如 dd 删除的内容或者 y 复制的内容。dd 的内容如果是一行的话,那么会被粘贴到光标的下一行
P # 内容是一行的话,那么会被粘贴到光标的上一行
x # 删除光标处的文字
X # 删除光标前的文字(backspace)
r # 移到要替换的字母, r 之后后面紧跟要替换的字母,只能替换一个
R # 进入替换模式,用之后输入的内容依次替换掉光标之后的内容,相当于进入了 replace mode, esc 退出,replace mode 类似于 insert mode。
###### 其他操作 ######
u # 撤销前一个的操作
U # 将整行的改变撤销
CTRL-R # 撤销撤销所做的事(U 所做的事情不相当于撤销)
.(小数点) # 重复前一个操作
CTRL-G/g # 显示光标在文件的第几行和文件的信息
2.3. 命令行模式
:q! # 不做修改的退出
:wq # 保存退出
:w <Filename> # 将当前的文件内容写入到 Filename 中。在 visual mode 下输入 :,并在出现的内容后面输出 w Filename 那么会将选择的内容保存到 Filename 的文件中。
:! <命令> # 执行 Linux 下的命令
:n # 跳转到第 n 行
:$ # 跳转到最后一行
:s/old/new # 替换到第一个 old
:s/old/new/g # 将光标所在行的 old 全都替换为 new,g 表示整行都进行替换
:%s/old/new/g # 整个文件进行替换
:%s/old/new/gc # 整个文件进行替换并提示
:#, #s/old/new/g # 表示行号,那么意思是 # 和 # 之间
:r <FILENAME> # 将一个文件的内容插入到打开的文件所在光标的下面
:r !ls # 把 ls 命令的执行结果插入到打开的文件中
:set number # 设置行号
:set nocp # 设置不兼容模式
:set ic # 搜索时,忽略大小写,需要在搜索之前设置
:set noic # 搜索时,不忽略大小写;
:set hls # 搜索时,匹配的内容会高亮
:set nohlsearch # 取消高亮效果
:set is # 搜索时,会自动跳转到第一个匹配的内容
:set noincsearch # 表示取消跳转效果
# 假如就想一次搜索的时候忽略大小,那么使用c,比如使用 /ignorec
#(set xxx 表示设置 xxx 选项,上述的选项分别对应的是 ic(ignorecase)、is(incsearch)、hls(hlsearch),你可以输入缩写也可以全输进去,在前面加上 no 就表示关闭这个选项)
:e # 命令行中直接打开编辑一个文件
:s [FILENAME] # 水平切分窗口,有跟文件名的话,这个文件的内容就在新的窗口
:vs [FILENAME] # 垂直切分窗口,有跟文件名的话,这个文件的内容就在新的窗口
:sp
:split
:vsplit
# Ctrl + w + 方向键 -- 切换到前/下/上/后一个窗格
# Ctrl + w + h/j/k/l -- 同上
# Ctrl + ww -- 依次向后切换到下一个窗格中
# Crtl + w + + 扩大窗口
# Ctrl + w + - 缩小窗口
# :q 是退出光标所在的分屏
:help # 查看帮助
:help w # 查看 w 的帮助
:help c_CTRL-D
:help insert-index
:help user-manual # 查看用户手册
CTRL-D # 会显示全部的提示内容
<Tab> # 自动补齐
2.4. 可视化模式
hjkl # 选中内容移动
y # 复制选中的内容
d # 删除选中的内容
c # 删除选中的内容,并进入 insert mode
2.5. 插入模式
<ESC> # 返回正常模式
2.6. 其他
vim 相比 vi 引入了很多特性,但是他们的大部分都是被禁止的。你可以编辑 vimrc (Unix:.vimrc)来打开某些功能,可使用 $VIMRUNTIME/vimrc_example.vim 中的内容。
不甘于「本该如此」,「多选参数 」值得关注
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册
- Selenium 系列篇(四):JS 篇
- 【5分钟玩转Lighthouse】家乡的战疫
- Kubernetes 源码学习之延时队列
- Selenium 系列篇(三):窗口篇
- Selenium 系列篇(二):元素定位
- ES2020 中 Javascript 10 个你应该知道的新功能
- Selenium 系列篇(一):准备篇
- HTML5+CSS3高级动画的应用实践
- 这五个有用的 CSS 属性完全被我忽视了
- 在 Kubernetes 中使用 Helm Hooks 迁移数据库
- 漫画:如何螺旋遍历二维数组?
- 轻松学Pytorch-迁移学习实现表面缺陷检查
- 汇总 | OpenCV4中的非典型深度学习模型
- 如何使用私有仓库的 Go Modules