0

录制宏很好,但我的 .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("{{1}}"=>"{{2}}"); // {{3}}    (type ,p here)
key, value, some explanation              (type ,a here)

并使用它,获得类似:

$x = array("key"=>"value"); // some explanation

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

4

1 回答 1

2

这张线图有效,但应该有更优雅的解决方案:

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

,p映射不需要更改。

在此处输入图像描述

编辑

刚刚有时间,这应该可以满足您的要求:

你可以把它放在你的 .vimrc

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>
于 2013-01-28T14:28:52.687 回答