如何转到文件的第 n 个字符(而不是字节)?

如何转到文件的第 n 个字符(而不是字节)?

可以vim使用以下命令获取文件的第 5 个字节:

:goto 5

然而,在 UTF-8 文本中,这可能是文件中的第 5 个、第 4 个甚至第 2 个字符。如何转到第 5 个特点,不是文件的字节?

答案1

您可以从缓冲区的开头开始,并使用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'请注意,这仅计算已设置为的缓冲区中的 CR-LF 组合的一个字符dos

答案2

那么,先gg0转到文件中的第一个字符,然后4l再转到第 5 个字符呢?我想,如果有空行或者您想要计算换行符,这种方法可能会失败。

相关内容