ファイル全体で現在のバイトオフセットを取得する方法


13

を使用してステータスラインに現在のバイトオフセットを表示できること%oがわかりましたが、同じことを行う関数やコマンドは見つかりませんでした。現在のバイトオフセットを実用的に取得する方法はありますか?

回答:


8

これを試して:

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

このリターンは1系と同じであるファイル、オフセット%oにおけるstatusline。もちろん、1を減算して0から始まるオフセットを取得できます。


1つの質問、col('.')実際に行のバイトオフセットを返しますか?最後に見たところ、カーソル列が表示されていました。
EvergreenTree

@EvergreenTreeによると:help col()[t]結果は数値であり、これは{expr}で指定された列位置のバイトインデックスです。それは1ベースのバイトオフセットだと
思い

答えは、次の行のみを持つファイルで機能しますabcäbか?(チェックしていません)
-VanLaser

1
@VanLaserそれは私のクイックテストで動作します。拡張テストを行っても機能するかどうかを教えてください。
lcd047

ちょうどテストし、動作します:)
VanLaser

6

他の答えは私が終わる行せずにバイナリファイルを開いたときに私のために動作しませんでした。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指定子にも影響しますrulerformat

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.