Vim:使用自定义模式扩展线条

时间:2013-01-28 13:56:52

标签: regex vim

录制宏很好,但我的.vimrc中有这个, 我发现它非常有用:

""""""""""""""""""""""""""""""""""""""""""""""""
" ,p prepares and ,a applies a pattern
"    $x = array("@@@"=>"@@@");        (type ,p here)
"    text                             (type ,a here)
" gives you: 
"    $x = array("text"=>"text");
" and moves to the next line to repeat
""""""""""""""""""""""""""""""""""""""""""""""""
nnoremap ,p "ryy
nnoremap ,a "edd"rPV:s/@@@/<C-r>e<Backspace>/g<CR>j

一旦习惯了这一点,它(比至少对我来说)比录制宏要快得多。

我的问题是:

可以更改以识别不同的参数吗?当前替换只识别一个(整个当前行)并将其放在@@@所在的位置。

我想将其改进为:

$x = array("$x = array("key"=>"value"); // some explanation
"=>"{{2}}"); // {{3}}    (type ,p here)
key, value, some explanation              (type ,a here)

使用它,获得类似的东西:

{{1}}

我不是非常流利的vimscript或正则表达式如此动态(我的意思是,捕获变量数字或字符串)。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

这一行图可行,但应该有更优雅的解决方案:

nnoremap ,a :let li=split(getline('.'),', ')<cr><esc>dd"rP:s/,p/\=li[0]/g\|s/{{2}}/\=li[1]/g\|s/{{3}}/\=li[2]/g<cr>

不需要更改function! Doit4u(vline) let o = @r let vlist = split(a:vline, ', ') for v in vlist let n = '{{'.(1+index(vlist,v)) .'}}' let o = substitute(o,n,v,'g') endfor call setline(line("."),o) endfunction nnoremap ,p "ryy nnoremap ,a :call Doit4u(getline('.'))<cr> 映射。

enter image description here

修改

刚才有一段时间,这应该适合您的要求:

你可以把它放在你的.vimrc

{{1}}