(八)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