vim,大部分Unix-like系统的内置文本编辑器,是vi编辑器的升级版;比win的记事本强大的多;
学习笔记:
vi xxx 打开文件
vi +n xxx 打开文件并将光标置于指定第n行
vi + xxx 打开文件并将光标放到最后行
vi +/pattern xxx 打开文件并将光标放到第一个匹配处
vi -r xxx 恢复崩溃文件
i a 在光标前 后插入
I A 在行首 行末插入
o O 在光标下一行 上一行插入
s 删除光标处字符插入
S 删除光标行插入
cw 删除光标到单词结尾并进入插入模式
cb 删除光标到单词开头并进入插入模式
cc 删除光标行进入插入模式(保留缩进)
gi 从上次编辑位置进入插入模式
ctrl+h 向前删除一个字符(退格键)
ctrl+w 向前删除一个单词
ctrl+u 向前删除到行首
ctrl+o 暂时回到普通模式支持执行一条普通模式命令后自动返回插入模式
ctrl+v ascii码 按照十进制输入ascii码字符(后面回车或者空格即可)
ctrl+v u编码 按照十六进制输入unicode字符(也可以直接输入回车退格等不可见字符)
:h digraph-table 查看编码字符对照表
单个字符移动:
hjkl 左下上右
空格键也可右移,也可以使用上下左右键移动
n+hjkl 移动n个字符
单词字串移动:
w b 下个 上个单词的开头(除空白字符外一串字母数字、一串中文、一串标点符号都被认作一个单词)
e ge 下个 上个单词的结尾
nw/b 移动n个单词
W B 下个 上个字串的开头(字串仅按照空白字符分割)
E gE 下个 上个字串的结尾
行内移动:
0 $ 行首 行尾
^ 行首第一个非空字符处
fx Fx 向右 向左移动到第一个x字符处
tx Tx 向右 向左移动到第一个x字符前
nfx
fx/tx可以使用;和,继续查找或者反向继续重复操作
n| 移动到当前行第n列
折行间移动:(设置warp后)
gj 下一行
gk 上一行
g0 行首
g$ 行尾
gg 跳转到第一行第一个非空字符处(下同)
G 跳转到最后行第一个非空字符处
nG ngg 跳转到指定第n行
n% 跳转到百分比行
H M L 跳转到当前屏幕第一行 中间行 最后行
nH 跳转到当前屏幕第n行
nL 跳转到当前屏幕倒数第n行
'' 跳转到跳转之前的行(两个英文单引号)
'. 跳转到最后修改行首('跳转到行首,`跳转到行中间指定位置)
`. 跳转到最后修改处
`^ 跳转到上次进入插入模式的位置
`[ 跳转到上次修改或者复制的开始位置
`] 跳转到上次修改或者复制的结束位置
`< 跳转到上次选区的开始位置
`> 跳转到上次选区的结束位置
ctrl+g 查看当前光标位置
m{a-zA-Z} 可设置字母标记,使用'+字母跳转到字母标记的行首,`+字母跳转到字母标记处(A-Z可在全局多文件跳转)
例如:mx 可在当前光标处设置标记x,在任意位置使用'x可跳转到标记x处的行首,`x跳转到标记x处
:jumps 查看历史跳转列表(之前vi打开的记录也在)
ctrl+i 跳转到列表下一个跳转位置
ctrl+o 跳转到列表上一个跳转位置
% 光标在一对英文()[]{}上跳跃
( ) 向前 向后移动到句子开头(.!?后面跟换行空格或者制表符,之间可以加入多个右括号)]或英文引号'",段落小节边界也算作句子边界)
{ } 向前 向后移动到段落开头(空行分割,小节边界也算作段落边界)
[[ ]] 向前 向后移动到小节开头
ctrl+f ctrl+b 向下 向上全页翻页
ctrl+d ctrl+u 向下 向上半页翻页
zt zz zb 将光标行置于屏幕顶部 中间 底部
ctrl+e ctlr+y 向下 向上滚动一行文档(光标在屏幕范围内不动,前面可使用数字)
删除:(相当于剪切操作可用于粘贴)
x X 删除光标处字符 删除光标左边字符
nx 删除n个字符
d 删除(可视模式可以直接删除)
D 删除光标到行末
dw 删除一个单词(光标向后)
daw 删除整个单词(光标所在的单词)
diw 删除整个单词(保留空白字符主要是tab键)
dnw 删除n个单词
d0 d$ 删除光标到行首 行末
dl dh 相当于x X
dj 删除光标行和下一行
d2k 删除光标行和上两行
dd 删除光标行(保留缩进)
ndd 删除从光标行开始的n行
dgg 删除光标行到文档首行
dG 删除光标行到文档末行
J 合并当前行与下一行(删除一个行分隔符)
nJ 合并n行
y 复制(可视模式可以直接复制)
yw 复制光标往后一个单词
ynw 复制n个单词
y0 y$ 复制光标到行首 行末
yy 复制当前行
nyy 复制当前行开始的n行
p 粘贴到光标下一行或者光标后边
P 粘贴到光标上一行或者光标前边
np 粘贴n遍
xp 交换光标和下个字符(剪切粘贴组合)
ddp 交换光标行和下一行
i/a+区间范围 搭配d/c等进行区间操作,i表示区间内内容,a表示包括区间
例如:diw da[ ci{ ci" yis yap
可用区间:
w 单词
s 句子
p 段落
t tag标签(HTML、XML)
[或] 由[]包裹的内容
(或) 由()包裹的内容
<或> 由<>包裹的内容
{或} 由{}包裹的内容
" 由""包裹的内容
' 由''包裹的内容
` 由``包裹的内容
~ 切换光标处字符的大小写
guu 光标行转小写
gu3j 光标行及下三行转小写
gUU 光标行转大写
gU2k 光标行及上两行转大写
gU2h 光标前两个字符转大写
gU2l 光标和后一个字符转大写
g~~ 光标行大小写切换
g~j 光标行及下一行大小写切换
>> << 光标行向右 向左缩进
>2j 光标行及下两行向右缩进
(在可视模式下选中也可以缩进)
ctrl+a 向右找到第一个数字递增1
ctrl+x 向右找到第一个数字递减1
:changes 缓冲区改动列表
g; g, 访问上一个 下一个改动
u 撤回修改
ctrl+r 重做修改
. 重复上次命令操作(进入离开插入模式以及编辑操作算一次,单次操作命令d/c等算一次)
ctrl+s 暂停屏显(只是屏幕暂停,各种命令操作都会执行)
ctrl+q 恢复屏显
ZZ 保存并退出
ZQ 不保存强制退出
可视模式可以使用移动光标命令,使用y复制p粘贴d删除等
v 进入退出字符可视模式
V 进入退出行可视模式
ctrl+v 进入退出块可视模式
三种模式间可以随意切换
可视模式中按o可以在选择起点终点切换光标用于修改选区
ctrl+g 可视模式中进入选择模式,输入字符将删除选区并进入插入模式
I A 在块选区每行行首 行尾插入
(可视模式可以用来生成执行命令的[range]区间)
R 进入替换模式,光标处向后替换,Esc退出
r 只替换光标处字符
gr gR 虚拟替换,tab将被替换为字符+空格形式,原文长度不变
/xxxx 向下查找(后面可加/e使搜索后的光标在目标结尾处,默认光标在目标开始处)
?xxxx 向上查找
n N 继续查找下一个 反向查找下一个
* # 向下 向上查找当前光标处单词(会在前后加<>)
g* 向下查找当前光标处单词(不会在前后加<>)
q/ 查看查找历史列表(选中后可以直接回车查找,也可以存到寄存器供其他地方使用,ctrl+c退回查找模式)
输入/或者?后可以用上下键使用历史查找
查找可以使用:set hls设置高亮,使用:set ignorecase忽略大小写
也可以:set smartcase,只有在搜索的字符中有大写时才大小写敏感,否则就是大小写不敏感
可以在输入的任何位置输入\c或者\C指定本次搜索忽略或者不忽略大小写
通常输入后按回车搜索,可以设置incsearch打开即时搜索
查找使用的是POXIS正则表达式,(){}需要使用\转义,[]不需转义,\/也需要使用\转义
可以使用very magic模式避免使用转义(除了_、数字、字母外都算特殊字符),只需在搜索开头使用\v
可以使用very nomagic模式,所有字母都表示自身,没有特殊含义,只需在搜索开头使用\V
<>表示匹配的是一个单词
可以使用\zs和\ze对开头和结尾进行剪裁,匹配结果以\zs开始以\ze结束中间的部分
例如:
/H\zsEL\zeLO只会将匹配的HELLO中的EL作为匹配结果
匹配模式中也可以使用ctrl+r 寄存器名将寄存器内容粘贴过来
一些特殊的字符:
. 匹配处换行符外的字符
\n 换行符
\x 十六进制数 \X 非十六进制数(大写表示非,下同)
\d 数字
\o 八进制数
\w 字母、数字和_
\h 字母和_
\l 小写字母
\u 大写字母
\s 空白字符
可以使用()代表子匹配项,后面可以使用\+数字指代子匹配项,\0指代整个正则表达式匹配项,1、2、3...对应第1、2、3...个子匹配项
|可用于分支,相当于或
指定匹配数量:
? 0-1个
+ 至少1个
* 0个或多个
{n} n个
{n,} 至少n个
{,m} 最多m个
{n,m} n到m个
POXIS风格的正则表达式的字符类
[[:alnum:]] 文本数字字符
[[:alpha:]] 字母字符
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:digit:]] 小数
[[:xdigit:]] 十六进制数字
[[:punct:]] 标点符号
[[:blank:]] 制表符和空格
[[:space:]] 空白字符
[[:cntrl:]] 控制字符
[[:print:]] 所有可以打印的字符
[[:graph:]] 除空格外所有可以打印字符
zf+光标移动或跳转操作可设置折叠标签
zfnG 将光标到第n行折叠
zfgg 将光标到第一行折叠
zfG 将光标到最后行折叠
zf2j 将光标行以及下两行进行折叠
za 切换打开和关闭当前折叠
zr zm 逐层打开关闭折叠
zR zM 打开关闭全部折叠
zj 跳转到下一个折叠(当前层级)
zk 跳转到上一个折叠
zd 删除光标下的折叠标签
zD 删除光标下的及其嵌套的折叠标签
zE 删除所有折叠标签
普通模式按:进入命令行模式(可以使用上下键选择历史命令)
格式::{startpoint},{endpoint} cmd
(默认光标行,只输入一个数表示数字指定行)
(特殊行号:.当前行 $末行 0第一行上方 'm包含标记m的行 <高亮选区起始行 >选区结束行 %整个文件)
(可以使用可视选区,输入:将自动生成范围区间,然后执行命令)
(起止行号可以使用+-进行偏移)
q: 查看命令历史列表,可选择和修改历史命令按回车再次执行命令(ctrl+c退出列表到命令行模式)
:w 保存(w==write)
:w xxx 另存为xxx文件
:w >> xxx 将当前文本追加到xxx文件末尾
:q 退出(q==quit)
:w! 强制保存(!表示强制,需要有权限)
:q! 放弃修改并退出(等同于ZQ)
:wq 保存并退出(等同于ZZ)
:wq! 强制保存并退出
:e! 放弃修改(e==edit)
:r xxx 将xxx文件插入当前行下(r==read)
:nr xxx 将xxx文件插入指定第n行下
:his 查看历史命令操作(his==history)
:his c 查看历史命令行操作
:his s 查看历史搜索操作
:%!xxd 按16进制查看当前文件
:%!xxd -r 从16进制查看返回正常格式
:! shellcmd 暂时跳出vi并执行cmd显示结果
:r! shellcmd 将cmd结果插入光标行下(可以在r前指定插入行号)
:[range] w ! shellcmd 将指定范围内容作为cmd参数执行
:files 打开的文件列表
:[range] d [x] 将指定范围删除并存到x寄存器里(d==delete)
:[range] y [x] 复制指定范围到寄存器x(y==yank)
:[line] pu [x] 在指定行后粘贴x寄存器内容(pu==put)
:[range] t {line} 将指定范围内容拷贝到line行下(t==co==copy)
:[range] m {line} 将指定范围内容移动到line行下(m==move)
:[range] j 连接指定范围的行(j==join)
:[range] norm {cmd} 指定范围每一行执行普通模式命令或者宏(norm==normal)
:n1,n2 t n3 将n1到n2行复制到n3行下面
:n1,n2 m n3 将n1到n2行移动到n3行下面
:n1,n2 d 删除n1到n2行
:n1,n2 w xxx 将n1到n2行另存到文件
:n1,n2 w! cmd 将n1到n2行作为cmd的输入并执行
:.,+2 x xxx 当前行到下两行执行操作(共3行)
:-3,. x xxx 当前行到上三行执行操作
:.,-2 x xxx 当前行到上两行执行操作(会提示逆向范围)
语法::[range]s/pattern/string/[c,e,g,i] (s==substitute)
(c每次替换前询问 e不显示错误信息 g替换全部 i不区分大小写)
:s/old/new 将当前行第一个old替换成new
:s/old/new/g 将当前行全部old替换成new(g表示全部替换)
:n s/old/new 指定第n行进行替换
:n1,n2 s/old/new/g 指定n1到n2行进行替换
:%s/old/new/g 全文替换
:1,$s/old/new/g 全文替换
:%s/old/new/gc 全文挨个替换(需要确认)
普通模式使用g&可以重新在全文执行上次替换操作
:n1,n2 && 指定范围再次执行上次的替换操作(第一个&表示上次替换命令,第二个&表示标志位)
可以使用可视模式选区然后输入:&&执行上次替换操作
(pattern留空会使用上次的匹配模式)
(需要替换的字符串使用~表示上次替换用的字符串)
(匹配模式也可以使用子匹配,可以在替换字符串里使用\1\2\3...)
(可以使用ctrl+r 寄存器名填充,如果寄存器里有特殊字符可使用\=@寄存器名填充)
格式::[range] g[lobal][!]/{pattern}/[cmd]
默认范围全文即%,!表示取反(g!可以写成v),cmd对匹配的每行执行ex命令默认print
可以先用/?搜索,再用:g//cmd操作
(默认:g/re/p 即grep命令)
复杂格式::[range] g[lobal][!]/{start pattern}/{offset},/{end pattern}/{offset} [cmd]
第一个offset对应开始parttern相对位置,可用+数-数偏移行,例如将前10行匹配aaa的下一行保存到已经存在的a.txt文件里可以用:1,10 g/aaa/ +1w >> a.txt,例如将匹配aaa和bbb之间的内容保存到已经存在的a.txt里可以用:g/aaa/+1,/bbb/-1 .w>>a.txt
可使用@:执行上次ex命令,之后可用@@重复执行
输入命令时可用tab匹配之前的历史,依次从上到下循环,shfit+tab反向,也可用ctrl+n和ctrl+p
命令行模式也可上下遍历历史命令
是对linux系统grep命令的封装
例如:
:grep "xxxxx" *.txt
这会将结果保存在quickfix列表里
每次执行grep都会产生新的quickfix列表(会存在多个quickfix列表)
:copen 打开quickfix列表(相当于多窗口,可以在列表里选择回车跳转)
:cclose 关闭quickfix列表
:cnext 跳转到下一项
:cprev 跳转到上一项
:cfirst 跳转到第一项
:clast 跳转到最后项
:cc n 跳转到第n项
:cnfile 跳转到下一个文件第一项(一个grep可以多个文件,都在一个列表里)
:cpfile 跳转到上一个文件第一项
:colder 查看上一个列表
:cnewer 查看下一个列表
vi xxx1 xxx2 可以直接编辑多个文件
:e xxx 继续打开xxx文件到缓冲区(e==edit)
:buffers 查看缓冲区文件列表(也可用:ls)
:buffer 编号 跳转到指定编号文件
:buffer 文件名 跳转到指定文件
:bnext bprev 向后 向前遍历缓冲区中文件
:bfirst blast 跳到第一个 最后个文件
:wnext 保存当前文件并跳转到下一个文件
:bdelete 编号/文件名 删除指定缓冲区
:n1,n2 bdelete 删除编号区间的缓冲区
ctrl+^ 切换到上一个缓冲区
:tabedit xxx 在tab页打开xxx(:tabnew xxx也可)
:tab split 将当前文件在新的tab页打开
:tabn tabp 切换下一个 上一个tab页(可用快捷键gt gT)
:tabn 2 切换到第二个tab页
:tabclose 关闭当前tab页
:tabclose 2 关闭第二个tab页
:tabonly 关闭其他tab页
:tabmove n 将当前tab页移动到第n个tab页位置(0是第一个)
:0tabm 将当前页移动到第一个位置
:tabm 将当前页移动到最后一个位置(同:$tabm)
:split :sp 将当前文档在新窗口打开(默认水平窗口)
:split xxx 将指定文档在新窗口打开
:vsplit xxx 将指定文档在新垂直窗口打开
ctrl+w hjkl 将光标移动到对应方向的窗口
ctrl+w HJKL 将窗口移动到最左 下 上 右
ctrl+w w W 将光标移动下一个 上一个窗口
ctrl+w -+_ 将窗口高度减少 增加 最大(可在- + _前使用数字)
ctrl+w < > 将窗口宽度减少 增加(可在< >前使用数字)
ctrl+w = 将所有窗口均分
ctrl+w q 退出当前窗口(:q也可)
:resize n 将当前窗口设置为n行(同一行的窗口也会变,不写行数则最大行)
:qall 退出所有窗口(qall==quitall)(关闭vi)
:qall! 强制退出所有窗口
:wall 保存所有窗口
:wqall 保存并退出所有窗口
:E 当前窗口打开当前文件目录结构(e==Explore)
:E xxx 打开指定目录结构(相对绝对路径都可)
:Hexplore 水平方向分割窗口打开目录结构(下边)
:Hexplore! (上边)
:Vexplore 垂直方向分割窗口打开目录结构(左边)
:Vexplore! (右边)
:Texplore 通过tab页打开目录结构
:Rexplore 返回目录结构
:Sexplore 水平方向分割窗口打开目录结构(上边)
F1打开帮助文档
目录结构上回车打开文件
o在水平窗口打开光标处文件
t使用tab页打开文件
-返回上层目录
%创建文件
d创建目录
D删除目录或者文件
R重命名或者移动文件和目录
s排序(可以按照name、size、time排序,可以按r反序)
i切换显示
mb当前目录创建一个书签
gb返回书签目录
u返回上一个浏览历史目录
U返回下一个浏览历史目录
:set 查看与系统值设置不同的项
:set all 查看所有设置
:set nu 设置行号(nu==number)
:set nonu 不显示行号(否定前面用no)
:set hls 设置搜索高亮(hls==hlsearch)
:set nohls 取消搜索高亮
:set [no]list [隐藏]显示不可见字符
:set [no]incsearch 设置开启[关闭]即时搜索
:set [no]ignorecase 设置忽略[不忽略]大小写(通常用于搜索)
:set [no]wrap 设置[取消]自动换行
:set bg=dark/light 告诉vi背景色的明暗,将使字体更明显
:colorscheme default 设置颜色主题(可用预设主题/usr/share/vim/vim74/colors文件夹下)
:set [no]ai 设置[关闭]自动缩进(ai==autoindent)
:syntax on/off 开启/关闭语法高亮
:set shiftwidth=4 将tab缩进设置为4(默认8)
:set aw 设置自动保存(aw==autowrite)(:n和:!前自动保存)
:set awa 设置自动保存(awa==autowriteall)(增加了:edit :quit :exit关闭窗口等保存)
删除d/c/s复制y粘贴p等命令会在删除前将删除内容放到无名寄存器里,或者将无名寄存器里的内容粘贴出来
:reg 查看所有寄存器
:reg n 查看名字为n的寄存器内容
可使用a-z命名寄存器存取内容,在命令前使用 "寄存器名 可引用寄存器,例如:"xdd将内容删除并存入x寄存器
在可输入的地方大多可以使用寄存器:ctrl+r 寄存器名(例如在插入模式中使用ctrl+r0将寄存器0的内容粘贴到光标处)
寄存器类型:
无名寄存器使用的名字是"(默认的dd/p相当于""dd/""p命令等)
数字寄存器使用0-9(缓存最近的操作)
复制寄存器使用的名字是0(y复制命令会在"和0寄存器存储内容)
黑洞寄存器使用_,可以直接丢弃内容不存入寄存器
表达式寄存器使用=(可在插入模式中使用ctrl+r =2+2插入4)
只读寄存器有4个 : . % # (分别表示缓存最近命令 最近插入文本 当前文件名 当前交替文件名)
行内删除寄存器-(缓存行内最近删除内容)
模式寄存器/(缓存上次搜索的内容)
q 开始和结束录制按键
qa 开始录制宏到寄存器a,结束的时候再按一次q即完成一次宏录制(可以在寄存器中看到宏,可以使用a-z录制)
(也就是说完全可以直接向寄存器存入操作步骤然后运行宏)
@寄存器名 回放宏(前面可以加数字指定回放次数,遇到错误会终止)
@@ 快速回放上次的宏(前面可以加数字指定回放次数,遇到错误会终止)
可以使用:[range] normal @a 在每一行并行执行宏,忽略一行中的执行错误(range可以使用可视模式选)
给宏追加命令使用q+大写字母的宏名字,大写小写对应同一个寄存器(A-Z用于追加命令)
\=后面可以使用脚本语句
在普通模式下gQ可进入vimscript交互式环境,Ex模式输入visual退回普通模式
变量:
let 声明变量初始化或者赋值
unlet 删除一个变量
unlet! 删除一个变量,变量不存在不报错
还可以明确指定变量作用域,在变量前添加前缀和冒号指定:
g:var 全局
a:var 函数参数
l:var 函数局部变量
b:var buffer局部变量
w:var window局部变量
t:var tab局部变量
s:var 当前脚本内可见的局部变量
v:var Vim预定义的内部变量
$name可以读写环境变量,&option可以读写vim内部设置的值
数据类型:
Number:32位有符号整数
Float:浮点数(编译vim时使用+float支持)
String:NULL结尾的8位无符号字符串
Funcref:函数引用,变量名必须大写字母开头
List:有序列表
Dict:无需字典
字符串比较:
== 相等
!= 不相等
=~ 匹配pattern
!~ 不匹配pattern
比较符号后面用#表示匹配大小写
比较符号后面用?表示不匹配大小写
(set ignorecase会影响==和!=的默认比较)
字符串拼接:
"aaa"."bbb" 使用.拼接字符串
判断语句:
if xxxxx
xxx
elseif xxxxx
xxx
else
xxx
endif
循环语句:(可使用continue和break)
while循环:
while xxxxx
xxx
endwhile
for循环:
for v in list
xxx
endfor
异常:
try
xxx
catch xxx
xxx
finally
xxx
endtry
函数:
function定义函数,后面加!可强制覆盖定义,名字前也可指定作用域范围,函数名需要大写字母开头
可以使用delfunction xxx删除函数,在非表达式里需要用call xxx调用函数
可以在call前使用区间指定执行函数的行,可在每一行都调用一次函数
function Myfun(arg1,arg2)
return xxx
endfunction
也可以使用...定义可变长参数的函数,函数里使用a:0表示可变参数数量,a:1表示第一个可变参数,a:2第二个,以此类推
function Myfun(arg1,...)
xxx
endfunction
可以在函数参数的)后面添加range关键字,可在函数内使用a:firstline和a:lastline获取执行函数使用的区间
function Myfun() range
echo a:firstline
endfunction
可以在函数参数的)后面添加dict关键字,可将外部字典模拟成类,在函数内使用self代指字典
let Cls={"name":"tom", "age":13}
function Cls.getName() dict
echo "getName() run"
return self.name
endfunction
构造类实例使用deepcopy()深度拷贝
let obj = deepcopy(Cls)
call obj.getName()
let objname = obj.getName()
let obj.name="Jerry"
echo obj.getName()
可参考网站:
vim脚本编写:https://vimcdoc.sourceforge.net/doc/usr_41.html
vim脚本规范:https://spacevim.org/cn/conventions/#vim-脚本代码规范
基本所有操作都在.viminfo里有记录
使用:h 关键词 可以查看帮助手册
vim配置文件vimrc可进行设置默认值,配置文件里用的也是vimscript
ctrl+z 后台运行
jobs或者jobs -l 显示后台运行程序
fg x 将编号x的后台程序转到前台,不指定x则最后ctrl+z的程序转到前台