Как сохранить позицию курсора при использовании:%! Filtercmd в vim? - PullRequest
0 голосов
/ 01 июня 2019

Когда я запускаю команду vim, которая начинается с :%!, например :%!sort, для сортировки всех строк в буфере, курсор перемещается на первую строку.Как сохранить положение курсора?

В конечном счете, я хочу использовать эту команду в autocmd, например:

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

Будет ли один и тот же метод работать в обоих местах?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Вы можете использовать метку для запоминания текущего номера строки (но учтите, что содержимое строки может измениться):

augroup filetype_xxx
    autocmd!
    autocmd BufWrite *.xxx :kk
    autocmd BufWrite *.xxx :%!sort
    autocmd BufWrite *.xxx :'k
augroup END
0 голосов
/ 01 июня 2019

Я бы лучше использовал функцию Preserve .Помимо решения вашей проблемы в этой конкретной задаче, вы можете использовать ее для гораздо большего.

" 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...