Wie gehe ich zum n-ten Zeichen und nicht zum Byte einer Datei?

7

In vimkann man mit dem folgenden Befehl zum 5. Byte der Datei gelangen:

:goto 5

In einem UTF-8-Text kann dies jedoch das 5., 4. oder sogar 2. Zeichen in der Datei sein. Wie gehe ich zum 5. Zeichen und nicht zum Byte einer Datei?

dotancohen
quelle

Antworten:

3

Sie können am Anfang des Puffers beginnen und verwenden search(), um N Zeichen abzugleichen. Die einzige Gefahr besteht darin, auch die Zeilenumbrüche zu berücksichtigen. Hier ist eine benutzerdefinierte gcoZuordnung, die dies tut:

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>

Beachten Sie, dass dies nur ein Zeichen für die CR-LF-Kombination in Puffern ist, die auf 'fileformat'eingestellt sind dos.

Ingo Karkat
quelle
Das ist absolute Magie, Ingo! Vielen Dank, ich lerne immer aus Ihren Beiträgen.
Dotancohen
Hannah teilt nur das Alter meiner beiden Töchter auf, und wie Sie wissen, wird der Name sowohl auf Hebräisch als auch auf Japanisch verwendet. Wenn Sie und Ihre Liebsten jeden Besuch in Israel haben, wartet ein kaltes Bier auf Sie und zwei freundliche Mädchen, die gerne spielen würden!
Dotancohen
1

Was ist, wenn Sie nur gg0zum ersten Zeichen in der Datei gehen und dann 4l5 Zeichen bearbeiten? Ich nehme an, dies kann fehlschlagen, wenn Sie leere Zeilen haben oder Zeilenumbrüche zählen möchten.

Ben
quelle