首页 > 其他分享 >VimScript五分钟入门-中文翻译

VimScript五分钟入门-中文翻译

时间:2023-08-02 20:13:52浏览次数:44  
标签:... 中文翻译 函数 echo TrueFalse 五分钟 let VimScript 变量

这篇文章主要是为了让你能够尽可能快地学习到vimscript的基础。你可以把这当做一个速查表。

在读这篇文章之前,你应该可能已经有了一些编程经验。Vim的内建文档已经很出色了。你可以在vim里尝试:h <searchterm>来阅读更多信息。你可以通过在normal模式下键入gQ命令启动REPL环境来调试vimscript。

注意:下面的例子中可能会包含像<token>一样的符号。这意味着它们可以被完全替代,包括<>。 Vimscript使用<>作为比较运算符。

变量

let 用来设置一个变量。

unlet 用来取消设置一个变量。

unlet! 取消设置一个变量,并且忽略在变量不存在时的错误显示。

默认情况下,在函数外初始化定义的变量是全局可见的,而在函数内定义的变量是函数局部可见的,你可能通过在变量名前加一个特定的前缀来限定变量的范围:

g:var - 全局范围。
a:var - 函数参数。
l:var - 函数局部变量。
b:var - buffer局部变量。
w:var - window局部变量。
t:var - tab局部变量。
v:var - VIM预定义的变量。

你可以以$variable的形式引用变量来设置和获取环境变量,同时你可以以$option的形式引用变量来处理vim内置选项。

数据类型

Number:32 位有符号数。

-123
0x10
0177

Float:浮点型数。需要在 vim 编译中添加 +float 选项。

123.456
1.15e-6
-1.1e3

String:以 NUL 结尾的由 8 位无符号字符组成的字符串。

"ab\txx"--"
'x-z''a,c'

Funcref:函数的引用,用做函数引用对象的变量必须以大写字母开头。

:let Myfunc = function("strlen")
:echo Myfunc('foobar') "Call strlen on 'foobar'
6

List:有序列表

:let mylist = [1, 2, ['a', 'b']]
:echo mylist[0]
1
:echo mylist[2][0]
a
:echo mylist[-2]
2
:echo mylist[999]
E684: list index out of range: 999
:echo get(mylist, 999, "THERE IS NO 1000th ELEMENT")
THERE IS NO 1000th ELEMENT

Dictionary: 一个相关联的无序数组。每个条目都有一个关键字和一个值。

:let mydict = {'blue': "#0000ff", 'foo': {999: "baz"}}
:echo mydict["blue"]
#0000ff
:echo mydict.foo
{999: "baz"}
:echo mydict.foo.999
baz
:let mydict.blue = "BLUE"
:echo mydict.blue
BLUE

没有布尔类型. 整数 0 被当做来处理, 其它都当做.

字符串在检查真假性前先被转化成数字。大多数字符串会转化成 0,除非字符串以一个数字开头。

Vimscript是动态且弱类型的。

:echo 1 . "foo"
1foo
:echo 1 + "1"
2

:function! TrueFalse(arg)
:    return a:arg? "true" : "false"
:endfunction

:echo TrueFalse("foobar")
false
:echo TrueFalse("1000")
true
:echo TrueFalse("x1000")
false
:echo TrueFalse("1000x")
true
:echo TrueFalse("0")
false

字符串条件和运算符

<string> == <string>:字符串相等。

<string> != <string>:字符串不相等。

<string> =~ <pattern>:字符串匹配模式。

<string> !~ <pattern>:字符串不匹配模式。

<operator>#:额外的匹配情况。

<operator>?:额外的不匹配情况。

注意: Vim 选项 ignorecase设置大小写敏感度会影响==!=运算符的比较结果。在运算符后面添加?#可以根据大小写进行匹配。

<string> . <string> :连接两个字符串。

:function! TrueFalse(arg)
:    return a:arg? "true" : "false"
:endfunction

