In vim
kann 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?
In vim
kann 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?
Antworten:
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 gco
Zuordnung, 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
.