简介
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入门基础










