1

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

[0-9] {printf("yada yada \n");} //regex1

有没有办法{printf("yada yada \n");}通过vim的自动完成功能从regex1重用,这样我在写regex2时就不需要再写整个东西了?

例如

.* {printf("yada yada \n");} //regex2

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

TIA

4

4 回答 4

3

查看: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以调用包含 2 个元素的完成菜单:

{printf("yada yada \n");}
{printf("yada \n");}

我相信您可以根据自己的需要进行调整。

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

于 2010-02-11T11:12:44.573 回答
1

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

:iab yada {printf("yada yada \n");} 

然后在插入模式下,如果你输入

[0-9] yada<SPACE>

它将立即替换yada{printf("yada yada \n");}.

查看:h abbreviations完整的独家新闻。

于 2010-02-11T07:42:53.600 回答
1

仅与 myme 的回答略有不同:

  1. 导航到第一个大括号{
  2. 进入视觉模式v
  3. %导航到块的末尾,直到最后一个大括号}
  4. y解决它。
  5. p无论在哪里。:-)
于 2010-02-11T07:46:35.030 回答
0

好吧,它可能不是自动完成,但它可能对你有用。您可以将该操作/打印语句保存到 vim 中的复制寄存器中,并在适当时将其粘贴。

  1. 导航到操作的开头。
  2. 进入视觉模式:v
  3. 移动要复制/拉出的文本部分。
  4. 要拉入寄存器“1”,请键入:“1y

现在该动作存储在第一个寄存器中。

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

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

于 2010-02-11T07:25:04.790 回答