如何在不将光标移动到Vim中的一行上的情况下执行一行操作(例如dd)?

时间:2019-07-08 09:42:56

标签: vim

  

如何在一行中执行操作(例如dd)而不将光标移动到Vim中的该行?

假设我想在第n行执行某些操作(例如dd),并且光标当前在第m行。

通常,我会这样做:

  • 转到行n:n
  • 删除行ndd
  • 返回行m:m)(+/- 1偏移)

确实要删除n行而不用:两次移动光标吗?

2 个答案:

答案 0 :(得分:4)

:ndn是行号)后跟ctrl+o

这是我仍在挣扎的带有vim的怪癖之一。我觉得:range命令根本不应该移动光标。

答案 1 :(得分:0)

您可以定义一个“保留功能”,甚至可以使它成为这样的命令:

if !exists('*Preserve')
    function! Preserve(command)
        try
            let l:win_view = winsaveview()
             "silent! keepjumps keeppatterns execute a:command
            silent! execute 'keeppatterns keepjumps ' . a:command
        finally
            call winrestview(l:win_view)
        endtry
    endfunction
endif

command! -nargs=1 Preserve call Preserve(<f-args>)

只要您使用相对数字,就可以运行:

:Preserve +13d

功能保留可让您执行许多其他操作,例如:

" define a command for reindenting the code without moving the cursor 
command! -nargs=0 Reindent :call Preserve('exec "normal! gg=G"')
" Remove trailing whitespaces
call Preserve(":%s,\\s\\+$,,e")

来源: + https://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps-your-state/ + https://stackoverflow.com/a/3213800/2571881