终端编辑器 Vim
作者: dkvirus 发表于: 2018-04-17 09:06:41 最近更新: 2018-07-13 14:05:53

在接触Linux之前不知道黑窗口中还能编辑文本,回想刚学习 Linux 那会,给 Vim 搞得死去活来,其实用多了还是一样。本文为 Vim 学习笔记。

一、几种模式

有很多人和我一样刚开始使用 Vim 充满怨言,just 为了编辑一下文本,又是整了几种模式,又是整出来 那么多 命令要去记,就是一 垃圾。但是回过头来想一想,Vim 是终端中的编辑器,如果让你来设计,会比它好多少?如果你能在图形化界面中操作文本,大可不必使用 Vim。

1.1 模式

  • 一般模式(也叫普通模式):编辑文本但不是编辑内容,比如删除一行,复制粘贴,查找等编辑操作;
  • 编辑模式:真正编写文本内容就在这个模式下做的;
  • 命令模式:有一些稀奇古怪的操作可以在命令模式下操作;

1.2 初体验

说的再多不如上手一练。

第一步:编辑文件

1
# vim test.txt

在黑窗口中进入 vim 编辑器,此时默认进入的是普通模式。

按照咱在 window 中的习惯,打开一个文件应该能直接修改文件内容,这里不行,想要修改文件内容,需要切换到编辑模式。

第二步:切换编辑模式编辑文本内容

键入 i,此时左下角出现 -- INSERT --,进入编辑模式,现在可以添加内容了:Hello Vim

第三步:保存文件

编辑完内容还要保存文件,需要切换到命令模式下才行。

编辑模式和命令模式不能直接切换,需要先从编辑模式切换到普通模式,按 Esc 键;再从普通模式切换到命令模式,按 : 键。

在命令模式输入 wq 即可保存并退出。w 为保存,q 为退出,单独输入 q 为退出但不保存。

1.3 模式切换

关于 Vim 模式切换,见下图。

vi模式切换

二、文档编辑

2.1 跳转

在编辑文档中经常需要迅速跳转到指定位置,不会下面这些技巧,一个字符一个字符的移动让人想发疯。

普通模式下。跳转无非也是针对两个东东:单词

序号 操作 含义
1 j 下一行,20j 往下移动 20 行
2 k 上一行,10k 往上移动 10 行
3 h 往左边移动一个字符,5h 往左边移动 5 个字符
4 l 往右边移动一个字符,5l 往右边移动 5 个字符
5 Ctrl + F (front)往下翻一页
6 Ctrl + B (behind)往上翻一页
7 Ctrl + D (down)往下翻半页
8 Ctrl + U (up)往上翻半页
9 w (word)跳到下一个单词开头
10 e (end)跳到下一个单词结尾
11 b 跳到上一个单词开头
12 shift + hH (hight)光标快速跳到当前屏幕第一行
13 shift + mM (middle)光标快速跳到当前屏幕中间一行
14 shift + lL (lower)光标快速跳转到当前屏幕最末一行
15 gg1G 光标快速跳转到第一行
16 shift + gG 光标快速跳转到最后一行
17 num + shift + g 光标快速跳转指定行,如 10 + shift + g 跳转到第十行
18 ctrl + o 跳转到光标上一次所在位置
19 0 阿拉伯数字零,跳到行首
20 $ 跳到行末
21 num + space 光标从当前字符往后跳转 num 个字符
22 num + enter 光标从当前行往下跳转 num 行

2.2 删除

普通模式下。删除无非要干掉三个东东:字符单词

操作 含义
x 向后删除一个字符
shift + xX 向前删除一个字符
num + x 10x 向后删除 10 个字符
dd 删除光标所在行
num + dd 3dd 从光标所在行往下删除 3 行
dw 删除一个单词(delete word)
d2w 删除两个单词(注意不是 2dw)
d1G 删除第一行到当前行之间数据,当前行也会被删掉,1G 相当于 gg,跳转到第一行
dG 删除当前行到最后一行之间数据,当前行也会被删掉,G 相当于 shift + g,跳转到最后一行
d$ 删除当前光标到该行最后一个字符的数据,$ 表示行末
d0 删除当前行第一个光标到当前光标位置的数据,0 表示行首

2.3 复制粘贴

操作 含义
yw 复制一个单词
y3w 复制三个单词
yy 复制一行
5yy 复制五行
y0 复制到行首
y$ 复制到行末
yG 复制第一行到当前行之间的数据
y1G 复制当前行到最后一行的数据
p (paste)往光标所在行下一行粘贴
shift + pP 往光标所在行上一行粘贴
dd 剪切一行,再使用 p 粘贴,可以交换上下两行位置

三、查找替换

