高级vim自动完成
我正在尝试使用flex构建一个词法分析器。 下面一行显示了正则表达式及其相应的操作高级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语句保存
[0-9] {printf("yada yada \n");} //regex1
有没有一种方法可以通过vim的自动完成功能重用regex1中的{printf(“yada-yada\n”);}
,这样我就不需要在编写regex2时再次编写整个代码了
e、 g
这超出了单词完成的范围,所以我想知道这在vim中是否可行
TIA好吧,这可能不是自动完成,但它可能会为您带来好处。您可以将该action/print语句保存到vim中的复制寄存器中,并在适当的时候粘贴它
希望这被证明是有用的:)好吧,这可能不是自动完成,但它可能会为您带来好处。您可以将该action/print语句保存到vim中的复制寄存器中,并在适当的时候粘贴它
希望这证明是有用的:)这不是完全自动完成,但你可以定义一个缩写-例如
: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不完全确定”自动完成“真的描述了你在这里做的事情。不,那只是一个例子,我的意思是,一般来说,一个人不能继续添加缩写。不,那只是一个例子,我的意思是,一般来说,一个人不能继续添加缩写。