VimL的新手尝试编写执行以下操作的映射:
foo
|----> cursor
bar
baz
lr2j
应使用foo
重新baz
。
" replace the current line with a line given by a linewise motion
function! s:LineReplace(type)
if a:type !=# 'line'
return
endif
let saved_register = @@
silent execute "normal! S\<esc>my`]dd'yPjddk^ :delmarks y"
let @@ = saved_register
endfunction
nnoremap lr :set operatorfunc=<SID>LineReplace<cr>g@
相反,我得到
Error detected while processing function <SNR>108_LineReplace: line 5: E20: Mark not set
我尝试过execute "normal! ..."
命令的不同排列无效。有人能发现错误吗?
我应该注意,当我测试normal
命令时,一切正常并且标记'y
存在。
答案 0 :(得分:2)
将:move
和:delete
简单地用于:
" replace the current line with a line given by a linewise motion
function! s:LineReplace(type)
if a:type !=# 'line'
return
endif
']move '[
-delete_
endfunction
nnoremap lr :set operatorfunc=<SID>LineReplace<cr>g@
如需更多帮助,请参阅:
:h :d
:h :m
:h :range
答案 1 :(得分:0)
@xaizek是对的;正确的方法是存储动作中的标记:
" replace the current line with a line given by a linewise motion
function! s:LineReplace(type)
if a:type !=# 'line'
return
endif
let lnum = getpos("']")[1]
let saved_register = @@
silent execute "normal S\<esc>my" . lnum . "Gdd'yPjddk^ :delmarks y"
let @@ = saved_register
endfunction
nnoremap lr :set operatorfunc=<SID>LineReplace<cr>g@