当我发出以:%!
开头的vim命令(例如:%!sort
)对缓冲区中的所有行进行排序时,光标将移至第一行。如何保留光标位置?
最终,我想在autocmd
中使用此命令,例如:
augroup filetype_xxx
autocmd!
autocmd BufWrite *.xxx :%!sort
augroup END
在两个地方都可以使用相同的方法吗?
答案 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