전체 파일에서 현재 바이트 오프셋을 얻는 방법


13

를 사용하여 상태 표시 줄에 현재 바이트 오프셋을 표시 할 수 있음을 %o알았지 만 동일한 기능이나 명령을 찾지 못했습니다. 현재 바이트 오프셋을 실용적으로 얻는 방법이 있습니까?

답변:


8

이 시도:

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

이는 1 기반과 동일하다, 파일의 오프셋 (offset)를 돌려줍니다 %o에서 statusline. 물론 1을 빼서 0 기반 오프셋을 얻을 수 있습니다.


한 가지 질문은 col('.')실제로 줄에 바이트 오프셋을 반환합니까? 마지막으로, 커서 열이 표시되었습니다.
EvergreenTree

@EvergreenTree에 따르면 :help col(): [t] 그 결과는 Number이며 {expr}로 주어진 열 위치의 바이트 인덱스입니다 . 나는 그것이 1- 기반 바이트 오프셋이라고 생각합니다.
lcd047

이 줄이있는 파일에서만 답이 작동 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.