简介
Vim编辑程序有三种操作模式
- 编辑模式
- 插入模式
- 命令模式
Vim 的 -b
选项是告诉 Vim 打开的是一个二进制文件
基本操作
-
i
进入插入模式,输入内容 -
Esc
退出编辑 - 输入
:wq
+Enter
退出保存
编辑模式
Vim编辑方式的主要用途是在被编辑的文件中 移动光标 的位置。
可以进行 剪切 和粘贴正文块,删除正文和插入新的正文
跳转
→ 或 k # 上移
← 或 j # 下移
↑ 或 h # 左移
↓ 或 l # 右移
# 当光标停留在 单词上 ,# 会在文件内搜索该单词,每按一次就会跳转到 "上一个"
* 当光标停留在 单词上 ,* 会在文件内搜索该单词,每按一次就会跳转到 "下一个"
| 跳转到 "当前行开头"
0 数字零,跳转到 "当前行开头"
$ 跳转到 "当前行末尾"
段落区分:即通过空行进行分割,每一块称为一个段落
{ 跳转到 "当上一段落结尾",若为开头,就跳转当 "前段落开头"
} 跳转到 "当前段落结尾"
g_ 跳转到本行最后一个不是 blank 字符的位置。
G 跳转到 "最后一行开头"
gg 跳转到 "第一行开头"
nG 或 ngg 跳转到 "第n行"
例如:
4G # 表示跳转到第四行
5gg # 表示跳转到第五行
L 跳转到 "屏幕最后一行"
M 跳转到 "屏幕中间行"
H 跳转到 "屏幕的第一行"
可以采用 "数字 + L/H" 的方式
例如:
3H # 表示跳转到当前屏幕的第三行
2L # 表示跳转到当前屏幕的倒数第二行
字母移动
w 移动到 "下一个单词开头"
e 当光标位于 "单词中",会移动到 "单词末尾"
当光标位于 "单词结尾",会移动到 "下一个单词末尾"
b 当光标位于 "单词中",会移动到 "当前单词开头"
当光标位于 "单词开头",会移动到 "上一个单词开头"
当内容过多,造成分页时
ctrl+f 在文件中前移一页(相当于 page down)
ctrl+b 在文件中后移一页(相当于 page up)
搜索匹配
/str # "从前往后" 搜索 str,找到第一个就停止
?str # "从后向前" 搜索 str,找到第一个就停止
替换和删除
替换
rc # 用 "字符c" 替换光标位置的内容
nrc # 用 "n" 个 "字符c" 替换光标及其后 "n-1" 个字符
删除
x # 删除当前光标的字符
nx # 删除当前光标的字符以及其后 "n-1" 个字符
dw # 删除光标及其 "后边" 字符,直到遇到空字符,或结尾
例如:
"HelloWorld" 光标在 W 上,删除之后还剩下 "Hello"
"Hello world" 光标在 e 上,删除之后还剩下 "Hworld"
"Hello world" 光标在 o 上,删除之后还剩下 "Hellworld"
"Hello world" 光标在 单词之间的空白 上,删除之后还剩下 "Helloworld"
ndw # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符
例如:
"this is delete , there are problems" 光标 在this的 h 上 ,键入 "3dw" ,结果还剩下 "t, there are problems"
db # 删除光标及其 "左边" 字符,直到遇到空字符,或开头
ndb # 删除 光标前 "n 个 单词" ,包括分隔用到空字符或者换行字符
dd # 删除(剪切)所在行,移除删除时留下的空行
ndd # 删除(剪切)光标n行,移除删除时留下的空行
常用删除
d$ # 删除本行 光标之后 的全部内容
d0 # 删除本行 光标之前 的全部内容
J # 删除本行的回车符( CR ),与下一行合并,用 空格间隔
Vim常规的替换命令有 c
和 s
,并由 编辑模式 进入 插入模式
s # 删除 "光标处的字符",并开启插入模式
ns # 删除 "光标处及其后 n-1 个字符",并开启插入模式
# 当到达行尾就不再删除
S # 删除 "本行的全部内容",并开启插入模式
nS # 删除 "光标行及其后 n-1 行的全部内容",并开启插入模式
cw 或 cW # 删除光标 "右边" 的内容,直到遇到空格或换行,并开启插入模式
# 类似于 "dw",但会开启插入模式
ncw # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符,并开启插入模式
# 类似于 "ndw",但会开启插入模式
cb 或 cB # 删除光标 "左边" 的内容,直到遇到空格或换行,并开启插入模式
# 类似于 "db",但会开启插入模式
ncb # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符,并开启插入模式
# 类似于 "ndb",但会开启插入模式
cd # 删除 "当前行",并开启插入模式
# 类似于 "dd",但会开启插入模式
ncd # 删除 "n行" ,并开启插入模式
# 类似于 "ndd",但会开启插入模式
c$ # 删除本行 "光标之后" 的全部内容,并开启插入模式
# 类似于 "d$",但会开启插入模式
c0 # 删除本行 "光标之前" 的全部内容,并开启插入模式
# 类似于 "d0",但会开启插入模式
复制粘贴
粘贴:
p # 小写字母 p,将 "缓冲区" 的内容粘贴到光标的 "后面";
P # 大写字母 P,将 "缓冲区" 的内容粘贴到光标的 "前面"。
复制:
yy # "复制当前行" 到 "缓冲区"
nyy # "复制n行" 到 "缓冲区"
"+yy # 复制 当前行 到 剪切板
"+y # 复制 当前行以及下一行
"+nyy # 复制 n行 到 剪切板
"+ 一些vim可能不支持
查看是否支持clipboard(clipboard 前是 - 号就不支持) : vim --version | grep "clipboard"
不支持,就安装图形化界面 :sudo apt-get install vim-gnome
撤销和重复
u # 撤销上一步操作
. # 重复最后一条修正的命令
退出
ZZ # 保存并退出vim编辑界面
插入模式
输入 i 进入插入模式
i # 启动插入模式,在光标左侧添加内容
I # 启动插入模式,光标移动到所在行开头
a # 启动插入模式,光标向右移动一位,然后在左侧添加内容
o # 启动插入模式,在光标所在行的下一行产生新行,并跳到新行
O # 启动插入模式,在光标所在行的上一行产生新行,并跳到新行
A # 启动插入模式,光标跳到所在行末尾
退出
ESC
或 Crtl+[
退出插入模式
命令模式
在编辑模式下键入 :
,光标就跳到屏幕最后一行,并在那里显示冒号,便进入 命令模式
:w
保存当前编辑的文件
:w
当前文件另存为
:w 另存文件的路径
:e
在启动的Vim中打开一个文件
:e 文件路径
:q
退出编辑程序
:q # 在未修改的情况下退出
:q! # 放弃所有修改,退出编辑
:wq
保存并退出
:wq
:n
移动光标到指定行
:n # 将光标移动到第 n 行
- 数值 用来指定 绝对行号
- 字符 “.” 表示光标 所在行的行号
- 字符符 “$” 表示正文最后一行的行号;
:5 # 将光标移动到第 5 行
:5 w file # 将第五行写入 file 文件(file文件不能存在)
:2,5 w file # 将2 到 5 行的内容写入到 file 文件中(file文件不能存在,原文件的行数必须存在)
:.,.+5 w file # 将当前行以及其后 5 行 写入到file文件中
:1,$ w file # 将全部内容写入到file文件中(file文件不能存在),相当于 ":w file "
:r
读取文件内容,插入到光标所在行的后面
:r # 将本文件的内容插入到当前光标所在行的末尾
# 注意保存,若不保存只会复制上一次保存的内容
:r file # 将file文件的内容,插入到当前光标所在行的末尾
:f
查看当前文件的名称、状态
文件位置,行数,是否保存,光标所在行
:f
复制当前文件
:f file # 将当前文件复制到file
字符串搜索
字符串搜索,给定字符串,可以通过搜索该字符串,到达 该 字符串出现的行
正向搜索
:/str/ # 以光标所在行为基础, 将光标移到下一个包含 字符串str 的行 的开头
反向搜素
:?str? # 以光标所在行为基础,将光标移到上一个包含 字符串str 的行 的开头
注意:当要搜索的字符串出现在光标所在行,进行搜索时,会被忽略
例:
:?str1?,/str2/ w file
:/str1/,?str2? w file
:?str1?,?str2? w file
:/str1/,/str2/ w file
# 将匹配到的两行及其之间的行写入 file文件中
注意某些情况下,会产生 "逆向范围",会将这两行之间的所有内容写入到文件file中
正则表达式
Vim在进行指定字符串搜索时,可以包含特殊含义的字符,这些特殊字符的搜索字符串称为 正则表达式
^str # 搜索以str "开头" 的行
元字符 | 说明 |
---|---|
. | 匹配任意非空字符,不包括换行符 |
[abc] | 匹配括号内的任意一个字符,可以用 - 表示字符范围 |
[^abc] | 匹配方括号之外的任意字符 |
\d | 匹配数字,等同于[0-9] |
\D | 匹配数字之外的任意字符,等同于[^0-9] |
\x | 匹配十六进制的数字,等同于[0-9A-Fa-f] |
\X | 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f] |
\w | 匹配数字和字母,等同于[0-9A-Za-z] |
\W | 匹配数字和字母以外的任意字符,等同于[^0-9A-Za-z] |
\t | 匹配 tab 字符 |
\s | 匹配空白字符,等同于[ \t],即 空格 和 tab
|
\S | 匹配非空字符,等同于[^ \t], |
元字符 | 说明 |
---|---|
* | 匹配0-任意个 |
\+ | 匹配1-任意个 |
\? | 匹配0-1个 |
\{n,m} | 匹配n-m个 |
\{n} | 匹配n个 |
\{n,} | 匹配n-任意个 |
\{,m} | 匹配0-m个 |
元字符 | 说明 |
---|---|
$ | 匹配行尾 |
^ | 匹配行首 |
\< | 匹配单词词首 |
\> | 匹配单词词尾 |
正文替换
利用 :s 命令可以实现字符串的替换。
"%" # 表示替换范围是所有行,即全文
"s" # 表示后面跟着一串替换命令
"g" # 放在命令的末尾,表示对搜索字符串进行替换,(多次替换)
默认情况下,不加 "g" ,表示只对搜索字符串的首次出现进行替换
`g` 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作;
存在问题:当替换的字符串长度大于原字符串,在替换时,覆盖文本中其他字符串
:s/str1/str2/ # 用 str2 替换 "光标所在行" ,出现的 "首个 str1"
:%s/str1/str2/ # 用 str2 替换 "所有行" ,出现的 "首个 str1"
:%s/str1/str2/g # 用 str2 替换 "所有行" ,出现的 "所有 str1"
:.,$ s/str1/str2/ # 用 str2 替换 "光标所在行到最后一行" ,出现的 "所有 str1"
:1,$ s/str1/str2/ # 用 str2 替换 "第一行到最后一行" ,出现的 "所有 str1"
:g/str1/s /str2/g # # 用 str2 替换 "所有行" ,出现的 "所有 str1"
统计文件中字符串出现的次数:
:%s/str1/&/gn
删除正文
:d # 删除光标所在行
:nd # 删除指定行,n为数字
:.,$ d # 删除当前行到结尾的全部内容
:/str1/ , /str2/d # 以光标所在行为基准,删除 从 str1 到 str2 的所有行
# 若光标所在行以下内容不存在,而光标以上内容,存在则会提示 "逆向范围"
# 这个存在着很多的问题,谨慎使用
Vim的删除命令 :d
,高级删除命令 一般结合 正则表达式 实现
恢复文件
Vim在编辑文件时,会产生一个临时文件,通常以 .
开头,以 .swp
结尾
Vim正常退出时,该文件会被删除
若意外退出,没有保存修改,则可以使用 :recover
来恢复文件,也可以在启动 Vim时用 -r
选项
使用vim创建了一个2.txt,但没有保存直接退出
vim -r /mysh/2.txt
恢复时的提示:
使用交换文件 "/mysh/.2.txt.swp"
"/mysh/2.txt" [新文件]
恢复完毕。请确定一切正常。
(你可能想要将这个文件另存为别的文件名
and run diff with the original file to check for changes)
You may want to delete the .swp file now.
请按 ENTER 或其它命令继续
选项设置
利用 :set
命令可以设置选项
语法:
:set options # options 选项设置
option取值:
ignorecase # 忽略规则表达式中大小写字母的区别
autoindex # 正文自动缩进
number # 显示正文行号
ruler # 在屏幕底部显示光标坐在行 、列的位置,应该不需要设置吧,默认就显示
tabstop # 设置tab键,跳过的空格数
Shell切换
在vim中执行执行linux命令
:!linux命令 # 执行完linux命令,会返回vim界面
分屏
打开一个Vim程序只能查看一个文件,若想要查看多个文件,需要使用 Vim分屏与标签页功能
分屏:
:split 简写: :sp # 上下分屏
:vsplit 简写: :vsp # 左右分屏
启动 Vim 时分屏
切换分屏
Crtl+w+k # 切换到上分屏
Crtl+w+j # 切换到下分屏
Crtl+w+h # 切换到左分屏
Crtl+w+l # 切换到右分屏
Ctrl+w+w # 来跳转分屏,方向则是在当前Vim窗口所有分屏中,按照逆时针方向跳转。
设置分屏的长 宽
Ctrl+W = # 设置分屏的宽高平均分配
Ctrl+W + # 增加当前分屏的 "高度"
Ctrl+W - # 降低当前分屏的 "高度"
Ctrl+W > # 增加当前分屏的 "宽"
Ctrl+W < # 降低当前分屏的 "宽"
标签页
一个标签页打开一个Vim的窗口,一个Vim的窗口可以支持N个分屏。
新建标签命令:
:tabnew
或
:tabe
新建标签页并打开一个文件
:tabnew 文件路径
或
:tabe 文件路径
Vim的每一个标签都有唯一的数字标号,第一个标签页的序号是 0,从左向右依次 +1
:tabn # 跳转到 "下一个" 标签
:tabn n # 跳转到 当前页"右边第 n 个" 标签
:tabN # 跳转到 "上一个" 标签
:tabN n # 跳转到 当前页"左边第 n 个" 标签
:tabp # 跳转到 "上一个" 标签
:tabp n # 跳转到 当前页"左边第 n 个" 标签
:tabr # 跳转到 "第一个" 标签
:tabfir # 跳转到 "第一个" 标签
:tabl # 跳转到 "最后一个" 标签
:tabc # 关闭当前标签
:tabo # 关闭除了当前的所有标签 ( 关闭前都需要保存,否则不能关闭 )
:tabm n # 跳转到 "第 n 个" 标签
:tabf path # 在打开的标签页中 寻找 'path' ,
# 若 'path' 的路径下文件已经打开,就跳转
# 若 'path' 的路径下文件没有打开,则会直接打开
# 若 'path' 的文件不存在,就会报错
:tabs # 查看当前打开的所有标签页的信息
:tabdo 为每个标签页执行命令
参考: Vim入门基础
网友评论