2010-02-11 133 views
1

我想建立一個使用flex的詞法分析器。 以下是顯示正則表達式及其相應操作的一行。高級vim自動完成

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

有沒有辦法重用從VIM的自動完成功能regex1的{printf("yada yada \n");},這樣我就不需要再次寫了整個事情,而寫regex2?

例如

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

這超越字完成,所以我想知道這是可行的VIM?

TIA

回答

0

那麼,它可能不會自動完成,但它可能會爲你做詭計。您可以將該操作/打印語句保存到vim中的複製寄存器中,並在合適的時候將其粘貼。

  1. 導航到操作的開頭。
  2. 轉到視覺模式:v
  3. 移過要複製/抽出的部分文本。
  4. 要拷貝到寄存器「1」,類型:「1Y

現在的動作是存儲在寄存器頭號

  1. 通過執行內容粘貼:」 1P(即p可以是任何粘貼命令)。

希望這會被證明是有用的:)

+0

謝謝,但我不想這樣,我知道存儲在寄存器(「aymotion)會做,但我正在尋找一些神聖的汽車完成:P – 2010-02-11 07:28:07

+0

我不完全確定」自動完成「真的描述你在這裏做, – rossipedia 2010-02-11 07:42:07

1

這是不太自動完成的,但你可以定義的縮寫 - 例如

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

然後在插入模式下,如果你鍵入

[0-9] yada<SPACE> 

它會立即與{printf("yada yada \n");}取代yada

查看:h abbreviations查看全文。

+0

不,這僅僅是一個例子,我的意思是一般來說,不能繼續添加縮寫。 – 2010-02-11 08:27:14

1

僅比myme的回答略有不同:

  1. 導航到第一支撐{
  2. 進入可視化模式v
  3. %導航到塊的結尾,直到最後一個大括號}
  4. y ank it。
  5. p無論它在哪裏。:-)
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鍵 - XCtrl鍵 - ü調用完成菜單用2個元素:

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

我相信你可以根據你的需求進行調整。

您可以將2個函數保存到.vimrc中,並將completefunc設置爲MyComlete,以獲取需要完成此類操作的緩衝區。