我正在尝试编写一个小函数,这将有助于我在使用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的代码。
答案 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>