(八)vim editer
简单来说就是一个文本编辑器,如同前面的nano,但vi有更多功能,vim则是vi的的升级版
学习vim的主要条件是因为
- 所有UNIX-like都有vi,而其他的文本编辑器未必有
- 很多软件的编辑接口都有vi
- vim具有程序编程的能力,比如语法高亮
- 编辑迅速
使用vi
三种模式
command mode
- 命令
vi filename就会进入command mode(一般命令模式),不管文件名存不存在(存在就打开,不存在就新建) - 可以进行复制粘贴、删除、搜索、替换等操作
- 命令
insert mode
- 在一般模式下使用
i、I、o、O等就可以进入insert mode(编辑模式) - 可以编辑字符
esc退出编辑模式
- 在一般模式下使用
command-line mode(命令行模式)
- 一般模式下输入
:、/、?都可以进入命令行模式 - 可以读取、存储文件
esc退出
- 一般模式下输入
三者的关系如下图
- 注意编辑模式和命令行模式不能互相转换
vi按键说明
一般命令模式
1.移动光标
| 按键 | 含义 |
|---|---|
| h或者← | 光标向左移动一个字符 |
| j或↓ | 向下移动 |
| k或↑ | 向上移动 |
| l或→ | 向右移动(特殊用法:10j/↓代表向下移动10行) |
| ctrl+f | 向下移动一页,相当于PD |
| ctrl+b | 向上移动一页,相当于PU |
| ctrl+d | 向下移动半页 |
| ctrl+u | 向上移动半页 |
| + | 移动到非空格符的下一行 |
| - | 非空格符的上一行 |
nspace |
n代表数字,数字接space代表移动多少个字符 |
0或home |
移动到行首 |
$或end |
移动到行末 |
| H | 移动屏幕首行字符 |
| M | 移动屏幕中央行首字符 |
| L | 移动屏幕末行首字符 |
| G | 移动到文件最后一行 |
| nG | 表示移动到第n行 |
nenter |
表示向下移动n行 |
2.查找替换
| 按键 | 含义 |
|---|---|
| /word | 向下寻找word |
| ?word | 向上寻找word |
| n | 继续上一个寻找动作 |
| N | 反向n |
| :n1,n2s/word1/word2/g | 从n1行到n2行将word1替换成word2 |
| :1,$s/word1/word2/g | 全文替换 |
| :1,$s/word1/word2/gc | 替换时提醒用户 |
3.删除、复制粘贴
| 按键 | 含义 |
|---|---|
| x、X | x相当于del,X相当于backspace |
| nx | 表示向后删除n个字符 |
| dd | 剪切光标所在的一行 |
| ndd | 剪切光标所在的向下n行 |
| d1G | 剪切光标到第一行 |
| dG | 剪切光标到最后 |
| d$ | 剪切光标到本行末字符 |
| d0 | 剪切光标到本行首字符 |
| yy | 复制光标在的一行 |
| nyy | 复制光标所在的向下n行 |
| y1G | 复制光标到第一行 |
| yG | 复制光标到最后一行 |
| y0 | 复制光标到行首字符 |
| y$ | 复制光标到行末字符 |
| p&P | 如果复制的是一串字符,p会粘贴到光标后面,P粘贴到光标前面;如果复制几行,p粘贴到光标下一行,P粘贴到光标上一行 |
| J | 将光标所在下一行结合成一行,前面可以接n |
| c | 重复删除多个数据,删除10行,10cj |
| u | 恢复一个操作 |
ctrl+r |
撤销一个操作 |
. |
复制前一个操作 |
编辑模式
| 按键 | 含义 |
|---|---|
| i&I | i从当前光标插入,I从光标所在行的第一个非空格字符处插入 |
| a&A | a从光标下一个字符插入,A从所在行最后一个字符插入 |
| o&O | o从光标下一行插入新的一行,O从光标上插入 |
| r&R | 进入replace mode(替换模式),r会替换光标的那个字符,R则是一直处于替换模式,直到esc |
命令行模式
| 按键 | 含义 |
|---|---|
| :w | 写入硬盘 |
| :w! | 文件为只读时,强制写入,还是要看用户的权限 |
| :q | 退出vi |
| :q! | 强制退出,比如做了修改不想保存时 |
| :wq | 保存退出,可接! |
| ZZ | 没修改时,则直接退出,修改了后,则保存退出 |
| :w [path/filename] | 另存文件,后面接路径和文件名 |
| :r [path/filename] | 读取文件,在现有文件中读取另一个文件到这个文件中 |
| :n1,n2 w [path/filename] | 将n1-n2行的数据保存到另一个文件 |
| :!comman | 暂时退出vi执行command指令 |
| :set nu | 显示行号 |
| :set nonu | 不显示行号 |
vim缓存
进行vim编辑时,会临时有一个缓存文件.filename.swp
- 当文件正常保存时,缓存文件会自动删除
- 当电脑突然宕机时,缓存文件不会消失,可使用缓存来恢复工作
ctrl+z可暂时将编辑工作放入后台,可以看到缓存文件
1 | [1]+ 已停止 vim /tmp/my_vim/services |
kill -9 %1可以杀死刚才的后台,模拟非正常保存
此时我再打开文件,会出现警告(汉化万岁!!!!)
1 | E325: 注意 |
vim
vim与vi的比较
- 有语法高亮
- 更多的程序语法
- 可以debug
可视区块(Visual block)
在这个模式下,我们可以对文本镜进入行选择,列选择
| 按键 | 含义 |
|---|---|
| v | 字符选择,将光标经过的地方选择 |
| V | 行选择,将光标经过的行选择 |
ctrl+v |
列选择,将光标经过的列选择 |
| y | 将选择的地方复制 |
| p | 在光标处粘贴复制的区块 |
| d | 删除选择的地方 |
多文件编辑
我们有时候会编辑多个文件,有着不同的编辑方式
| 按键 | 含义 |
|---|---|
| :n | 下一个文件 |
| :N | 上一个文件 |
| :files | 列出这个vim打开的文件 |
1.在多个vim窗口编辑
操作很简单,但如果想将A文件的内容复制到B去,需要用鼠标选中复制粘贴,这样有一个缺点,那就是A文件tab会被鼠标转换成空格,导致内容无法对齐,可以采用另一种编辑方式
2.使用一个vim窗口编辑
vim file1 file2打开两个文件- 在命令模式下使用
:e file打开文件 - 使用:files可以查看打开了多少个文件
多窗口功能
当有一个非常的文本文件时,我想在首行和末行操作时,需不需要来回费劲的G和翻页呢?
我们可以使用:sp来再次打开这个文件,这时出现的则是同一个文件在两个窗口中

