当我删除标记所在的行时,使vim保持标记

时间:2012-01-25 19:24:55

标签: vim

当我删除标记所在的行时,如何让vim保留标记(即自动将标记移动到标记行的正上方或下方的行)

2 个答案:

答案 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,您必须创建映射。