高级vim自动完成

高级vim自动完成,vim,autocomplete,flex-lexer,Vim,Autocomplete,Flex Lexer,我正在尝试使用flex构建一个词法分析器。 下面一行显示了正则表达式及其相应的操作 [0-9] {printf("yada yada \n");} //regex1 有没有一种方法可以通过vim的自动完成功能重用regex1中的{printf(“yada-yada\n”);},这样我就不需要在编写regex2时再次编写整个代码了 e、 g 这超出了单词完成的范围,所以我想知道这在vim中是否可行 TIA好吧,这可能不是自动完成,但它可能会为您带来好处。您可以将该action/print语句保存

我正在尝试使用flex构建一个词法分析器。 下面一行显示了正则表达式及其相应的操作

[0-9] {printf("yada yada \n");} //regex1
有没有一种方法可以通过vim的自动完成功能重用regex1中的
{printf(“yada-yada\n”);}
,这样我就不需要在编写regex2时再次编写整个代码了

e、 g

这超出了单词完成的范围,所以我想知道这在vim中是否可行


TIA

好吧,这可能不是自动完成,但它可能会为您带来好处。您可以将该action/print语句保存到vim中的复制寄存器中,并在适当的时候粘贴它

  • 导航到操作的开头
  • 转到视觉模式:v
  • 移动到要复制/拖动的文本部分
  • 要猛拉入寄存器“1”,请键入:“1y
  • 现在该操作存储在寄存器1中

  • 通过执行以下操作粘贴内容:“1p(p可以是任何粘贴命令)

  • 希望这被证明是有用的:)

    好吧,这可能不是自动完成,但它可能会为您带来好处。您可以将该action/print语句保存到vim中的复制寄存器中,并在适当的时候粘贴它

  • 导航到操作的开头
  • 转到视觉模式:v
  • 移动到要复制/拖动的文本部分
  • 要猛拉入寄存器“1”,请键入:“1y
  • 现在该操作存储在寄存器1中

  • 通过执行以下操作粘贴内容:“1p(p可以是任何粘贴命令)

  • 希望这证明是有用的:)

    这不是完全自动完成,但你可以定义一个缩写-例如

    :iab yada {printf("yada yada \n");} 
    
    然后在插入模式下,如果键入

    [0-9] yada<SPACE>
    
    [0-9]雅达
    
    它会立即将
    yada
    替换为
    {printf(“yada-yada\n”);}


    请参见
    :h缩写
    ,了解完整的独家新闻。

    这不是完全自动完成,但您可以定义缩写-例如

    :iab yada {printf("yada yada \n");} 
    
    然后在插入模式下,如果键入

    [0-9] yada<SPACE>
    
    [0-9]雅达
    
    它会立即将
    yada
    替换为
    {printf(“yada-yada\n”);}


    有关完整的独家新闻,请参见
    :h缩写词。

    仅与myme的答案略有不同:

  • 导航到第一个大括号
    {
  • 使用
    v
  • %
    导航到块的末尾,直到最后一个大括号
    }
  • y
    anak它
  • p
    aste它,无论在哪里。:-)
    与myme的答案略有不同:

  • 导航到第一个大括号
    {
  • 使用
    v
  • %
    导航到块的末尾,直到最后一个大括号
    }
  • y
    anak它
  • p
    aste它,无论在哪里。:-)
    有关详细信息,请查看
    :h complete functions
    :h'completefunc'

    或者深入了解以下代码:

    " Scan current buffer for everithing in { }.
    fun! GetRegexes()
      let rx = '{.\+}'
      let res = []
      for line in getline(1, '$')
        if line =~ rx
          call add(res, matchstr(line, rx))
        endif
      endfor
      return res
    endfun
    
    fun! MyComplete(findstart, base)
      if a:findstart
        " locate the start of the completion
        let line = getline('.')
        let start = col('.') - 1
        while start > 0 && line[start] !~ '{'
          let start -= 1
        endwhile
        return start
      else
        let res = []
        for m in GetRegexes()
          if m =~ '^' . a:base
            call add(res, m)
          endif
        endfor
        return res
      endif
    endfun
    set completefunc=MyComplete
    finish
    
    [0-9] {printf("yada yada \n");}
    [0-9] {printf("yada \n");}
    
    如果您将此文件保存为
    compl.vim
    ,并使用
    :so%
    命令将其源代码化,则您将能够开始键入
    {pri
    ,然后按Ctrl-X、Ctrl-U调用包含两个元素的完成菜单:

    {printf("yada yada \n");}
    {printf("yada \n");}
    
    我相信你可以根据自己的需要来调整


    您可以将2个函数保存到.vimrc中,并将completefunc设置为
    mycmlete
    ,以便在需要此类完成的缓冲区中使用。

    有关详细信息,请查看
    :h completefunc
    :h'completefunc'

    或者深入了解以下代码:

    " Scan current buffer for everithing in { }.
    fun! GetRegexes()
      let rx = '{.\+}'
      let res = []
      for line in getline(1, '$')
        if line =~ rx
          call add(res, matchstr(line, rx))
        endif
      endfor
      return res
    endfun
    
    fun! MyComplete(findstart, base)
      if a:findstart
        " locate the start of the completion
        let line = getline('.')
        let start = col('.') - 1
        while start > 0 && line[start] !~ '{'
          let start -= 1
        endwhile
        return start
      else
        let res = []
        for m in GetRegexes()
          if m =~ '^' . a:base
            call add(res, m)
          endif
        endfor
        return res
      endif
    endfun
    set completefunc=MyComplete
    finish
    
    [0-9] {printf("yada yada \n");}
    [0-9] {printf("yada \n");}
    
    如果您将此文件保存为
    compl.vim
    ,并使用
    :so%
    命令将其源代码化,则您将能够开始键入
    {pri
    ,然后按Ctrl-X、Ctrl-U调用包含两个元素的完成菜单:

    {printf("yada yada \n");}
    {printf("yada \n");}
    
    我相信你可以根据自己的需要来调整


    您可以将2个函数保存到.vimrc中,并将completefunc设置为
    mycmlete
    ,以便在需要这种完成的缓冲区使用。

    谢谢,但我不想这样做,我知道存储在寄存器(“aymotion”)中也可以,但我一直在寻找某种神圣的自动完成:PI不完全确定“自动完成”“真的描述了你在这里做什么。谢谢,但我不想要这个,我知道在寄存器中存储(“aymotion”)也可以,但我在寻找某种神圣的自动完成:PI不完全确定”自动完成“真的描述了你在这里做的事情。不,那只是一个例子,我的意思是,一般来说,一个人不能继续添加缩写。不,那只是一个例子,我的意思是,一般来说,一个人不能继续添加缩写。