为什么要学vim

  • 所有的UNIX-like系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在
  • 所有软件的编辑接口都会主动调用vi(例如crontab、visudo、edquota等命令)
  • vim具有程序编辑能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计
  • 程序简单,编辑速度相当快速

    vim命令及使用

    vim设计理念

    Vim 采用模式编辑的理念,即它提供了多种模式,按键在不同的模式下作用不同。

    vim模式类型

  • 命令模式

  • 编辑模式
  • 末行模式

    切换到编辑模式

    | 命令 | 含义 | | —- | —- | | i | 在光标前一个字符插入 | | a | 在光标后一个字符插入 | | I | 在行首插入 | | A | 在行尾插入 | | o | 向下开启一行插入 | | O | 向上开启一行插入 |

进入命令模式

Esc命令可以从编辑模式/末行模式进入命令模式

命令模式下操作

光标移动

命令 含义
h 左移
j 下移
k 上移
l 右移
M 移动到中间行
G 移动到文件末行
gg 移动到文件首
num+G 移动到指定行 如:10G(转到第10行)

删除操作

命令 含义
X 删除光标前一个字符,等于del命令
x 删除光标后一个字符,等于backspace命令
dd 删除光标所在行
行数 + dd 删除指定数量行
D 删除光标后本行所有字符(包含光标所在字符)
d0 删除光标前本行所有字符(不包含光标所在字符)

撤销操作

命令 含义
u 一步一步撤销
ctrl + r 反撤销

复制粘贴操作

命令 含义
yy 复制光标所在行
p 向下开辟一行粘贴复制内容

批量/选中操作

命令 含义
v 按字符选中(配合d,y对文本删除,复制)
V 按行选中(配合d,y对文本删除,复制)

末行模式下操作命令

查找操作

命令 含义
:/查找内容 末行模式下输入插入内容
n 下一个
N 上一个
:set nu 显示行号
:set nonu 取消显示行号

替换操作

  1. 将当前文件中的所有abc替换成123
  2. :%s/abc/123/g
  3. 末行模式下,将第一行至第10行之间的abc替换成123
  4. :1, 10s/abc/123/g
  5. %表示整个文件, 1, 10表示110行范围内
  6. s表示替换
  7. g表示全局

特别注意:在vim编辑器中【数字】是很有意义,通常代表重复做多少次的意思,也可能代表去第几个什么什么的意思。举例:
删除50行:【50dd】
光标下移20行:【20j】或【20↓】

vim缓存、恢复与打开时的警告信息

在使用vim编辑时,vim会在与被编辑的文件的目录下,再建立一个文件名为.filename.swp的文件。

# 窗口1打开文件
[root@cnsz92vl12951 vim_test]# vim welcome01.txt
# 窗口2查看当前目录下的文件
[root@cnsz92vl12951 vim_test]# ll -a
total 20
drwxr-xr-x  2 root  root   85 Aug 22 16:36 .
drwxr-xr-x. 9 rhlog root 4096 Aug 22 15:58 ..
-rw-r--r--  1 root  root   37 Aug 22 16:28 test.py
-rw-r--r--  1 root  root   45 Aug 22 16:09 welcome01.txt
-rw-r--r--  1 root  root 4096 Aug 22 16:36 .welcome01.txt.swp
-rw-r--r--  1 root  root   39 Aug 22 16:10 welcome02.txt

.filename.swp的缓存,会记录用户对filename的操作,如果因为系统掉线等异常,导致编辑的文本没用保存,这个.filename.swp就能发挥恢复功能了。

# welcome01.txt文件原内容---窗口1
test
test
# 新增如下内容---窗口1
python
python
# 手动kill正在操作的vim进程---窗口2
[root@cnsz92vl12951 vim_test]# ps aux|grep vim
root     22510  0.2  0.0 149444  5176 pts/2    S+   16:54   0:00 vim welcome01.txt
root     22692  0.0  0.0 112812   968 pts/3    S+   16:55   0:00 grep --color=auto vim
[root@cnsz92vl12951 vim_test]# kill -9 22510
# 需要注意,kill掉进程.swp文件依然存在---窗口2
[root@cnsz92vl12951 vim_test]# ll -a
total 28
drwxr-xr-x  2 root  root    85 Aug 22 16:54 .
drwxr-xr-x. 9 rhlog root  4096 Aug 22 15:58 ..
-rw-r--r--  1 root  root    37 Aug 22 16:28 test.py
-rw-r--r--  1 root  root    55 Aug 22 16:54 welcome01.txt
-rw-r--r--  1 root  root 12288 Aug 22 16:55 .welcome01.txt.swp
-rw-r--r--  1 root  root    39 Aug 22 16:10 welcome02.txt
# ---窗口1
test
test
python
pythonKilled
[root@cnsz92vl12951 vim_test]#
# 恢复编辑但未保存的内容
1.vi welcome01.txt
2.选择R
3.输入:help recovery
4.保存最新内容wq!
5.删除掉.filename.swp文件

