`
xitong
  • 浏览: 6399812 次
文章分类
社区版块
存档分类
最新评论

[Vim练级攻略] --- 初窥Vim脚本Vimscript

 
阅读更多

前面已经学习了Vim的简单使用,可以在Vim内部输入:help获得帮助,在学习的过程中,尽可能使用高版本的Vim,因为它将包含更多有趣的东西,如果不知道Vim的版本,只需在终端下输入vim--version就可以得到Vim的版本信息

Vim的脚本语言是Vimscript,学习Vimscript,能更好的帮助我们配置Vim,可以根据自己的偏好设置Vim,将Vim打造成适合自己的IDE,让Vim使用起来更加得心应手~



一背景

Vim的脚本语言被称为Vimscript,是典型的动态式命令语言,提供一些常用的语言特征:变量、表达式、控制结构、内置函数、用户自定义函数、一级字符串、列表、字典、终端、文件IO、正则表达式模式匹配、异常和集成调试器等。

在学习Vimscript时,你可以学习Vim自带的Vimscript文档,打开Vim自带的Vimscript很简单,只需在Vim内部执行:helpvim-script-intro(Normal模式下)



二执行Vim脚本

执行Vim脚本的方法很多,最简单的做法就是将命令放到一个文件中(通常使用.vim做为扩展名),然后在Vim内部使用命令:source~/test.vim执行该文件(假设文件名为test.vim,存放目录为当前用户主目录下)

当然你也可以在Vim内部直接在冒号后面输入命令然后执行命令(:setnumber),但是这样可能会重复输入命令,不如使用脚本文件方便,所以很少这样使用。

在Vim内部使用:callMyBackupFunc(expand('%'),{'all':1,'save':'recent'})执行脚本命令,但是很少人这么做,这样输入的东西过多,不好记忆等等,因此,调用Vim脚本的最普通的方法就是创建新的键盘映射,使用如下方法(关于map的使用请在Vim内部查看帮助文档):

:nmap;s:source~/test.vim<CR>
:nmap\b:callMyBackupFunc(expand('%'),{'all':1})<CR>




三初窥Vimscript

在正式学习Vimscript之前,先来看一个简单的例子:

(a)在终端下输入vimfirst.vim新建一个vim脚本文件

(b)在first.vim中输入如下内容

:leti=1

:whilei<5

:echo"countis"i

:leti+=1

:endwhile

(c)输入:w后保存文件,然后输入:source~/first.vim(假设first.vim存放在当前用户的主目录下)执行vim脚本,后看到如下输出:

countis1

countis2

countis3

countis4

注意:Vim命令时冒号:开头的,但是在vim脚本文件中编写脚本时,冒号:是可以省略不写的的。




四变量(Variables)

通过上面的例子,能够学习到如何编写一个简单的Vimscript,并在Vim中执行Vimscript,接下来学习Vimscript中的变量,在Vimscript中使用let命令按如下方式定义变量

let{variable}={expression}

但是在Vimscript中变量根据作用域的不同可以分为很多种类型,现在主要学习常见的几种类型,完整的Vimscript变量类型见下图:

1定义一个全局变量var其可以在任何地方使用

letvar=1

#或者这样写

letg:var=1

2定义一个局部变量var其只能在某个脚本文件中使用

lets:var=1

3定义一个变量var其只能在某个buffer中使用

letb:var=1

4定义一个变量var其只能在某个window中使用

letw:var=1s

注意:(a)Vimscript还有一些伪变量,脚本可以使用它们访问Vim提供的其他类型的值容器,完整的VimScript伪变量类型见下图:

(b)在VimScript中,0为false,非0为true,Vimscript很多时候会自动转换一个字符串为一个数值以确定其为true还是false,比如下面的例子中

if!exists("s:hahaya")

(c)Vimscript中字符串可以使用双引号也可以使用单引号包裹。




五表达式

Vimscript中的表达式和其他语言中的表达式很类似,下面有个例子进行简单说明

a>1?1:0




六语句

1逻辑运算符

Vimscript运算符及优先级关系如下图

2条件控制语句

Vimscript的条件和C语言等其他语言的条件控制语句类似,下面是Vimscript条件控制语句的一般结构,其中elseif和else是可选的。

if{condition}

{statements}

elseif{condition}

{statements}

else

{statements}

endif

3字符串匹配

(a)a=~b字符串匹配

(b)a!~b字符串不匹配

注意:在字符串比较和匹配是,经常会受到大小写选项ignorecase的影响,你可以避免此选项的影响

(a)在操作符后添加#表示不忽略大小写

(b)在操作符后添加?表示忽略大小写

4while循环语句

在前面的Vimscript初窥中已经看到while语句的使用,while语句中和C语言等其他语言一样可以使用continue、break等(continue命令用于跳转到循环的开始,break命令用于结束循环),这里不再详细介绍。



七函数

在Vimscript中,直接调用函数使用call命令,我们可以使用如下方式定义函数:

function{name}({var1},{var2},...)

{body}

endfunction

在Vimscript中,用户自定义函数的函数名第一个字母必须大写,下面展示一个自定义的Min函数

function!s:Min(num1,num2)

ifa:num1<a:num2

letsmaller=a:num1

else

letsmaller=a:num2

endif

returnsmaller

endfunction

注意:(a)function后面加上强制命令修饰符!表示该函数如果存在则替换,这样做是有必要的,假设该Min函数位于某个脚本文件中,如果没有加上强制命令修饰符,脚本文件被载入两次时会报错:函数已存在。

(b)Vimscript中有许多内置函数,大约超过200过,你可以在Vim内部输入:helpfunctions来学习。



八list列表

一个list包含一组有序的元素,和C++不同的是,Vimscript中list的每个元素可以为任意类型。元素通过索引访问,第一个元素的索引为0。list使用两个中括号[]包裹。

1创建list

"创建一个空的list

letlist1=[]

"创建一个list,其中含有两个类型不同的元素

letlist2=['a',2]

2list元素的访问

letlist[0]=1

echolist[0]

3list增加新的元素

"添加新的值到list的尾部

calladd(list,val)

"添加新的值到list的头部

callinsert(list,val)

4list删除元素

"删除索引为index的元素并返回此元素

callremove(list,index)

"删除索引为startIndexendIndex(含endIndex)的元素

"返回一个list包含了这些被删除的元素

callremove(list,startIndex,endIndex)

"清空list,这里索引-1对应list中最后一个元素

callremove(list,0,-1)

5判断list是否为空

ifempty(list)

"...

endif

6获取list的大小

echolen(list)

7拷贝list

"浅拷贝list

letcopyList=copy(list)

"深拷贝list

letdeepCopyList=deepcopy(list)

calldeepcopy()

8使用for遍历list

letlist=['one','two','three']

forelementinlist

echoelement

endfor



九dictionary字典

dictionary是一个关联数组。每个元素都有一个key和一个value,和C++中map类似,我们可以通过key来获取value。dictionary使用两个大括号{}包裹。

1创建dictionary

"创建一个空的dictionary

letdict={}

"创建一个非空的dictionary

letdict={'one':1,'two':2,'three':3}

2dictionary元素的访问和修改

1letdict={'one':1,'two':2}

2"通过key访问

3echodict['one']

4"keyASCII字符串时还可以这样访问

5echodict.one

6"修改元素的value

3dictionary元素的增加和删除

1"增加一个元素

2letdict[key]=value

3"删除一个元素

4unletdict[key]

4获取dictionary的大小

echolen(dict)

5使用for语句遍历一个dictionary

letdict={'one':1,'two':2}

forkeyinkeys(dict)

echokey

endfor

"遍历时key是未排序的,如果希望按照一定顺序访问可以这么做:

forkeyinsort(keys(dict))

"...

endfor

"keys函数用于返回一个list,包含dictionary的所有key

"values函数用于返回一个list,包含dictionary的所有value

"items函数用于返回一个list,包含dictionary的key-value对

forvalueinvalues(dict)

echovalue

endfor


foriteminitems(dict)

echoitem

endfor



Vimscript可以用来重组和扩展Vim编辑器,可以将Vim根据自己的需求来定制。如果想Vim具备某些功能,完全可以自己通过Vimscript扩展Vim,想起来是不是很爽~

分享到:
评论

相关推荐

    VMware-VIM-all-6.7.0-15976714.txt

    VMware-VIM-all-6.7.0-15976714 原版镜像 .................................................................................................................

    VMware-VIM-all-6.5.0-14020092.txt

    vmware vcenter6.5 for windows版本。 VMware-VIM-all-6.5.0-14020092

    简明Vim练级攻略

    "简明Vim练级攻略" Vim 编辑器是一款功能强大且灵活的文本编辑器,具有很高的学习曲线,因此,新手可能会感到困惑和沮丧。但是,通过合理的学习步骤和实践,您可以快速掌握 Vim 的基本功能和高级技巧。 第一级 ...

    vim-common-7.4.629-7.el7.x86_64.rpm

    vim-common-7.4.629-7.el7.x86_64.rpm

    vim键盘图(vi-vim-cheat-sheet)

    vim键盘图 ....vi-vim-cheat-sheet.gif vi-vim-tutorial-1.gif vi-vim-tutorial-2.gif vi-vim-tutorial-3.gif vi-vim-tutorial-4.gif vi-vim-tutorial-5.gif vi-vim-tutorial-6.gif vi-vim-tutorial-7.gif

    vim-powerline-develop

    **vim-powerline-develop** 是一个针对 Vim 编辑器的扩展插件,它属于 Vim 插件中的 **powerline** 家族。Powerline 是一个非常流行的增强型状态栏插件,它为 Vim、Emacs 和其他软件提供了一个美观、信息丰富的状态...

    简明 Vim 练级攻略

    为了帮助新用户顺利入门,本文将分享一份简明的Vim练级攻略,通过四个步骤带你从新手成长为Vim大神。 首先,Vim的基本操作模式分为普通模式(Normal mode)、插入模式(Insert mode)、视觉模式(Visual mode)等。...

    vim-tmux-focus-events, 使终端vim和tmux更好地协同工作.zip

    vim-tmux-focus-events, 使终端vim和tmux更好地协同工作 tmux-focus-events.vimFocusGained 和 FocusLost 自动命令事件在终端vim中不工作。 这个插件在使用vim内部Tmux时恢复它们。以下是相关内容:vim fugitive插件...

    Atom-atom-vim-mode-plus,vim.zip

    Atom-atom-vim-mode-plus是针对Atom文本编辑器的一个扩展插件,主要目的是增强其内置的VIM编辑模式。VIM(Vi Improved)是一种高度可配置的文本编辑器,以其高效的操作方式和丰富的命令集而闻名。在Atom中,VIM模式...

    vim-for-server, .vimrc, 简单配置服务器,不带插件.zip

    vim-for-server, .vimrc, 简单配置服务器,不带插件 vim-for-servervimrc,简单配置服务器,不带插件。简介这个存储库是 k-vim的简化版本。只删除所有插件,保留基本配置。屏幕截图 安装 。 如果有必要,备份旧的. ...

    VMware-VIM-all-6.7.0-9451876.txt

    VMware vSphere 6.7 百度网盘链接及提取 码

    vim-jsx-pretty, [Vim script] 对vim的JSX语法非常突出.zip

    vim-jsx-pretty, [Vim script] 对vim的JSX语法非常突出 vim-jsx-pretty演示语法vim-jsx-pretty( 添加彩色配置) vim-jsx-pretty mxw/vim-jsx 自动缩进( 使用 vim-javascript )

    vim练级攻略.pdf

    ### Vim练级攻略知识点概述 #### 一、引言 Vim是一款强大的文本编辑器,在Linux及类Unix系统中广泛使用。它具有丰富的功能和高度的可定制性,被誉为“人类史上最优秀的文本编辑器”。然而,Vim的学习曲线较高,初学...

    VMware-VIMSetup-all-5.5.0-1312299

    根据提供的文件信息,我们可以推断出这份资料与VMware vCenter Infrastructure Manager (VIM) Setup 5.5.0版本有关。尽管描述部分没有提供太多技术细节,但从标题和其他信息中,我们可以提炼出一系列与VMware ...

    简明Vim练级攻略.pdf

    系统学习使用高效的Vim编辑器。 vim的学习曲线相当的大(参看各种文本编辑器的学习曲线 ...下面的文章翻译自《Learn Vim Progressively (http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/)》

    vim-enhanced-7.4.629-8.el7_9.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    vim-language-server:VImScript语言服务器,用于vim脚本的LSP

    yarn global add vim-language-server 对于npm npm install -g vim-language-server 对于coc.nvim用户,请安装coc扩展名: :CocInstall coc - vimlsp 设定档 用于文档突出显示 let g: markdown_fenced_languages...

    vim-atom-dark, 一个由 Atom 黑暗主题默认启发的vim主题.zip

    vim-atom-dark, 一个由 Atom 黑暗主题默认启发的vim主题 vim-atom-dark一个由 Atom 黑暗主题默认启发的vim主题。 在 .vim 文件夹中克隆这个文件或者将 colors/atom-dark.vim 文件放在 colors/ 中。

    vim8.0.zip --Linux-CentOS7离线安装VIM及相关依赖包

    vim-8.0.zip gpm-libs-1.20.7-6.el7.i686.rpm ncurses-5.9-14.20130511.el7_4.x86_64.rpm ncurses-base-5.9-14.20130511.el7_4.noarch.rpm ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm ncurses-libs-5.9-14....

Global site tag (gtag.js) - Google Analytics