Chuyển đến X byte từ đây


9

Làm cách nào tôi có thể di chuyển X byte về phía trước, bắt đầu từ vị trí con trỏ hiện tại (bao gồm cả ngắt dòng)?

[count]gocó thể được sử dụng để di chuyển về phía trước các byte X từ đầu bộ đệm. Tôi đã thử Shift + V, G, [count]go(giả sử rằng [count]gosẽ bắt đầu đếm từ lúc bắt đầu lựa chọn của tôi), nhưng thật không may, điều đó cũng không hoạt động vì gochỉ bắt đầu đếm từ đầu bộ đệm.

Tôi cũng đã cố gắng :set rulerformat=%ohiển thị phần bù byte hiện tại (như được đề xuất bằng cách nhảy sang phần bù byte và hiển thị vị trí dưới dạng phần bù byte ), thêm các số trong đầu và cuối cùng được phát hành [count]go. Điều này hoạt động, nhưng nó không thực tế ...


Nếu mọi thứ nằm trên một dòng, bạn có thể sử dụng Xl( Xsố lượng ký tự) hoặc số lượng ký tự theo sau Mũi tên phải.
Lekensteyn

Câu trả lời:


9

Tìm kiếm này di chuyển 40 ký tự (mặc dù không phải byte) về phía trước:

/\_.\{40}/e

bằng cách tìm kiếm chính xác 40 ký tự ( \{40}) của bất kỳ loại nào, bao gồm dòng mới ( \_.) và đặt con trỏ ở cuối tìm kiếm ( /e). Xem: http://vimregex.com/#Non-Greedy , :help search-offset:help \_

Ngoài ra, xem :h 23.4để chỉnh sửa nhị phân.


Cập nhật: Dựa trên câu trả lời này , đây là một hàm chuyển sang bù byte:

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>"

Có thể được sử dụng như thế này:

:JumpToOffset 400

hoặc gõ ánh xạ bàn phím được ánh xạ, với số đếm:

40CTRL-C

Nếu bạn không sử dụng số đếm, số đếm trước đó sẽ được sử dụng lại. Vì vậy, bạn có thể làm: 40CTRL-C CTRL-C CTRL-C 30CTRL-C CTRL-Cđể nhảy 40, 40, 40, 30, 30 byte, v.v.

Nhấn Ctrl-Ođể nhảy trở lại (xem bình luận bên trong chức năng).


Cảm ơn câu trả lời. Tôi thực sự đang tìm cách di chuyển về phía trước X byte, không phải là ký tự. Bạn có thể giải thích những gì mô hình tìm kiếm của bạn làm, có thể với các tài liệu tham khảo cho tài liệu?
Rob W

Làm xong. Cũng có thể tự động hóa [count]goquá trình mặc dù trong hàm vim (đọc bù byte hiện tại, thêm số mong muốn, goở đó).
VanLaser

... thêm chức năng và lệnh tự động.
VanLaser

Cảm ơn đã cập nhật, điều này bắt đầu để nhìn tốt! Có hai sự khác biệt nhỏ giữa [count]govà phương pháp của bạn: 1) [count]gothêm một mục vào danh sách nhảy, vì vậy tôi có thể sử dụng Ctrl+Ođể nhanh chóng quay trở lại vị trí trước đó. 2) [count]gocó thể được sử dụng mà không cần :, có thể giới thiệu một cái mới [count]GOlàm việc của bạn. Bạn có thể chỉnh sửa câu trả lời của mình để phù hợp với hành vi đó gokhông?
Rob W

chỉnh sửa cho cả hai điểm
VanLaser 6/07/2015

9

Tôi đã kết thúc bằng cách sử dụng giải pháp sau đây, thực hiện logic từ câu hỏi của tôi.

  • [count]GOđể di chuyển [count]byte về phía trước.
  • [count]Gođể di chuyển [count]byte ngược.

Thêm phần này vào .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>"

Cảm ơn VanLaser vì đã thực hiện ban đầu, điều này đưa tôi đi đúng hướng.


Một câu hỏi, chính xác thì bạn cần chức năng này ở đâu? (BTW Tôi đã kết thúc việc kết hợp giải pháp của bạn với việc sử dụng lại số lượng trước đó nếu không được cung cấp).
VanLaser

1
@VanLaser Tôi đã đọc nội dung thô của tệp PDF, để hiểu rõ hơn về định dạng tệp PDF. Một tệp PDF bao gồm nhiều đối tượng và nhiều đối tượng trong số này có tiền tố chiều dài. Có thể nhảy X byte về phía trước rất hữu ích cho việc gỡ lỗi. Và trước khi bạn hỏi tại sao tôi chỉnh sửa các tệp PDF thô: Tôi đang phát triển một tính năng mới cho PDF.js đòi hỏi kiến ​​thức sâu hơn về định dạng tệp PDF.
Rob W

Cảm ơn câu trả lời (và chúc may mắn)! Phiên bản kết hợp có tại đây, nếu quan tâm: pastebin.com/7sVyiA85
VanLaser

@VanLaser Tôi đã cập nhật câu trả lời của mình với phiên bản cuối cùng. Hóa ra phương pháp đếm dòng ban đầu của bạn vẫn ổn, nhưng có một lỗi trong Vim. Tôi đã gửi một bản vá đó đã được chấp nhận , vì vậy trong phiên bản mới nhất của Vim, câu trả lời của bạn cũng sẽ làm việc như dự định.
Rob W

Bạn dường như đã thực hiện một số đào thực sự ở đó (đi đến nguồn) - xin chúc mừng!
VanLaser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.