如何从当前光标位置(包括换行符)开始向前移动X个字节?
[count]go
可用于从缓冲区的开始向前移X个字节。我尝试了一下Shift + V, G, [count]go
(假设[count]go
将从选择的开头开始计数),但是不幸的是,这也没有用,因为它go
仅从缓冲区的开头开始计数。
我还尝试:set rulerformat=%o
显示当前字节偏移量(如跳转到字节偏移量并显示为字节偏移量所示),将数字添加到我的头部并最终发出[count]go
。这行得通,但不是很实用...
如何从当前光标位置(包括换行符)开始向前移动X个字节?
[count]go
可用于从缓冲区的开始向前移X个字节。我尝试了一下Shift + V, G, [count]go
(假设[count]go
将从选择的开头开始计数),但是不幸的是,这也没有用,因为它go
仅从缓冲区的开头开始计数。
我还尝试:set rulerformat=%o
显示当前字节偏移量(如跳转到字节偏移量并显示为字节偏移量所示),将数字添加到我的头部并最终发出[count]go
。这行得通,但不是很实用...
Answers:
该搜索将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
即可跳回(请参见函数内部的注释)。
[count]go
尽管在vim函数中(读取当前字节偏移,在go
此处添加所需的数字),也可以使过程自动化。
[count]go
和方法之间有两个小区别:1)[count]go
将项目添加到跳转列表中,因此我可以Ctrl+O
用来快速跳转回我以前的位置。2)[count]go
可以不带:
,可以引入一个新的功能[count]GO
来做。您可以编辑您的答案以使其也符合该行为go
吗?
我最终使用了以下解决方案,该解决方案实现了我的问题的逻辑。
[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的最初实施,这为我指明了正确的方向。
Xl
(X
字符数在其中)或字符数后跟向右箭头。