簡體   English   中英

高級vim自動補全

[英]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 - XCtrl - 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的答案略有不同:

  1. 導航至第一個括號{
  2. 使用v進入視覺模式
  3. %導航到塊的末尾,直到最后一個括號}
  4. y ANK它。
  5. p ASTE它,走到哪里。 :-)

好吧,它可能不是自動完成,但可以為您解決問題。 您可以將動作/打印語句保存到vim中的復制寄存器中,並在適當時將其粘貼。

  1. 導航至操作開始。
  2. 轉到可視模式:v
  3. 將光標移到要復制/拖動的部分文本上。
  4. 要拉入寄存器'1',請輸入:“ 1y

現在,該動作存儲在第一個寄存器中。

  1. 通過執行以下操作來粘貼內容:“ 1p(該p可以是任何粘貼命令)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM