在Vim中使用:%!filtercmd时如何保留光标位置?

时间:2019-05-31 22:12:40

标签: vim

当我发出以:%!开头的vim命令(例如:%!sort)对缓冲区中的所有行进行排序时,光标将移至第一行。如何保留光标位置?

最终,我想在autocmd中使用此命令,例如:

augroup filetype_xxx
    autocmd!
    autocmd BufWrite *.xxx :%!sort
augroup END

在两个地方都可以使用相同的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用标记来记住当前行号(但请注意,行内容可能会更改):

augroup filetype_xxx
    autocmd!
    autocmd BufWrite *.xxx :kk
    autocmd BufWrite *.xxx :%!sort
    autocmd BufWrite *.xxx :'k
augroup END

答案 1 :(得分:0)

我宁愿使用保留功能。除了解决此特定任务中的问题外,您还可以使用它很多。

" preserve function
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

augroup filetype_xxx
    autocmd!
    autocmd BufWrite *.xxx :call Preserve("%!sort")
augroup END

您还可以使用“保留功能”执行其他有用的任务,例如:

command! -nargs=0 Reindent :call Preserve('exec "normal! gg=G"')
DelBlankLines')
    fun! DelBlankLines() range
        if !&binary && &filetype != 'diff'
            call Preserve(':%s/\s\+$//e')
            call Preserve(':%s/^\n\{2,}/\r/ge')
        endif
    endfun
endif
command! -nargs=0 DelBlank :call DelBlankLines()
nnoremap <Leader>d :call DelBlankLines()<cr>

" remove trailing spaces
if !exists('*StripTrailingWhitespace')
    function! StripTrailingWhitespace()
        if !&binary && &filetype != 'diff'
            call Preserve(":%s,\\s\\+$,,e")
        endif
    endfunction
endif
command! Cls call StripTrailingWhitespace()
cnoreabbrev cls Cls
cnoreabbrev StripTrailingSpace Cls