我看到您可以使用%o在状态行中显示当前字节偏移,但是我发现没有函数或命令可以执行相同的操作。有没有一种实用的方法来获取当前字节的偏移量?

#1 楼

尝试以下操作:



function! FileOffset()
    return line2byte(line('.')) + col('.') - 1
endfunction


这将返回文件中从1开始的偏移量,与%o中的statusline相同。当然,您可以减去1以获得基于0的偏移。

评论


一个问题,col('。')是否实际上返回行中的字节偏移量?最后我看了一下,它只是显示了光标列。

–EvergreenTree
2015年7月6日在16:12



@EvergreenTree根据:help col():[t]结果是一个数字,它是{expr}给定的列位置的字节索引。我认为这是从1开始的字节偏移量...

–lcd047
2015年7月6日在16:14



答案仅在以下行的文件中起作用:abcäb吗? (我没有检查)

– VanLaser
2015年7月6日在16:14



@VanLaser它在我的快速测试中有效。您告诉我们在扩展测试后它是否仍然有效。

–lcd047
15年7月6日在16:16

刚刚测试过,它可以工作:)

– VanLaser
15年7月6日在16:17

#2 楼

当我打开没有结尾的二进制文件时,另一个答案对我不起作用。在计算没有eol的二进制文件中的字节时,vim中似乎存在一个错误。 (编辑:是的,这是一个错误。我已经提交了一个补丁,该补丁已在7.4.781中被接受)。

要找到字节偏移量,同时考虑到旧Vim版本中的错误,请使用:

let offset = line2byte(line('.')) + col('.') - 1
if version < 781 && &l:binary == 1 && &l:eol == 0
    " Vim prior 7.4.781 had a bug where the line count is off by 1 or 2.
    " See https://groups.google.com/forum/#!msg/vim_dev/zX45zm-cnc0/-BWjjh5tlX8J
    let offset += 1
    let offset += line('.') == 1
endif


此错误也会影响例如%o