:echo TrueFalse("X start" =~ 'X$')
false
:echo TrueFalse("end X" =~ 'X$')
true
:echo TrueFalse("end x" =~# 'X$')
false

If, For, While, 和 Try/Catch

if <expression>
    ...
elseif \expression>
    ...
else
    ...
endif

for <var> in <list>
    continue
    break
endfor

for [var1, var2] in [[1, 2], [3, 4]]
    "on 1st loop, var1 = 1 and var2 = 2
    "on 2nd loop, var1 = 3 and var2 = 4
endfor

while <expression>
endwhile

try
    ...
catch <pattern (optional)>
    "HIGHLY recommended to catch specific error.
finally
    ...
endtry

函数

使用function关键字来定义函数。如果你想覆盖一个函数,则使用function!来代替。就像变量一样,函数也可以定义在特定范围内。

注意:函数名必须以大写字母开头。

function! <Name>(arg1, arg2, etc)
    <function body>
endfunction

delfunction <function> 删除一个函数。

call <function> 执行一个函数,并且除非是表达式的一部分,否则是需要使用call的。

例子:强制创建一个全局函数(使用!)。用...当做最后一个参数,来表示可变参数列表。使用a:1来从...中获取第一个参数值,使用a:2获取第二个参数值,等等。a:0 特指...中拥有的参数数量。

function! g:Foobar(arg1, arg2, ...)
    let first_argument = a:arg1
    let index = 1
    let variable_arg_1 = a:{index} " same as a:1
    return variable_arg_1
endfunction

有一种特定的方式来调用函数,就是可以在 buffer 中按照行的范围来调用。这种调用函数的方式就像 1,3call Foobar()。这个函数会在范围内的每一行都被执行一次。这个事例中,Foobar函数总共被调用了三次。

如果你在函数列表后面添加关键字range,那么函数只会被调用一次。两个特定的变量在函数范围内是有效的:a:firstlinea:lastline。这些变量代表函数范围的开始和结束行号。

例子:强制创建一个 buffer 函数用来打印函数被调用范围的大小。

function! b:RangeSize() range
    echo a:lastline - a:firstline
endfunction

类类型

Vim 并没有内置类类型,但你可以利用Dictionary对象来获得基本的类功能。需要定义一个类的方法时,在函数中使用dict关键字来将内部字典公开为self

let MyClass = {foo: "Foo"}
function MyClass.printFoo() dict
    echo self.foo
endfunction

类默认为单例模式的。为了在 vimscript 中创建类的实例,需要在字典上调用copy()

:let myinstance = copy(MyClass)
:call myinstance.printFoo()
Foo
:let myinstance.foo = "Bar"
:call myinstance.printFoo()
Bar

接下来做什么

现在你已经入门了,这里有一些好的资源可以学习到更多:

教程:
Vim's internal documentation -- (中文版 Vim中文帮助手册)
IBM's "Scripting the Vim Editor"

其他人的代码:
Github: tpope
Github: scrooloose

感谢

希望本文对你有用,感谢阅读。

译注-vim资源

vim中文速查手册

learn vimscript the hard way -- (中文版 笨方法学习vimscript)


参考
翻译工具:

原文链接:http://andrewscala.com/vimscript/

标签:...,中文翻译,函数,echo,TrueFalse,五分钟,let,VimScript,变量
From: https://www.cnblogs.com/ttworks/p/17601632.html

相关文章

  • 五分钟教你使用GitHub寻找优质项目
    https://www.cnblogs.com/Can-daydayup/p/17581307.html 思维导航前言首先解决访问慢的问题GitHub热门栏目GitHub上直接搜项目GitHub搜索小技巧前言经常会有同学会问如何使用GitHub找到自己想要的项目,今天咱们就出一期快速入门教程五分钟教你使用GitHub寻找优质项......
  • 五分钟教你使用GitHub寻找优质项目
    前言经常会有同学会问如何使用GitHub找到自己想要的项目,今天咱们就出一期快速入门教程五分钟教你使用GitHub寻找优质项目。GitHub作为世界上最大的项目开源平台之一,上面有着无数优质的开源项目。善于使用它能够让你获得很多意想不到的惊喜。首先解决访问慢的问题FastGithub是Gi......
  • Google开源库Textfsm使用文档(中文翻译)
    TextFSM介绍TextFSM是一个Python模块,实现了一个基于状态机的模板,用来解析半格式化的文本。最初开发的目的是允许程序化地获取来源于CLI驱动设备的输出信息,例如网络路由器或交换机,不过它可以被用作任何这种类型的文本输出。这个引擎需要两个输入:一个模板文件和文本输入(比......
  • 五分钟了解制造业核心系统的双向集成
    大家好,我是Edison。上一篇,我们了解制造行业核心的5大系统MES、ERP、WMS、PLM和SCADA是如何连接从而实现数据共享的。本篇,我们来了解一下制造行业工业软件的集成,一是纵向的集成,二是横向的集成。信息系统集成图片来源:后厂造上图粗略描述了制造行业工业软件信息系统在横向和纵向......
  • 【转】五分钟读懂“联邦学习”
    一、“联邦学习”是什么?有什么用?大家可能知道,我们目前常用的人工智能应用(例如人脸识别、语音识别、图像识别、智能推荐等)已经相当成熟,它们通常都依赖于大量的训练样本。也就是说,已知一个X(“样本”),要判别它是否具备Y(“特征”),我们需要大量已知的X、Y来反复训练我们的模型(这个过程叫......
  • 五分钟了解Redis入门安装
    一、Redis是什么二、下载简单一点直接打开GitHub,下载.mis 三、安装 一直下一步,到这里更换你想要的路径,然后勾上自动添加环境变量,就不用手动添加  安装好的目录文件 四、启动点击redis-cli.exe 这个就是默认默认的端口号 五、配置文件cmd打开配置账号密六......
  • prophet中文翻译(四)
    趋势变化点你可能已经在文档的前面示例中注意到,实时时间序列经常会在其轨迹中出现突然的变化。默认情况下,Prophet将自动检测这些变化点,并使趋势适应相应的变化。然而,如果你希望对这个过程有更精细的控制(例如,Prophet错过了一个速率变化,或者在历史数据中过度拟合了速率变化),那么你可......
  • 一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队
    作者:京东物流覃玉杰1.pie简介责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本......
  • GPL协议原文及中文翻译
    GPL协议原文及中文翻译原文参考链接翻译参考链接原文GNUGENERALPUBLICLICENSEVersion2,June1991Copyright(C)1989,1991FreeSoftwareFoundation,Inc.59TemplePlace-Suite330,Boston,MA02111-1307,USAEveryoneispermittedtocopyanddistrib......
  • BSD协议原文及中文翻译
    BSD协议原文及翻译参考链接原文:ThefollowingisaBSDlicensetemplate.Togenerateyourownlicense,changethevaluesofOWNER,ORGANIZATIONandYEARfromtheiroriginalvaluesasgivenhere,andsubstituteyourown.Note:Theadvertisingclauseintheli......