当我删除标记所在的行时,如何让vim保留标记(即自动将标记移动到标记行的正上方或下方的行)
答案 0 :(得分:4)
当您不希望删除大写字母标记时,最简单的方法是使用大写字母标记。如果标记所在的行被删除,它将被移动到下一行。
另一个选项是lockmarks
命令。 lockmarks
接受命令运行并锁定当前行号的大多数标记,直到命令完成。如果你想经常这样做,你可能需要添加一些lockmarks
为你的映射,例如这会将dd
变成标记保留:
nnoremap dd :lockmarks normal! dd<cr>
或
nnoremap dd :lockmarks delete<cr>
问题是您无法指定dd
的计数。使用v:count
可以解决这个问题,但我们需要execute
来进行插值:
nnoremap dd :<c-u>execute 'lockmarks normal! ' . v:count . 'dd'<cr>
然后你必须为你经常使用的每个删除操作定义这样的映射。
因此,使用大写字母标记会更容易。你只需要记住使用它们。
答案 1 :(得分:1)
@Kurt Hutchinson的一个补充回答:有可能定义一个运算符函数。在这种情况下,您不需要为每个删除命令定义映射,而是重新定义d
:
let s:typetochar={
\ 'char': 'v',
\ 'line': 'V',
\'block': "\<C-v>",
\}
function! DeleteOperator(type)
execute 'lockmarks normal! `["'.v:register.'d'.s:typetochar[a:type].'`]'
endfunction
function! s:Delete()
set opfunc=DeleteOperator
return 'g@'
endfunction
nnoremap <expr> d <SID>Delete()
nnoremap <expr> dd <SID>Delete().'g@'
vnoremap d :<C-u>lockmarks normal! gvd<CR>
请注意dd
映射:由于d
实际上正在使用g@
,因此应该dg@
(扩展为g@g@
),您键入dd
}}。因此,为了使用清洁dd
,您必须创建映射。