Como ir para o n'th caractere, não byte, de um arquivo?

7

Em vim , pode-se chegar ao 5º byte do arquivo com o seguinte comando:

:goto 5

No entanto, em um texto UTF-8, esse pode ser o quinto, quarto ou até o segundo caractere do arquivo. Como ir para o quinto caracter , não byte, de um arquivo?

    
por dotancohen 11.06.2014 / 18:46

2 respostas

3

Você pode começar do início do buffer e usar search() para corresponder aos N caracteres. A única armadilha é considerar os personagens da nova linha também. Aqui está um mapeamento gco personalizado que faz isso:

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>

Observe que isso conta apenas um caractere para a combinação CR-LF em buffers que têm 'fileformat' definido como dos .

    
por 12.06.2014 / 16:32
1

Que tal apenas gg0 para ir para o primeiro caractere no arquivo, então 4l para trabalhar do seu jeito 5 caracteres? Suponho que isso pode falhar se você tiver linhas vazias ou se quiser contar quebras de linha.

    
por 14.06.2014 / 01:54

Tags