学习vim首先了解它的几种模式,然后学会使用help。有了这些后就记住一些常用的命令。
1. 复制粘贴 (不考虑ctrl+c 和ctrl +v的情况下)
y为复制(yank)
p为粘贴(paste)在光标的后面
P为粘贴在光标的前面
d为剪切
x为删除
复制剪切前需要选择复制内容,所以y 命令是与当前光标位置相关的。
yw 表示拷贝从当前光标到光标所在单词结尾的内容
y0 表示拷贝从当前光标到光标所在行首的内容
y$ 表示拷贝从当前光标到光标所在行尾的内容
yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容。a是可以替换的,它可以是b,c,d,e,f,g等26个英文字母中的任意一个。
yy 表示拷贝光标所在行
dd 表示删除光标所在行
2. 光标的移动
单格移动:
前(h)后(l)上(k)下(j)
行间移动:
gg 为文本开始
G为文本结尾
home键 为该行的行首
end键 为该行的行尾
^为行首的第一个非空白字符
$为该行的行尾
3$表示移动下面的第三行的行尾 (999999$表示可以到文本的末尾 类似于G$)
词间移动
w为移至下一个单词
b为移至上一个单词
3. 查找
单行内单字符查找
fa 表示在当前行中查找下一个字母a并移动光标
Fa 表示在当前行中查找上一个字母a并移动光标
文本中查找字符
/contenttobesearch
找到结果之间可以同过n或N来切换移动光标
4 显示相关的命令
:set hlsearch 表示高亮显示查询结果
:set nohlsearch 表示不用高亮显示查询结果
:set number表示显示行数
:set nonumber表示不用显示行数
CTRL + G 表示显示当前光标所在位置的信息。
CTRL + U 表示向上滚动文档半页
CTRL + D表示向下滚动文档半页34G
5. 删除(x)修改(c)撤销undo ( u) 重做 redo (CTRL + R)replace单字符(r)
c表示剪切后并修改(进入编辑模式)
r命令表示替换当前字符,并不进入编辑模式。
6 .连接行命令
J表示连接当前行与下一行
3J表示连接当前行与下三行
7. 字符语境相关的命令
~ 表示修改一个字符的大小写。大写的话就变成小写,小写的话就变成大写。其行为仅限于当前行操作,改变当前光标的字符的大小写后并移动光标至下一个字符,直至行尾。不需要enter键。
gu:切换为小写,gU:切换为大写。 需要enter键
8. 其他命令
. 命令表示重复上一个删除或修改命令
search history: / 与上下键配合可以浏览查询历史。
9. 正则表达式替换
:[range]s/from/to/[flags]
range:搜索范围,如果没有指定范围,则仅作用于当前行。
:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
:10s/from/to/ 表示只在第10行搜索替换;
:%s/from/to/ 表示在所有行中搜索替换;
1,$s/from/to/ 同上。
flags 有如下四个选项:
c confirm,每次替换前询问;
e error, 不显示错误;
g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
i ignore,忽略大小写。
这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。
正则表达式
元字符 说明
. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]
一些普通字符需转意
元字符 说明
\* 匹配* 字符
. 匹配. 字符
\/ 匹配 / 字符
\ 匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符
表示数量的元字符
元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
表示位置的元字符
元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾
替换变量
在正则式中以\(和\)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容。
例子
删除行尾空格::%s/\s+$//g
删除行首多余空格:%s/^\s*// 或者 %s/^ *//
删除沒有內容的空行:%s/^$// 或者 g/^$/d
删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
sed:指定文件进行替换
sed -i "s/from/to/g" 文件名