「Shell」Linux Commander
vim
1. 简介
vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iMproved),与 vi 完全兼容,且扩充了很多功能。
vim 编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用 vim 编辑器就必须熟练掌握这两种模式的切换。
默认情况下,打开 vim 后自动进入命令模式。
从编辑模式切换到命令模式使用 ESC 键,从命令模式切换到编辑模式使用 A、a、O、o、I、i 键。
2. 命令格式
1 | vim [OPTIONS] [FILE...] |
字段说明:
[FILE...]
表示一系列使用 vim 编辑的文件,使用:next
命令可以向前切换所编辑的文件,使用--
可以向后切换。这是 vim 常用启动格式;-
:表示待编辑的文件从标准输入读取;-t TAG
:要编辑的文件和光标的初始位置取决于一个标签,一种 goto 标签。标签在标签文件中查找,与标签关联的文件成为当前文件并执行关联的命令。主要用于 C 程序,在这种情况下 TAG 可以是函数名,其结果是包含该函数的文件成为当前文件,并且光标位于函数的开头。参见::help tag-commands
;-q [ERRORFILE]
:使用 quickFix 模式启动 vim,文件 ERRORFILE 将被读取并显示第一个错误。如果 ERRORFILE 省略,则默认为 AztecC.Err(Amiga 系统)或 errors.err(其它系统)。关于 quickFix 模式说明,可以使用:help quickfix
查看。[OPTIONS] 选项说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50+NUM
打开文件时光标跳转到由 NUM 指定的行首
+/PAT
打开文件时光标跳转到匹配的模式字符串 PAT
+, -c CMD
在完成对第一个文件的读取后,执行给出的指令
-b
以二进制模式打开文件,用于编辑二进制文件和可执行文件
-C
以兼容模式运行 vim,使 vim 的表现更像 vi,即使存在 .vimrc 文件
-d
以 diff 模式打开文件,当多个文件编辑时,显示文件差异部分
-e
进入 Ex 模式,即进入冒号开头的末行模式。ex是Unix编辑器
-E
进入增强 Ex 模式,就像执行命令 exim
-l
使用 lisp 模式,打开 lisp 和 showmatch
-m
取消写文件功能,重设 write 选项。你仍然可以修改缓冲内容,但是不可以写入文件
-M
关闭修改功能
-N
非兼容模式运行 vim,这会使 vim 表现的更好,但是可能会存在与 vi 不兼容的情况,即使存在 .vimrc 文件
-n
不使用 swap file,这可能会导致在 vim 意外崩溃的情况下无法恢复未保存的内容
-o [N]
以上下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口
-O [N]
以左右下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口
-R
以只读方式打开文件
-r
列出 swap file
-r FILE
以指定的交换文件来恢复崩溃的编辑会话。交换文件名后缀为.swp
-s
安静模式,与 -e 选项结合使用
-u VIMRC
使用指定的 vimrc 文件中的命令来初始化 vim,所有其它的初始化操作将被跳过。可以给定“NONE”来跳过所有的初始化
-U GVIMRC
使用指定的 gvimrc 文件中的命令来初始化 GUI,所有其它的 GUI 初始化操作将被跳过。可以给定 “NONE” 来跳过所有的 GUI 初始化
-V [N]
以冗余模式执行 vim,打印 vim 读取了哪些配置文件 vimrc。可选的数字 N 表示冗余级别,数值越大级别越高,取值范围是 0~10,默认是 10
-x
写文件时进行加密,会提示输入加密密钥
-h, --help
显示帮助信息并退出
--version
显示版本信息并退出
3. 内置命令说明
1 | Ctrl+u:向下滚动半屏 |
4. vim 需知
4.1 vim 的四大模式
众所周知,vim 里面最具特色的东西就是它可以切换模式,用户可以通过按 ESC 在各个模式之间进行切换。
关于 vim 的模式说明,可以打开 vim 后键入 :help mode
来查看。
正常模式 (normal mode)
不管用户处于何种模式,只要按一下 ESC 键,即可进入正常模式。启动 vim 命令默认情况下进入正常模式。
在正常模式下,用户可以输入各种合法的 vim 内置命令,用于管理自己的文档。需注意的是,所输入的命令并不在屏幕上显示出来。
可视模式(visual mode)
可视模式简单来说就是选中一块编辑区域,然后在上面执行一些操作,比如删除,替换,改变大小写等。
在正常模式按下 v(逐个字符选择文本)、 V(逐行选择文本)、Ctrl+v(按照块的方式选择文本),可以进入可视模式。
可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。
插入模式 (insert mode)
在正常模式下输入插入命令 i(insert)、附加命令 a (append)、打开命令 o(open)、修改命令 c(change)、取代命令 r(replace)或替换命令 s(substitute)都可以进入插入模式。
在该模式下,用户输入的任何字符都被 Vim 当做文件内容保存起来,并将其显示在屏幕上。
命令行模式 (command-line mode)
命令行模式又称为 ex 模式。ex 是 EXtended 的简称,是 Unix 系统上的纯文本编辑器。ex 命令可启动 vim,执行 ex 命令,并键入 visual 就可以进入 vim 的正常模式。
在正常模式下,用户按冒号即可进入命令行模式,此时 vim 会在显示窗口的最后一行显示一个冒号作为命令行模式的提示符,等待用户输入命令。命令执行完后,vim 自动回到正常模式。
4.2 vim 相关编码选项
文件的编码和显示是一个令人头痛的东西,vim编码配置涉及4个选项,分别是encoding 、fileencoding、fileencodings 和 termencoding,四者对应的简写分别为enc、fenc、fencs和tenc。
encoding
encoding 是vim内部使用编码。vim运行时,其菜单、标签、以及各个缓冲区统一使用encoding作为字符编码。fileencoding
fileencoding 为文件采用的编码方式。使用vim打开文件后,可以使用末行命令:set fenc=utf-8
将文件编码方式更改为UTF-8,注意,前提是vim打开文件时已经正确识别出文件编码,即未出现乱码。fileencodings
fileencodings 用于vim在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。~/.vimrc里面 fileencodings 的设置一般为1
set fileencodings=utf-8,gb18030,latin1
termencoding
终端所使用的文本编码。这个选项的值用于告诉VIM终端使用了哪种文本编码用于文本输入和显示。如果该值为空,那么它被设置为encoding的值。
4.3 vim 读写文件时编码转换过程
(1)读文件
vim打开文件时,需要将磁盘文件内容载入缓存,并将缓存中的字符转为换终端编码,通过网络传输的方式,传输到终端进行显示。两个转换环节,有一个出错都会出现乱码。
1 | fileencoding -> encoding -> termencoding |
(2)写文件
通过终端编辑文件时,字符编码转换过程是vim读文件的逆过程。
1 | termencoding -> encoding -> fileencoding |
注意:使用vim读写文件时为避免出现乱码,至关重要的一点就是终端,比如SecureCRT或XShell的编码设置要与vim的termencoding设置相同,如果不同还是还是会出现乱码,尽管vim已经采用正确的编码格式解析了文件。比如将XShell设置为UTF-8。
5.vim 常见用法
(1)vim 查看文件编码
1 | :set fileencoding |
即可显示文件编码格式。
这个命令有致命的缺点,原因是只有正常显示文件内容时,该命令显示的文件编码格式才是文件本身的编码格式。因为该命令显示的编码格式并不是文件本身的编码格式,而是当前打开该文件所使用的编码格式。因此,这个命令在网上的说明大都是不准确的,特此说明。
(2)修改编码类型
使用vim修改:
1
2
3:set fileencoding=gbk
或者
:set fenc=gbk使用iconv来修改文件编码:
1
2
3
4iconv -f encoding -t encoding inputfile
比如将一个GBK编码的文件转换成UTF-8编码
iconv -f GBK -t UTF-8 file1 -o file2UTF-8iconv的参数说明:
1
2
3
4
5
6
7-f, --from-code=名称,原始文本编码
-t, --to-code=名称,输出编码
-l, --list 列举所有已知的字符集
-c 从输出中忽略无效的字符
-o, --output=FILE,输出文件
-s, --silent,关闭警告
--verbose,打印进度信息
(3)vim 指定编码类型浏览文件
如果知道了文件的编码类型,可显示指定编码类型来解析文件,而不用vim去猜测文件的编码类型,事实上猜测的往往是错误。
命令如下:
1 | vim file_name -c "e ++enc=utf-8" |
或者在使用 vim 打开文件之后,在末行模式使用如下命令:
1 | :e ++enc=utf-8 |
(4)vim 新增空白行
新增一行空白,在命令行模式下输入 o。如果想添加三行的话,键入 3o ,如果想添加 n 行则键入 n 个 o。如果键入 3o 后立即退出插入模式的话,就可以添加三个空白行。如果输入一些内容再退出,可以添加三行相同的内容。
如果想在每一行执行相同的命令,在 vim 里可以用 :g 实现。一般的语法是:
1 | :g/pattern/cmd |
它表示在匹配 /pattern/ 这个正则表达式的行上执行 cmd 命令(也称冒号命令)。而 /^/ 这个表达式,用于匹配行首。因为任何一行都有行首,你的要求就很容易实现了:
1 | :g/^/norm 3o |
norm这个命令的意思是,把后面的参数看成是在普通模式下的按键,即命令模式下的按键。
(5)vim 高亮显示选中的单词
将光标移到需要高亮显示的单词上,在命令模式下输入gd,那么就可以将当前的单词在当前文本中全部高亮显示,如下图所示,高亮显示dwBeInvitedUinLen。
(6)vim 输入特殊字符
有三种方法,第一种是使用字符编码,第二种是使用二合字母(digraph),三是使用快捷键(Ctrl+字母)。
使用字符编码:
vim可以用字符编码插入任意字符,使用此功能可以方便地输入键盘上找不到的字符。使用步骤如下:
(1)编辑模式下按下Ctrl+v;
(2)如果是ASCII字符,则输入三位十进制ASCII码值,不足三位,前补0。比如输入大写字母A,则输入065;如果是Unicode字符,则输入“u+四位十六进制码值”。比如输入大写字母A,则输入u0041。更多详情内容可参见vim的帮助文档,末行模式输入:
h i_ctrl-v_digit
。使用二合字母(digraph):
二合字母顾名思义,使用两个字母的组合来标识特殊字符。使用步骤如下:
(1)编辑模式下按下Ctrl+k;
(2)输入特殊字符对应的二合字母。可以使用:dig
或:h digraph-table
查看对应二合字母。比如回车符(Carriage Return) 的二合字母是CR。Ctrl+字母:
在vim中,使用:set list
显示所有字符时,经常会看到有^I、^M
等符号,代表的字符可以使用:h digraph-table
查看,特殊字符列表如下:在vim的编辑模式下,可使用“Ctrl+字母”进行输入,例如使用”Ctrl+i”或”Ctrl+I”可以输入字符
^I
(Tab),使用”Ctrl+m”或”Ctrl+M”可以输入字符^M
(回车)。
(7)vim其它常见操作
1 | 显示行号 |
rename
1. 简介
功能类似于 mv
,可实现文件或者目录的重命名,但 mv
不能批量处理,而 rename
可以。
2. 命令格式
1 | rename [OPTIONS] EXPRESSION REPLACEMENT FILE... |
字段说明:
- EXPRESSION:原字符串,即文件名需要替换的字符串;
- REPLACEMENT:目标字符串,将文件名中含有的元字符替换成目标字符串;
- FILE…:指定要改变文件名的文件列表
rename
支持的通配符:1
2
3? 可替代单个字符
* 可替代多个字符
[charset] 可替代charset集中的任意单个字符选项说明:
1
2
3
4
5
6
7
8
9
10
11
12-s, --symlink
不要重命名符号链接,而是重命名它的目标
-v, --verbose
以冗余模式运行,显示哪些文件已被重命名
-o, --no-overwrite
不要覆盖现有文件
-i, --interactive
更名前询问是否确定
-h, --help
显示帮助信息并退出
-V, --version
显示版本信息
3. 示例
(1)重命名文件 lvlv 为 lala。
1 | rename v a lv?? |
(2)将当前目录下的所有文件的后缀名由 .html 改为 .php。
1 | rename .html .php * |
tee
1. 简介
tee 命令从标准输入读取数据后,将数据重定向到给定的文件和标准输出。给定的文件可以有多个。
因为 tee 意为字母 T,数据从左边(标准输入)流入,从右边(标准输出)和下面(文件)分流输出,字母 T 的形状很形象地说明了数据的流向,故将该命令命名为 tee。
2. 命令格式
1 | tee [OPTION]... [FILE]... |
- 选项说明
1 | -a, --append |
3. 示例
(1)标准错误输出和标准输出同时输出到屏幕和指定文件 file1 与 file2。
1 | make 2>&1 | tee file1 file2 |
- 2>&1 表示将标准错误输出重定向到标准输出;
- tee 表示将命令结果同时输出到屏幕和文件。