Editor 如何理解这个vim脚本?
以下是来自vim插件的vim脚本: vim的语法有点奇怪:Editor 如何理解这个vim脚本?,editor,vim,Editor,Vim,以下是来自vim插件的vim脚本: vim的语法有点奇怪: !存在(“*s:SetVals”),为什么它们在s:之前是星号 功能!,为什么会有一个字符 &iskeyword,这是一个变量吗?如果是,它是在哪里定义的 什么是s:和g:,它们之间有什么区别 为什么要使用let?例如let&dictionary=g:pydiction\u location,我可以将其更改为&dictionary=g:pydiction\u location 如果!存在(“*s:SetVals”) 恩迪夫 请参见:he
!存在(“*s:SetVals”)
,为什么它们在s:
之前是星号代码>字符
&iskeyword
,这是一个变量吗?如果是,它是在哪里定义的s:
和g:
,它们之间有什么区别let&dictionary=g:pydiction\u location
,我可以将其更改为&dictionary=g:pydiction\u location
请参见
:help eval.txt
。它描述了大部分vimscript语法 我可以回答其中几个问题,但我将从你最近提出的问题引发的一般性评论开始
Vim极其详尽的文档非常清楚地列出了您大多数问题的答案。如果你对使用Vim很认真,你必须知道如何使用它。从开始:帮助
并仔细阅读。这是值得的。相信我
您可以在:help expression
中找到所有这些子问题的答案
,为什么它们在!存在(“*s:SetVals”)
之前是星号 请参阅s:
:帮助存在()
函数代码>,为什么有一个
代码>字符 如果没有感叹号,Vim将不会替换之前的定义(如果您是脚本的源代码)
,这是一个变量吗?如果是,它是在哪里定义的 这就是在脚本中测试vim选项值的方法。请参见&iskeyword
:help iskeyword
- 什么是
和s:
,它们之间有什么区别 这些是名称空间。请参阅g:
:帮助内部变量
- 为什么要使用
?例如letlet
,我可以将其更改为&dictionary=g:pydiction\u location
不,您不能,&dictionary=g:pydiction\u location
定义或更新变量。习惯它:让
!存在(“*s:SetVals”)
,为什么它们以前是星号
s:
星号是exists函数的特殊语法,它意味着我们正在检查是否存在名为SetVals的现有函数。选项iskeyword
可以通过exists(“&iskeyword”)
检查,ex命令echo
可以通过exists(:echo)检查
请参见:h存在(
2.函数!
,为什么会有!字符
感叹号表示如果函数已经存在,则要替换该函数
请参见:h用户功能
3.&iskeyword
,这是一个变量吗?如果是,它是在哪里定义的
这是一个vim选项。您可以检查它是否设置了:set iskeyword?
4.什么是s:
和g:
,它们之间有什么区别
这些定义了以下符号的范围。s:
表示符号是脚本的本地符号,而g:
表示符号是全局符号
请参阅:h内部变量
,有关s:
的信息,请参阅:h脚本变量
5.为什么应该使用let
?例如let&dictionary=
g:pydiction_位置,我能把它改成&dictionary吗=
g:pydiction_位置
Vimscript是需要用关键字声明变量的语言之一。我认为没有比用let
@AshwiniChaudhary更容易声明变量的方法了,因为python是由该脚本调用的:)它可以是Ruby、Perl或Lua,与您的问题无关。(已编辑掉python
标记)@romainl你是说vim脚本可以调用使用不同编程语言实现的函数?@jedwards我想知道vim脚本是如何调用python的……你怎么知道这个文件包含了vim脚本的大部分规范,有没有任何构建工具可以让我搜索所有vim的构建文档?@HugeMow请参见:h:helpgrep
,:helpgrep
是用于搜索所有文档文件的命令。4.:“定义范围”为true,“符号只能在当前脚本中使用”错误:存在s:
-范围字典-您可以将其传递到其他地方以授予对脚本局部变量的访问权限。5:不要求使用关键字声明变量(例如:call extend(g:,{'var':'val'})
创建g:var变量,不使用let
),只有一种类型的语句:看起来像[range][command][!][argument[s]][comment]
(所有元素都是可选的,有些命令需要缺少range、bang、arguments或不支持将它们作为参数一部分的注释,没有命令的范围是“转到范围中的最后一行”),没有“assignment”语句OP正在请求,因为它不符合此语法。
function! s:SetVals()
" Save and change any config values we need.
" Temporarily change isk to treat periods and opening
" parenthesis as part of a keyword -- so we can complete
" python modules and functions:
let s:pydiction_save_isk = &iskeyword
setlocal iskeyword +=.,(
" Save any current dictionaries the user has set:
let s:pydiction_save_dictions = &dictionary
" Temporarily use only pydiction's dictionary:
let &dictionary = g:pydiction_location
" Save the ins-completion options the user has set:
let s:pydiction_save_cot = &completeopt
" Have the completion menu show up for one or more matches:
let &completeopt = "menu,menuone"
" Set the popup menu height:
let s:pydiction_save_pumheight = &pumheight
if !exists('g:pydiction_menu_height')
let g:pydiction_menu_height = 15
endif
let &pumheight = g:pydiction_menu_height
return ''
endfunction