| 组合按键 | 含义 |
|---|---|
| :sp [filename] | 水平新建窗口,默认打开同一文件,有其他文件则打开其他文件 |
| :vsplit filename | 垂直 |
ctrl+w+j/↓ |
按住ctrl,按下w再按j,将光标移动到下一个窗口 |
ctrl+w+k/↑ |
移动到上一个窗口 |
ctrl+w+q |
退出这个窗口,也可以在这个窗口输入:q,或者:close |
vim关键字补全
类似Hbuild、sublime的关键字补全功能,识别语法补全关键字,vim也是可以的
| 组合按键 | 含义 |
|---|---|
ctrl+x -> ctrl+o |
通过正在编辑的文件的内容作为关键字,进行补齐 |
ctrl+x -> ctrl+f |
以当前目录内的文件名作为关键词,进行补齐 |
ctrl+x -> ctrl+n |
以扩展名作为语法补充,通过vim内置关键字补齐 |

vim环境设置与记录
- vim有一个主动记录操作的文件
~/.viminfo,这样你每次重新打开文件都会回到上次的工作状态 - vim的环境设置参数也有很多
| 参数 | 含义 |
|---|---|
| :set nu/nonu | 设置/取消行号 |
| :set hlsearch/nohlsearch | high light search,高亮查找 |
| :set autoindent/noautoindent | 自动缩进 |
| :set backup/nobackup | 自动备份文件,例如,在编辑host时,会有一个host~的文件记录源文件 |
| :set ruler | 显示右下角的状态 |
| :set showmode | 显示各种模式 |
| :set backspace=(012) | 2代表可以删除任何字符,0和1代表只能删除输入的字符 |
| :set all | 显示设置的所有环境参数 |
| :set | 显示与系统默认的参数不同的参数 |
| :syntax on/off | 程序语法,开启会有高亮debug |
| :set bg=light/dark | 背景色调 |
不可能每次进入文件都要设置,需要一个配置文件
整体的vim设置值在/etc/vimrc中,这个文件不建议修改,可以自行建立一个文件~/.vimrc
格式
1 | [root@study my_vim]# vim ~/.vimrc |
vim使用的问题

