vim学习笔记

vim,大部分Unix-like系统的内置文本编辑器,是vi编辑器的升级版;比win的记事本强大的多;

学习笔记:

使用vi打开文件:

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
 表示以yy结尾,\_后面跟任何字符表示额外再匹配换行符
 <>表示匹配的是一个单词
 可以使用\zs和\ze对开头和结尾进行剪裁,匹配结果以\zs开始以\ze结束中间的部分
  例如:表示匹配以xx开头yy结尾的单词时去掉\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:]]    除空格外所有可以打印字符

 折叠标签:(退出vi失效)

 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 寄存器名填充,如果寄存器里有特殊字符可使用\=@寄存器名填充)

 global命令:

格式::[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
 命令行模式也可上下遍历历史命令

grep命令:

是对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是把文件读到内存缓冲区中操作)

 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用于追加命令)

 vim script:

 \=后面可以使用脚本语句
 在普通模式下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-脚本代码规范

ps:

 基本所有操作都在.viminfo里有记录
 使用:h 关键词 可以查看帮助手册
 vim配置文件vimrc可进行设置默认值,配置文件里用的也是vimscript

 ctrl+z 后台运行
 jobs或者jobs -l 显示后台运行程序
 fg x 将编号x的后台程序转到前台,不指定x则最后ctrl+z的程序转到前台
 

你可能感兴趣的:(其他,vim)