Làm thế nào để có được bù byte hiện tại trong toàn bộ tệp


13

Tôi thấy rằng bạn có thể hiển thị bù byte hiện tại trong dòng trạng thái bằng cách sử dụng %o, nhưng tôi không tìm thấy chức năng hoặc lệnh nào giống như vậy. Có cách nào để lấy byte hiện tại một cách thực tế không?

Câu trả lời:


8

Thử đi:

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

Điều này trả về phần bù dựa trên 1 trong tệp, giống như %otrong statusline. Tất nhiên, bạn có thể trừ 1 để lấy phần bù dựa trên 0.


Một câu hỏi, có col('.')thực sự trả lại byte bù trong dòng không? Lần cuối tôi nhìn, nó chỉ hiển thị cột con trỏ.
EvergreenTree

@EvergreenTree Theo :help col(): [t] anh ấy kết quả là một Số, là chỉ số byte của vị trí cột được đưa ra với {expr} . Tôi coi đó là phần bù byte dựa trên 1 ...
lcd047

Câu trả lời sẽ chỉ hoạt động trong một tệp chỉ có dòng này : abcäb? (Tôi chưa kiểm tra)
VanLaser 6/07/2015

1
@VanLaser Nó hoạt động trong các thử nghiệm nhanh của tôi. Bạn cho chúng tôi biết nếu nó vẫn hoạt động sau khi thử nghiệm mở rộng.
lcd047 6/07/2015

Chỉ cần thử nghiệm và nó hoạt động :)
VanLaser 6/07/2015

6

Các câu trả lời khác không làm việc cho tôi khi tôi mở một tập tin nhị phân mà không cần dòng kết thúc. Có vẻ như có một lỗi trong vim khi nói đến việc đếm byte trong tệp nhị phân không có eol. (chỉnh sửa: có, đây là một lỗi. Tôi đã gửi một bản vá , được chấp nhận trong 7.4.781 ).

Để tìm bù byte, trong khi tính toán lỗi trong các phiên bản Vim cũ, hãy sử dụng:

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

Lỗi này cũng ảnh hưởng đến %ospecifier trong ví dụ rulerformat.

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.