我正在尝试使用 flex 构建一个词法分析器。以下是显示正则表达式及其相应操作的行。
[0-9] {printf("yada yada \n");} //regex1
有没有办法{printf("yada yada \n");}
通过vim的自动完成功能从regex1重用,这样我在写regex2时就不需要再写整个东西了?
例如
.* {printf("yada yada \n");} //regex2
这超出了单词完成的范围,所以我想知道这在 vim 中可行吗?
TIA
我正在尝试使用 flex 构建一个词法分析器。以下是显示正则表达式及其相应操作的行。
[0-9] {printf("yada yada \n");} //regex1
有没有办法{printf("yada yada \n");}
通过vim的自动完成功能从regex1重用,这样我在写regex2时就不需要再写整个东西了?
例如
.* {printf("yada yada \n");} //regex2
这超出了单词完成的范围,所以我想知道这在 vim 中可行吗?
TIA
查看: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
为您需要这种完成的缓冲区。
它不是完全自动完成,但您可以定义一个缩写 - 例如
:iab yada {printf("yada yada \n");}
然后在插入模式下,如果你输入
[0-9] yada<SPACE>
它将立即替换yada
为{printf("yada yada \n");}
.
查看:h abbreviations
完整的独家新闻。
仅与 myme 的回答略有不同:
{
v
%
导航到块的末尾,直到最后一个大括号}
y
解决它。p
无论在哪里。:-)好吧,它可能不是自动完成,但它可能对你有用。您可以将该操作/打印语句保存到 vim 中的复制寄存器中,并在适当时将其粘贴。
现在该动作存储在第一个寄存器中。
希望这被证明是有用的:)