Editor 如何理解这个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

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

vim的语法有点奇怪:

  • !存在(“*s:SetVals”)
    ,为什么它们在
    s:
    之前是星号
  • 功能!,为什么会有一个
    字符
  • &iskeyword
    ,这是一个变量吗?如果是,它是在哪里定义的
  • 什么是
    s:
    g:
    ,它们之间有什么区别
  • 为什么要使用let?例如
    let&dictionary=g:pydiction\u location
    ,我可以将其更改为
    &dictionary=g:pydiction\u location
  • 如果!存在(“*s:SetVals”)

    恩迪夫


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

    我可以回答其中几个问题,但我将从你最近提出的问题引发的一般性评论开始

    Vim极其详尽的文档非常清楚地列出了您大多数问题的答案。如果你对使用Vim很认真,你必须知道如何使用它。从
    开始:帮助
    并仔细阅读。这是值得的。相信我

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

    • !存在(“*s:SetVals”)
      ,为什么它们在
      s:
      之前是星号

      请参阅
      :帮助存在()

    • 函数,为什么有一个
      字符

      如果没有感叹号,Vim将不会替换之前的定义(如果您是脚本的源代码)

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

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

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

      这些是名称空间。请参阅
      :帮助内部变量

    • 为什么要使用
      let
      ?例如let
      &dictionary=g:pydiction\u location
      ,我可以将其更改为
      &dictionary=g:pydiction\u location

      不,您不能,
      :让
      定义或更新变量。习惯它

    1.
    !存在(“*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