3.1 撤销

操作 含义
u 普通模式下输入 u 为撤销操作
u + num 撤销几次操作,u3 撤销三次操作
shift + u 只撤销当前行操作,不撤销全部
ctrl + r 有时发现撤销有误,想要撤销 撤销

3.2 替换

替换一定程度等于删除。

操作 含义
r 替换光标所在字符
shift + r 连续替换,适用于替换一个单词,按 Esc 退出到普通模式
cw 替换一个单词
shift + c 替换至行末
cc 整行替换
:n1,n2s/word1/word2/g :100,200s/dkvirus/dk/g,在100-200行之间寻找 dkvirus 字符并替换为 dk 字符
:1,$s/word1/word2/g :1,$s/dkvirus/dk/g,从第1行到最后一行寻找 dkvirus 字符并替换为 dk 字符
:1,$s/word1/word2/gc :1,$s/dkvirus/dk/gc,从第1行到最后一行寻找 dkvrius 字符并替换为 dk 字符,替换前让用户确认

3.3 缩进

普通模式。

操作 含义
shift + >> 将光标所在行往右缩进,相当于 tab
shift + << 将光标所在行往左缩进,相当于 shift + tab

命令模式。通过 shiftwidth 可以设置缩进的字符数。

:set shiftwidth=4

3.4 对齐方式

命令模式。

操作 含义
:ce 居中
:ri 居右
:le 居左

3.5 查看

普通模式。

操作 含义
/<要查找的字符> 从上往下查找字符
?<要查找的字符> 从下往上查找字符
n 往下查找下一个字符
shift + nN 往上查找字符

四、其它功能

1. 选中操作

操作 含义
v 选中字符
shift + vV 选中行
Ctrl + v 选中区块,垂直选中的意思

结合 h、j、k、l 使用有惊喜。

2. 多文件编辑

使用 vim 同时打开多个文件。

1
$ vim host1 host2
操作 含义
:files 查看 vim 打开的文件
:n 跳转到下一个文件
:N 跳转到上一个文件

3. 多窗口

一个文件很大,想要查看前面部分和后面部分进行对比,如何做??
想要直接打开两个窗口比对信息差异,如何做??

使用 vim 打开一个文件,:sp 进行窗口分隔,Ctrl + w 进行窗口切换。

4. vim 环境设置

使用 vim 打开一个文件,:set nu 可以显示行号,但是在下一次再打开文件时行号又会消失,想要持久化设置,怎么办??

在当前用户目录下创建 vim 配置文件 .vimrc,写入一下内容,再次打开文件可以看到默认有行号了。

1
2
3
4
5
6
7
8
set hlsearch       "高亮度反白
set backspace=2 "可随时用退格键删除
set autoindent "自动缩排
set ruler "可现实最后一列的状态
set showmode "做下角那一列的状态
set nu "可以在每一行最前面显示行号
set bg=dark "显示不同的底色色调
syntax on "进行语法检验,颜色显示

vim 所有环境查看方法:使用 vim 打开文件,命令模式下 :set all 打印所有环境变量。

5. 其它

  • 显示行数。命令模式下 :set nu
  • 取消显示行数。命令模式下 :set nonu
  • 重复上一次操作 .
  • 重复操作几次 num<command>
  • 将光标所在字符大小写切换 ~
  • 文档加密 # vim -x file1,需要输入两次设置密码,再次打开时需要输入密码才能看到内容;
  • 另存为 :w test.txt 将当前文件另存为 test.txt 文件,之前的旧文件还在;

五、常见报错

5.1 错误一:编辑时异常中断

问题

当在 Linux 下用 vi 打开 Test.java 文件时,并没有如往常直接打开文件,而是看到了下面内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
E325: ATTENTION  
Found a swap file by the name ".Test.java.swp"

owned by: root dated: Wed Dec 7 13:52:56 2011
file name: /var/tmp/Test.java
modified: YES
user name: root host name: localhost
process ID: 26153 (still running)
While opening file "Test.java"
dated: Wed Dec 7 14:00:46 2011
NEWER than swap file!

(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.
If this is the case, use ":recover" or "vim -r Test.java"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".Test.java.swp"
to avoid this message.
"Test.java" 11L, 237C
Press ENTER or type command to continue

原因

在之前的一次使用 vi 操作 Test.java 文件时出现了异常中断,所以在当前目录下产生了一个 .Test.java.swp 文件。

解决

使用 ll -a 查看当前目录下全部文件,包括隐藏文件(.开头的文件为隐藏文件),删除该文件在打开就没有上述的警告了。

rm -f .Test.java.swp,其中 -f 表示强制删除。

首页
友链
归档
dkvirus
动态
RSS