如何理解这个vim脚本?

时间:2012-09-27 15:40:18

标签: editor vim

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

vim的语法有点奇怪:

  1. !exists("*s:SetVals"),为什么他们是s:之前的星标?
  2. 功能!,为什么有一个!字符?
  3. &iskeyword,这是一个变量,如果是,它定义在哪里?
  4. 什么是s:g:,它们之间有什么区别?
  5. 为什么要使用?例如let &dictionary = g:pydiction_location,我可以将其更改为&dictionary = g:pydiction_location吗?
  6.   

    if!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     
    
         

    ENDIF

3 个答案:

答案 0 :(得分:20)

  

1。 !exists("*s:SetVals"),为什么他们之前是星标   S:

星号是存在函数的特殊语法,它意味着我们正在检查是否存在一个名为SetVals的现有函数。可以使用iskeyword检查选项exists("&iskeyword"),使用echo

检查前导exists(":echo")

请参阅:h exists(

  

2。 function!,为什么会有!字符?

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

请参阅:h user-functions

  

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

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

  

4。什么是s:g:,它们之间有什么区别?

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

请参阅:h internal-variabless:,请参阅:h script-variable

  

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

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

答案 1 :(得分:6)

我可以回答一些问题,但我会从你最近提出的问题的一般评论开始。

大多数问题的答案在Vim非常详尽的文档中非常清楚地列出。如果你认真使用Vim,你必须知道如何使用它。从:help开始,仔细阅读。它付出了代价。相信我。

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

  • !exists("*s:SetVals"),为什么他们是s:之前的星标?

    请参阅:help exists()

  • function!,为什么会有!个字符?

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

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

    这就是你在脚本中测试vim选项值的方法。请参阅:help iskeyword

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

    这些是命名空间。请参阅:help internal-variables

  • 为什么要使用let?例如,让&dictionary = g:pydiction_location,我可以将其更改为&dictionary = g:pydiction_location吗?

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

答案 2 :(得分:3)

请参阅:help eval.txt。它描述了大多数vimscript语法。