test是我在windows上编辑的,test2是我在Linux上编辑的
可以看到dos使用的换行符是^M$(CRLF),Linux使用的换行符是$(LF)
一般没什么问题,但当文件是一个shell脚本程序时,Linux会误判,导致程序无法运行,需要将CR去掉才行(批量替换?)
有一个简单的命令dos2unix可以直接将格式转换
但是这个指令默认没有安装,安装方法:
1 | [root@study my_vim]# mount /dev/sr0 /mnt |
命令语法
1 | dos2unix [-kn] file [newfile] |
语系编码转换指令iconv
语法
1 | iconv --list |
将utf-8繁体转换utf-8简体的指令
1 | iconv -f utf8 -t big5 file | iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o file.utf8 |
实战技巧
| 快捷键 | 功能描述 |
|---|---|
| w 或 W | 光标移动至下一个单词的单词首 |
| b 或 B | 光标移动至上一个单词的单词首 |
| e 或 E | 光标移动至下一个单词的单词尾 |
| nw 或 nW | n 为数字,表示光标向右移动 n 个单词 |
| nb 或 nB | n 为数字,表示光标向左移动 n 个单词 |
Vim光标移动到匹配的括号处
程序员在编辑程序时,经常会为将光标移动到与一个 “(“ 匹配的 “)” (对于 [] 和 {} 也是一样的)处而感到头疼。Vim 里面提供了一个非常方便地査找匹配括号的命令,这就是 “%”。
多行注释
首先按
esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;在行首使用上下键选择需要注释的多行;
按下键盘(大写)
“I”键,进入插入模式;然后输入注释符(
“//”、“#”等);最后按下
“Esc”键
- 注:在按下
esc键后,会稍等一会才会出现注释,不要着急~时间很短的
使用
>配合ctrl+v可进行整体缩进
代码折叠
https://www.jianshu.com/p/16e0b822b682
打开多个文件、同时显示多个文件、在文件之间切换
打开多个文件
vim file1 file2 ... file
:open file
:e file
在文件之间切换
Ctrl+6—下一个文件
:bn—下一个文件
:bp—上一个文件
:bd [num1,num2]/[filename]-关闭buffer
多文档编辑的命令
:n 编辑下一个文档。
:2n 编辑下两个文档。
:N 编辑上一个文档。注意,该方法只能用于同时打开多个文档。
:e 文档名 这是在进入vim后,不离开 vim 的情形下打开其他文档。
:e# 或 Ctrl+ˆ 编辑上一个文档,用于两个文档相互交换编辑时使用。?# 代表的是编辑前一次编辑的文档
:files 或 :buffers 或 :ls 可以列出目前 缓冲区 中的所有文档。加号 + 表示 缓冲区已经被修改过了。#代表上一次编辑的文档,%是目前正在编辑中的文档
:b 文档名或编号 移至该文档。
:f 或 Ctrl+g 显示当前正在编辑的文档名称。
:f filename 改变编辑中的文档名。(file)
多文件切换
- 通过vim打开多个文件(可以通过ctags或者cscope)
- “:ls”查看当前打开的buffer(文件)
- “:b num”切换文件(其中num为buffer list中的编号)
其他快捷键
表示范围的命令:
l: 表示一个字符,可以于操作符组合使用;
aw :表示单词+空格,前面可以加数字的
iw: 选中单词/空格; 前面可以加数字;
ap: 表示一个段落,与操作符组合使用;
跳转的指令:
G键是跳转命令。默认跳到最后一行;前面可以加数字的;表示跳到第几行;
gg键为跳转命令,默认跳到第一行,前面可以加数字,表示跳到第几行;
0: 跳转命令,跳到行首 ;
$: 表示跳到行尾;
w: 表示跳转到下一个单词的头部;
e: 表示跳转到下一个单词的尾部;
b: 表示跳转到上一个单词的头部;
ge:表示跳转到上一位单词的尾差部;
A: 跳转到行尾,并进行插入模式;
I: 跳转到行首,并进行插入模式;
H: 当前页的页首;
M:当前页的页中间;
L:当前页的页尾;
zz:让光标所在的行居于屏幕中央;
操作功能符:
>: 表示向右缩进的动作;
<: 表示减少缩进;
gu: 转换为小写的动作;
gU: 转换为大写的动作;
u/U:在可视模式下,可以用来转换选中的字符;
g~:用于转换——小写变大写,大写变小写;
x:删除光标下的字符;
s:删除光标下的字符并进入插入模式;
X:用于删除光标之前的字符;
c:为一个动作,删除并进入插入模式,可以组合使用,如cw, cG等;
cc:表示删除本行并进行插入模式;
J: 把当前行与下一行连接在一起;
K: 用于查看处于光标之下的那个单词的手册页;
r: 用于替换单个字符;
R:用于连续替换多个字符;
查找操作:
f{word}表示:在行内查找下一个指定的字符,前面可以加数字,表示第几个字符; (用;与,进行前进与退回)
F{word}表示:在行内查找上一个指定的字符,前面可以加数字,表示第几个字符; (用;与,进行前进与退回)
/{pattern}表示:在文档内查找下一处匹配的项(用 n 和 N 进行前进与返回, gn与gN会进行面对字符的可视模式, 下同;)
?{pattern}表示:在文档内查找上一处匹配的项(用 n 和 N 进行前进与返回)
* 表示:向下查找光标下的单词,前面可以加数字(用 n 和 N 进行前进与返回)
# 表示:向止查找光标下的单词,前面可以加数字(用 n 和 N 进行前进与返回)
与 ctrl 相关的快捷键:
ctrl-g 表示显示文件信息;
ctrl-f 向下翻一页;
ctrl-b 向上翻一页;
ctrl-d 向下翻半页;
ctrl-u 向下翻半页;
精准跳转和修改
我个人感觉 vim 快最重要的原因就是精准选择。而实现精准选择的必要途径就是搜索。
搜索是 vim 的核心。比如说你需要跳到下个函数,那直接/def。再比如需要跳到括号末,直接f)。终端中,刚输入完python eval.py device cuda data.batch_size 256,发现这行指令中的python要改成python3,可以 直接Fna3。又发现前面要加sudo,直接^isudo。总之一切精确修改都是通过搜索来完成的,这与我们不使用vim编程时搜索只用来查找代码有本质区别
结合v V ctrl+v 这三种可视化模式进行精确选择,配合cdyrp等指令,可以完成极其灵活的代码增删改查。到这一步你会发现vim对你编程速度的提高已经是革命性的了
数字增减
normal模式下
ctrl-a
ctrl-x
删减词
normal:
daw
dw
cw
ctrl+w
insert mode: ctrl+w
区块选择
- vi” → 会选择 foo.
- va” → 会选择 “foo”.
- vi) → 会选择 “foo”.
- va) → 会选择(“foo”).
- v2i) → 会选择 map (+) (“foo”)
- v2a) → 会选择 (map (+) (“foo”))
与系统剪贴板交互
输入 vim --version 查看是否支持 clipboard
支持则使用 "y+ 将vim选区复制进系统剪贴板
同理,使用 "p+ 粘贴系统剪贴板
(八)vim editer