9

以下是来自 vim 插件的 vim 脚本:

vim 的语法有点奇怪:

  1. !exists("*s:SetVals"),为什么他们之前是一个starmark s:
  2. 函数!,为什么有一个!字符?
  3. &iskeyword,这是一个变量,如果是,它是在哪里定义的?
  4. s:和是什么g:,它们之间有什么区别?
  5. 为什么应该使用 let ?比如let &dictionary = g:pydiction_location,我可以把它改成这样&dictionary = g:pydiction_location吗?

如果 !exists("*s:SetVals")

  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     

万一

4

3 回答 3

22

1. !exists("*s:SetVals")为什么他们在 s: 之前是一个星标?

星号是exists函数的特殊语法,它表示我们正在检查是否存在一个名为SetVals的函数。该选项iskeyword可以检查和exists("&iskeyword")ex 命令echoexists(":echo")

:h exists(

2. function!为什么会有!特点?

感叹号表示如果该函数已存在,则将其替换。

:h user-functions

3. &iskeyword,这是一个变量,如果是,它是在哪里定义的?

那是一个 vim 选项。您可以检查它是否设置为:set iskeyword?

4.什么是s:g:,它们有什么区别?

这些定义了以下符号的范围。s:表示该符号是脚本的本地符号,而g:表示该符号将是全局的。

见见见:h internal-variables_s::h script-variable

5.为什么let要使用?比如let &dictionary = g:pydiction_location, can i change it to be &dictionary = g:pydiction_location

Vimscript 是需要用关键字声明变量的语言之一。我认为没有比 with 更容易声明变量的方法了let

于 2012-09-27T16:02:28.997 回答
6

我可以回答其中的一些问题,但我将从受您最近的问题启发的一般性评论开始。

在 Vim 极其详尽的文档中,您的大部分问题的答案都非常清楚。如果你认真使用 Vim,你必须知道如何使用它。开始:help并仔细阅读。它支付。相信我。

您可以在 中找到所有这些子问题的答案:help expression

  • !exists("*s:SetVals"),为什么他们之前是一个starmark s:

    :help exists()

  • function!,为什么会有!人物?

    没有感叹号,如果您重新获取脚本,Vim 将不会替换之前的定义。

  • &iskeyword,这是一个变量,如果是,它是在哪里定义的?

    这就是您在脚本中测试 vim 选项值的方式。见:help iskeyword

  • s:和是什么g:,它们之间有什么区别?

    这些是命名空间。看:help internal-variables

  • 为什么let要使用?比如 let &dictionary = g:pydiction_location,我可以把它改成 be&dictionary = g:pydiction_location吗?

    不,您不能,:let这是您定义或更新变量的方式。习惯它。

于 2012-09-27T16:01:45.347 回答
3

:help eval.txt。它描述了大部分 vimscript 语法。

于 2012-09-27T15:55:12.017 回答