(八)vim editer

简单来说就是一个文本编辑器,如同前面的nano,但vi有更多功能,vim则是vi的的升级版

学习vim的主要条件是因为

  1. 所有UNIX-like都有vi,而其他的文本编辑器未必有
  2. 很多软件的编辑接口都有vi
  3. vim具有程序编程的能力,比如语法高亮
  4. 编辑迅速

使用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
2
3
4
5
6
7
8
9
[1]+  已停止               vim /tmp/my_vim/services
[root@study ~]# cd /tmp/my_vim/
[root@study my_vim]# ls -al
总用量 720
drwxr-xr-x. 2 root root 62 1月 16 03:38 .
drwxrwxrwt. 141 root root 12288 1月 16 03:47 ..
-rw-r--r--. 1 root root 4847 1月 15 21:47 man_db.conf
-rw-r--r--. 1 root root 670293 1月 15 21:45 services
-rw-r--r--. 1 root root 40960 1月 16 03:40 .services.swp

kill -9 %1可以杀死刚才的后台,模拟非正常保存

此时我再打开文件,会出现警告(汉化万岁!!!!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
E325: 注意
发现交换文件 "/tmp/my_vim/.services.swp"
所有者: root 日期: Thu Jan 16 03:40:56 2020
文件名: /tmp/my_vim/services
修改过: 是
用户名: root 主机名: study.centos.vbird
进程 ID: 11776
正在打开文件 "/tmp/my_vim/services"
日期: Wed Jan 15 21:45:18 2020

(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
如果是这样,请用 ":recover""vim -r /tmp/my_vim/services"
恢复修改的内容 (请见 ":help recovery")。
如果你已经进行了恢复,请删除交换文件 "/tmp/my_vim/.services.swp"
以避免再看到此消息。

交换文件 "/tmp/my_vim/.services.swp" 已存在!
以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 删除交换文件((D)), 退出((Q)), 中止((A)):

vim

vim与vi的比较

  1. 有语法高亮
  2. 更多的程序语法
  3. 可以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来再次打开这个文件,这时出现的则是同一个文件在两个窗口中

vim-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
2
3
[root@study my_vim]# vim ~/.vimrc
"代表注释
set hlsearch "high light

vim使用的问题

DOS和Linux换行符

test是我在windows上编辑的,test2是我在Linux上编辑的

可以看到dos使用的换行符是^M$(CRLF),Linux使用的换行符是$(LF)

一般没什么问题,但当文件是一个shell脚本程序时,Linux会误判,导致程序无法运行,需要将CR去掉才行(批量替换?)

有一个简单的命令dos2unix可以直接将格式转换

但是这个指令默认没有安装,安装方法:

1
2
3
4
5
6
7
[root@study my_vim]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@study my_vim]# rpm -ivh /mnt/Packages/dos2unix-*
警告:/mnt/Packages/dos2unix-6.0.3-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signatrue, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:dos2unix-6.0.3-7.el7 ################################# [100%]

命令语法

1
2
3
4
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
-k:保留原本的mtime格式
-n:保留旧文件,后面接旧文件

语系编码转换指令iconv

语法

1
2
3
4
5
6
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]
--list:列出支持的编码
-f:from
-t:to
-o file:保留旧文件,得到新文件

将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 里面提供了一个非常方便地査找匹配括号的命令,这就是 “%”。

多行注释

  1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;

  2. 在行首使用上下键选择需要注释的多行;

  3. 按下键盘(大写)“I”键,进入插入模式;

  4. 然后输入注释符(“//”、“#”等);

  5. 最后按下“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)

多文件切换

  1. 通过vim打开多个文件(可以通过ctags或者cscope)
  2. “:ls”查看当前打开的buffer(文件)
  3. “: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+ 粘贴系统剪贴板

作者

manu

发布于

2020-01-20

更新于

2023-01-06

许可协议

# 相关文章
  1.(十)正则表达式
# 推荐文章
  1.ALTER
  2.数据库笔记
  3.微信小程序笔记
  4.动态调试-OD
  5.winPE结构
  6.git指令

:D 一言句子获取中...