vim额外功能

可视区块(Visual Block)

常见的vim操作都是以行为单位操作,如果想要以列为操作单位,该如何实现呢,这里就得要用到可视区块了。

# 如下内容,想要将coding复制一份到每行右边
# coding=utf-8
# coding=utf-8
# coding=utf-8
# coding=utf-8

# 操作步骤
1.ctrl + v 进入Visual Block
2.选中第一行的coding,再将光标依次往下一行选中
3.y复制选中内容
4.将光标移到第一行最右边,用编辑模式按两个空格键,再回到一般命令模式,按下p粘贴内容、
# 最终效果
# coding=utf-8 coding
# coding=utf-8 coding 
# coding=utf-8 coding
# coding=utf-8 coding

多文件编辑

vim内使用:r filename 可以读入filename文件的内容到当前文件中。但如果只想要filename的部分内容,同时编辑多个文件就很有用了。
多文件编辑按键

:n 编辑下一个文件
:N 编辑上一个文件
:files 列出目前vim开启的所有文件

多窗口功能

划分窗口对于编辑器是非常常见的功能,vim也提供:sp {filename}的操作来划分窗口查看文件。
说明:如果想要开启窗口查看其他文件则通过{filename}指定,如果仅输入:sp时,则对当前文件进行划分窗口。
多窗口下按键功能

:sp {filename} 打开新窗口,指定{filename}则打开filename文件,否则打开当前文件
[ctrl] + w + j/↓ 按下ctrl不放开,再按w,同时放开所有键,按下j或下箭头,则光标移到下方窗口
[ctrl] + w + k/↑ 同上,光标移到上方的窗口
[ctrl] + w +q 结束/退出当前窗口

vim关键词补全功能

vim关键字补全功能通过组合键实现

[ctrl] + x —>[ctrl] + n 通过正在编辑的[文件内容]作为关键词,予以补齐
[ctrl] + x —>[ctrl] + f 以当前目录内的[文件名]作为关键词,予以补齐
[ctrl] + x —>[ctrl] + o 以扩展名作为语法补充,以vim内置的关键词,予以补齐

注意:常用的有组合1和组合3;组合3以vim内置的关键词和文件名直接相关,比如.html、.php等,vim可进行内置补齐操作。

vim环境设置与记录

常见现象:

  1. vim搜索的文件会出现反白标记,当退出后重新进入文件,依然能看到反白标记
  2. 重复编辑文件,再次进入,光标会停在上一次退出的位置

实现原理:
因为vim会自动将用户的操作记录下来,这个记录操作的文件就是~/.viminfo
vim会主动帮忙做的操作称为vim环境设置,可以通过文件修改/etc/vimrc文件来更新环境设置(不过不建议修改)

vim使用注意事项

中文编码问题

vim里无法正常显示中文等,注意vim终端界面里使用的是UTF-8,由于编码问题容易出现乱码显示,需注意:

  1. Linux默认支持的语法数据,与/etc/locale.conf有关
  2. 终端的语系:与LANG、LC_ALL等变量有关
  3. 文件原本的编码
  4. 打开终端的软件,可在窗口字符编码设置

    DOS与linux的换行符

    语系编码转换

    打开文件如果发现本省的编码不合适,linux支持语系编码转换操作。需要用到iconv命令
  • iconv -f 原本编码 -t 新编码 filename [-o newfile]
    选项与参数
    --list:列出iconv支持的语系数据
    -f:from之意,后接原本的编码格式
    -t:tp之意,后接新编码要什么格式
    -o file:如果要保留原本文件,则使用-o新文件名,可以建立新编码文件