[英]Advanced vim autocompletion
我正在嘗試使用flex構建一個詞法分析器。 下一行顯示了正則表達式及其相應的動作。
[0-9] {printf("yada yada \n");} //regex1
有沒有一種方法可以通過vim的自動完成功能從regex1重用{printf("yada yada \\n");}
,因此在編寫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
ANK它。 p
ASTE它,走到哪里。 :-) 好吧,它可能不是自動完成,但可以為您解決問題。 您可以將動作/打印語句保存到vim中的復制寄存器中,並在適當時將其粘貼。
現在,該動作存儲在第一個寄存器中。
希望這被證明是有用的:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.