2010-02-11 122 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,以获取需要完成此类操作的缓冲区。