1. 关于 vi/vim
- vi 是纯文字处理器,功能已经很齐全。
- vim 则是一个“程序开发工具”,可主动以字体颜色辨别语法的正确性,方便程序设计。vim 官方网站
2. 常用按键说明
2.1 一般模式:移动光标
按键 | 功能 |
---|---|
h 或← | 左移一个字符 |
j 或↓ | 下移一个字符 |
k 或↑ | 上移一个字符 |
l 或→ | 右移一个字符 |
nj 或 n↓ | 下移n个字符 |
nl 或 n→ | 右移n个字符,不会换行 |
*** | *** |
Ctrl + f | 翻页,向下移动一页 |
Ctrl + b | 翻页,向上移动一页 |
Ctrl + d | 翻页,向下移动半页 |
Ctrl + u | 翻页,向上移动半页 |
*** | *** |
+ | 移动到下一行 |
- | 移动到上一行 |
n[space] | 按下数字键n接着按下空格键,会向后移动n个字符,可能换行 |
0或[Home]键 | 数字0,移动至当前行首字符 |
$或[End]键 | 移动至当前行尾字符 |
H | 大写H,移动至当前屏幕最上方行的首字符,与gg不同 |
M | 大写M,移动至当前屏幕中央一行的首字符 |
L | 大写L,移动至当前屏幕最下方行的首字符,与大G不同 |
G | 大写G,移动至文件最后一行 |
nG | 移动至文件的第n行,相当于命令模式下输入:n回车 |
gg | 移动至文件第1行 |
n[Enter] | 向下移动n行 |
*** | *** |
/word | 向下寻找一个字符串“word” |
?word | 向上寻找一个字符串“word” |
n | 重复前一次查找 |
N | 反向重复前一次查找 |
:n1,n2s/word1/word2/g | 在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2 |
:1,$s/word1/word2/g | 从第一行到最后一行寻找word1,并替换为word2 |
:1,$s/word1/word2/gc | 从第一行到最后一行寻找word1,并替换为word2,但替换前会先要用户确认confirm |
*** | *** |
x,X | x向后删除一个字符,X向前删除一个字符 |
nx | 连续删除后面n个字符 |
dd | 删除光标所在一整行 |
ndd | 删除光标所在向下n行 |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除从光标所在到最后一行的所有数据 |
d$ | 删除从光标所在出到该行的最后一个字符 |
d0 | 删除从光标所在出到该行的第一个字符 |
yy | 复制光标所在的那一行 |
nyy | 复制光标所在向下n行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p,P | p将已复制的数据在光标下一行粘贴,P为粘贴在光标上一行 |
*** | *** |
J | 将光标所在行与下一行的数据结合成同一行 |
u | 复原前一个操作,undo |
ctrl+r | 重做上一个操作,redo |
. | 小数点,重复前一个操作,比如重复删除、重复粘贴等 |
2.2 编辑模式:插入或替换
按键 | 功能 |
---|---|
i, I | i为从目前光标所在处插入,I为在目前所在行的第一个非空格符处开始插入 |
a, A | a为从目前光标所在的下一个自付出开始插入,A为从光标所在行的最后一个字符处开始插入 |
o, O | o为在目前光标所在的下一行处插入新的一行,O为在目前光标所在处的上一行插入新的一行 |
r, R | r只会替换光标所在的哪一个字符一次;R会一直替换光标所在的文字,只到按下[Esc]键为止 |
[Esc] | 退出编辑模式,回到一般模式中 |
2.3 命令模式:保存离开等
按键 | 功能 |
---|---|
:w | 将编辑的数据写入硬盘文件中 |
:w! | 若文件属性为“只读”时,强制写入该文件,但最终要看文件的权限 |
:q | 离开vi(m) |
:q! | 强制离开不保存文件 |
:wq | 保存后离开 |
:w[filename] | 将编辑的数据保存成另一个文件,另存为 |
:r[filename] | 立即读入另一个文件的数据,将“filename”文件的内容加到光标所在行后面 |
:n1,n2 w[filename] | 将n1到n2的内容保存成filename这个文件 |
:! command | 暂时离开vi(m)到命令行模式下执行command的显示结果。例如 :! ls即可查看当前目录下的文件信息 |
:set nu | 显示行号 |
:set nonu | 取消行号显示 |
3. vim 的功能
大部分 distributions 都以 vim 自动替代 vi 的功能了。
3.1 Visual Block(块选择)
字符选择:一般模式,按小写 v
行选择:一般模式,按大写 V
块选择:一般模式,按 Ctrl+v
粘贴 block:移动光标,按小写 p
3.2 多文件编辑
场景:如果想把文件A的部分内容拷贝到文件B中去,用Vim该怎么做?
vim file_A file_B
打开多个文件:files
查看编辑的文件信息- 文件相互跳转
按键 | 说明 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前该 vim 打开的所有文件 |
3.3 多窗口功能
场景:vim 如何切割窗口并放入文件?
按键 | 说明 |
---|---|
:sp [filename] | 打开一个新分割窗口,filename可有可无。如果有则在新分割窗口打开一个新文件,如果无则在新分割窗口打开同一个文件。 |
ctrl-w + j或↓ | 光标移动到下方窗口,指法:按住ctrl不放,按w,松开所有键后再按j |
ctrl-w + k或↑ | 光标移动到上方窗口,指法:按住ctrl不放,按w,松开所有键后再按k |
3.4 vim 环境设置与记录(~/.vimrc, ~/viminfo)
vim 会主动将你的行为记录下来,保存在 ~/.viminfo 文件中。
vim 的环境设置参数
按键 | 说明 |
---|---|
:set nu :set | 设置和取消行号 |
:set hlsearch :set nohlsearch | hlsearch 就是 highlight search,是否查找字符串时反白查找目标 |
:set autoindent :set noautoindent | 是否自动缩排(即按 enter 时光标换行后是否自动缩进) |
:set backup | 是否自动保存文件,默认 nobackup |
:set ruler | vim窗口右下角是否显示状态说明 |
:set showmode | vim窗口左下角是否显示 --INSERT-- 之类的字眼 |
:set all | 显示目前所有的环境参数设置值 |
:syntax on :syntax off | 是否依据程序相关语法显示不同的颜色 |
:set bg=dark :set bg=light | 背景色设置 |
我们可以一次性将习惯的 vim 操作环境设置保存下来,记录在 ~/.vimrc 这个文件中。比如:
3.5 Dos 与 Linux 的断行字符
Dos中使用的断行字符为 ^M$
,称为 CR
与 LF
两个符号;Linux 仅使用 LF
这个断行符。
如何批量转换文件断行符?
# -k:保留该文件原本的 mtime 时间格式(不更新文件上次内容经过修订的时间)
# -n:保留原本的旧文件,将转换后的内容输出到新文件中
dos2UNIX [-kn] file [newfile]
UNIX2dos [-kn] file [newfile]
3.6 语系编码转换
中文编码:big5、utf8、gb2312
# --list:列出 iconv 支持的语系数据
# -f:from,接原本的编码格式
# -t:to,接新的编码格式
# -o:如果要保留源文件,写入新文件,可用 -o 选项
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]