ここからXバイト移動


9

現在のカーソル位置(改行を含む)からXバイト先に移動するにはどうすればよいですか?

[count]goバッファの先頭からXバイト先に移動するために使用できます。私は試してみましたShift + V, G, [count]go(それ[count]goが私の選択の最初からカウントを開始すると仮定しました)が、残念ながらgo、バッファの最初からカウントを開始するだけなので、それも機能しませんでした。

また:set rulerformat=%o、現在のバイトオフセットを表示しようとしました(バイトオフセットにジャンプしてバイトオフセットとして位置を表示することで提案されています[count]go。頭に数字を追加して、最後にを発行しました。これは機能しますが、あまり実用的ではありません...


すべてが1行にある場合は、Xl(ここでXは文字数)または右矢印が続く文字数を使用できます。
Lekensteyn、2015

回答:


9

この検索動く40 文字(バイトではない、けれども)前進:

/\_.\{40}/e

\{40}改行(\_.)を含むあらゆる種類の40文字()を検索し、検索の最後にカーソルを置きます(/e)。参照:http : //vimregex.com/#Non-Greedy:help search-offsetおよび:help \_

また、:h 23.4バイナリ編集についても参照してください。


更新:この回答に基づいて、バイトオフセットにジャンプする関数を次に示します。

let s:last_jump_bytes = 0

function! JumpTo(byte_nr)
    let crt_byte = line2byte(line('.')) + col('.')
    if (a:byte_nr == 0)
        let dst_byte = crt_byte + s:last_jump_bytes
    else
        let dst_byte = crt_byte + a:byte_nr
        let s:last_jump_bytes = a:byte_nr
    endif
    let dst_line = byte2line(dst_byte)
    let dst_col = dst_byte -line2byte(dst_line)
    "remove next line if you don't want to record this for `Ctrl-O`
    execute "normal " . dst_line . "G"
    call setpos('.', [0, dst_line, dst_col])
endfunction

command! -nargs=1 JumpToOffset :call JumpTo(<f-args>)

" silly mapping to Ctrl-C (demo)
nnoremap <expr> <silent> <c-c> ":<c-u>call JumpTo(" . v:count . ")<cr>"

このように使用できます:

:JumpToOffset 400

または、マッピングされたキーボードマッピングをカウント付きで入力します。

40CTRL-C

カウントを使用しない場合、以前のカウント数が再利用されます。つまり40CTRL-C CTRL-C CTRL-C 30CTRL-C CTRL-C、40、40、40、30、30バイトなどをジャンプすることができます。

ヒットCtrl-Oバックジャンプする(関数内のコメントを参照してください)。


答えてくれてありがとう。私は文字ではなくXバイト先に進むことを本当に探しています。おそらくドキュメントへの参照を使用して、検索パターンの機能を説明できますか?
Rob W

できました。[count]govim関数でプロセスを自動化することもできます(現在のバイトオフセットを読み取り、必要な数を追加しますgo)。
VanLaser 2015

...自動化された機能とコマンドが追加されました。
VanLaser 2015

アップデートありがとうございます。これで見栄えが良くなりました![count]goと方法には2つの小さな違いがあります。1)[count]goアイテムをジャンプリストに追加するのでCtrl+O、以前の位置にすばやくジャンプして戻ることができます。2)[count]goなし:で使用できます[count]GOが、あなたのことをする新しいものを紹介することは可能ですか。の動作にも一致するように回答を編集できますgoか?
Rob W

両方のポイント用に編集
VanLaser 2015

9

私の質問のロジックを実装する次のソリューションを使用してしまいました。

  • [count]GO[count]バイトを前方に移動します。
  • [count]Go[count]バイトを逆方向に移動します。

これをあなたに追加してください.vimrc

function! JumpToByte(byte_nr)
    " See https://vi.stackexchange.com/a/3911/2720 for the byte counting bug
    let crt_byte = line2byte(line('.')) + col('.') - 1
    if version < 781 && &l:binary == 1 && &l:eol == 0
        let crt_byte += 1
        let crt_byte += line('.') == 1
    endif
    let dst_byte = crt_byte + a:byte_nr
    execute "normal " . dst_byte . "go"
endfunction
nnoremap <expr> <silent> GO ":<c-u>call JumpToByte(" . v:count . ")<cr>"
nnoremap <expr> <silent> Go ":<c-u>call JumpToByte(-" . v:count . ")<cr>"

VanLaserの最初の実装に感謝しました。


1つの質問ですが、この機能が必要な場所はどこですか?(ところで私はあなたのソリューションを、提供されていない場合は以前のカウントを再利用することと組み合わせました)。
VanLaser 2015

1
@VanLaser PDFファイル形式の理解を深めるために、PDFファイルの生のコンテンツを読んでいました。PDFファイルは多くのオブジェクトで構成され、これらのオブジェクトの多くには長さのプレフィックスが付いています。Xバイト先にジャンプできることは、デバッグに役立ちました。そして、なぜ私が未加工のPDFファイルを編集しているのかと尋ねる前に、私はPDF.jsの新機能を開発しています。これには、PDFファイル形式の深い知識が必要です。
Rob W

答えをありがとう(そして幸運)!興味があれば組み合わせたバージョンは、ここにある:pastebin.com/7sVyiA85
VanLaser

@VanLaser最終バージョンで回答を更新しました。元の行カウント方法は問題ありませんでしたが、Vimにはバグがありました。承認されたパッチを提出しので、Vimの最新バージョンでは、あなたの回答も意図したとおりに機能します。
Rob W

あなたはそこで(ソースに移動して)実際に掘り下げたようです-おめでとうございます!
VanLaser 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.