여기에서 X 바이트로 이동


9

현재 커서 위치 (줄 바꿈 포함)에서 시작하여 X 바이트를 앞으로 이동할 수 있습니까?

[count]go버퍼의 시작에서 X 바이트 앞으로 이동하는 데 사용될 수 있습니다. 나는 Shift + V, G, [count]go( [count]go선택의 시작부터 계산을 시작 한다고 가정) 시도 했지만 불행히도 go버퍼의 시작부터 계산을 시작 하기 때문에 작동하지 않았습니다 .

또한 :set rulerformat=%o현재 바이트 오프셋 (바이트 오프셋으로 점프하고 위치를 바이트 오프셋으로 표시 )에서 제안한 것처럼 머리에 숫자를 추가하고 마침내 발행했습니다 [count]go. 이것은 효과가 있지만 그렇게 실용적이지는 않습니다 ...


모든 것이 한 줄에있는 경우 Xl( X문자 수는 어디에 있습니까 ) 또는 문자 수 다음에 오른쪽 화살표를 사용할 수 있습니다.
Lekensteyn

답변:


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-C40, 40, 40, 30, 30 바이트 등으로 점프 할 수 있습니다 .

Ctrl-O뒤로 이동하려면 누르 십시오 (함수 안의 주석 참조).


답변 해주셔서 감사합니다. 나는 실제로 문자가 아닌 X 바이트를 앞으로 찾고 있습니다. 문서를 참조하여 검색 패턴의 기능을 설명해 주시겠습니까?
Rob W

끝난. [count]govim 함수를 통해 프로세스 를 자동화 할 수도 있습니다 (현재 바이트 오프셋 읽기, 원하는 수 추가 go).
VanLaser

... 자동 기능 및 명령이 추가되었습니다.
VanLaser

업데이트 주셔서 감사합니다, 이것은 좋아 보이기 시작합니다! [count]go방법과 방법 에는 두 가지 작은 차이가 있습니다. 1) [count]go항목을 점프 목록에 추가하므로 Ctrl+O이전 위치로 빠르게 되돌아 갈 수 있습니다 . 2) [count]go없이 사용할 수 있으며 :, [count]GO당신의 일을 하는 새로운 소개가 가능합니다 . 의 동작과 일치하도록 답변을 편집 할 수 go있습니까?
Rob W

두 점 모두에 대해 수정 됨
VanLaser

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에게 감사의 말을 전합니다.


한 가지 질문,이 기능이 정확히 필요한 곳은 어디입니까? (BTW 나는 솔루션을 이전 카운트를 다시 사용하는 것과 결합하지 않으면 결국 끝내었다).
VanLaser

1
@ VanLaser PDF 파일 형식을 더 잘 이해하기 위해 PDF 파일의 원시 내용을 읽었습니다. PDF 파일은 많은 객체로 구성되며 이러한 많은 객체에는 길이 접두사가 있습니다. X 바이트를 앞당길 수 있다는 것은 디버깅에 유용했습니다. 원시 PDF 파일을 편집하는 이유를 묻기 전에 PDF 파일 형식에 대한 심층적 인 지식이 필요한 PDF.js 의 새로운 기능을 개발 중입니다.
Rob W

답변 주셔서 감사합니다 (행운)! pastebin.com/7sVyiA85
VanLaser

@ VanLaser 최종 버전으로 답변을 업데이트했습니다. 원래 줄 계산 방법은 훌륭했지만 Vim에 버그가있었습니다. 승인 된 패치 를 제출 했으므로 최신 버전의 Vim에서는 귀하의 답변도 의도 한대로 작동합니다.
Rob W

축하합니다! 소스를 찾아 가서 실제로 파고 들었습니다. 축하합니다!
VanLaser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.