在vim中插入文本加上模式的计数

时间:2015-02-27 21:23:53

标签: vim

我正在尝试编写一个小函数,这将有助于我在使用Stata调试代码时。我想要的只是让vim计算一行以di "here开头的次数,然后将di "here XX"插入缓冲区中的当前行,其中XX是次数。

这就是我所拥有的:

fun! ADD_Here()
    let n=[0] | bufdo %s/^di\ \"here\zs/\=map(n,'v:val+1')[1:]/ge
    put='di \"here ' . n[0] . '\"'
endfun
nmap <leader>d :<C-U>call ADD_Here()<CR>

这几乎完全按照预期工作,它完成所有计数和插入文本,但它总是将第二个插入放在第一个插入的正下方,然后将第三个放在第二个插入的下面,等等。如何修改它以便插入在当前的行?

出于引用目的,我获得了let n=[0]...声明here的代码。

2 个答案:

答案 0 :(得分:2)

如果没有:[line]put

[line]始终将文字放在第[line]行或当前行。

使用call setline('.', 'di \"here ' . n[0] . '\"')更改当前行。

答案 1 :(得分:0)

通过在计数发生之前存储当前行号来解决问题,在计数之后移动到该行,使用setline函数插入带有唯一关键字的文本(感谢@romani将此功能带到我的注意),然后用n[0]中存储的计数替换该关键字。我还在exec 'normal O'函数之前添加了setline命令,以在当前行上方插入换行符,以便当前行不被调试文本替换。

    fun! ADD_Here()
        "Store the current line number in a variable
        let cline = line('.') 

        "Store the count of lines beginning with 'di "here' in a list
        let n=[0] | bufdo %s/^di\ \"here\zs/\=map(n,'v:val+1')[1:]/ge     

        "The above command moves the current line if n[0]>0, so go back to the saved value
        exec cline

        "Create a blank line above the current line and move to it
        exec 'normal O'

        "Insert text with a unique keyword '__stata_debug__' on the current line
        call setline('.','di "here __stata_debug__"')

        "Replace the unique keyword with the count of lines beginning with 'di "here'
        exec '%s/__stata_debug__/'.n[0].'/g'
    endfun
    "Map to function to <leader>d
    nmap <leader>d :<C-U>call ADD_Here()<CR>