7

В vim можно получить 5-й байт файла с помощью следующей команды:

:goto 5

Однако в тексте UTF-8 это может быть 5-й, 4-й или даже 2-й символ в файле. Как перейти к 5-му символу, а не байту файла?

2 ответа2

3

Вы можете начать с начала буфера и использовать search() для сопоставления N символов. Единственным подводным камнем также являются символы новой строки. Вот пользовательское сопоставление gco которое делает это:

function! s:GoToCharacter( count )
    let l:save_view = winsaveview()
    " We need to include the newline position in the searches, too. The
    " newline is a character, too, and should be counted.
    let l:save_virtualedit = &virtualedit
    try
        let [l:fixPointMotion, l:searchExpr, l:searchFlags] = ['gg0', '\%#\_.\{' . (a:count + 1) . '}', 'ceW']
        silent! execute 'normal!' l:fixPointMotion

        if search(l:searchExpr, l:searchFlags) == 0
            " We couldn't reach the final destination.
            execute "normal! \<C-\>\<C-n>\<Esc>" | " Beep.
            call winrestview(l:save_view)
            return 0
        else
            return 1
        endif
    finally
        let &virtualedit = l:save_virtualedit
    endtry
endfunction
" We start at the beginning, on character number 1.
nnoremap <silent> gco :<C-u>if ! <SID>GoToCharacter(v:count1 - 1)<Bar>echoerr 'No such position'<Bar>endif<Bar><CR>

Обратите внимание, что для буфера, в котором 'fileformat' установлено значение dos учитывается только один символ для комбинации CR-LF.

1

Как насчет gg0 чтобы перейти к первому символу в файле, а затем к 4l чтобы перейти на 5 символов? Я полагаю, что это может не сработать, если у вас есть пустые строки или если вы хотите считать разрывы строк.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .