是否可以配置 vim 以使移动命令“环绕”垂直(或水平)缓冲区?
换句话说,假设我在缓冲区的第 2 行,处于可视模式。我按3k
。我的光标现在位于缓冲区的最后一行。
或者更简单地说,我的光标位于文件的第一行——我按下k
. 现在我的光标翻转到文件的最后一行。
抱歉,如果以前有人问过这个问题,但我找不到任何搜索“圆形滚动”或“环绕滚动”的参考资料。
G
使用一些 vimscript hackery 可能是可能的,但是通过诸如转到文件底部和gg
/1G
或<C-Home>
转到文件顶部之类的动作来提高效率要普遍得多。同样,$
对于行尾和0
行首或^
第一个非空白字符。
您还可以设置:help whichwrap
,它指定哪些键在移过行尾时将移至下一行,或在移过行首时移至上一行。除此之外,我认为没有内置功能可以满足您的要求。您可以使用一些 vimscript 来做到这一点,但它需要将 h、j、k 和 l 重新映射到函数并处理它们是否位于行/文件的末尾/开头。对我来说,这似乎有点矫枉过正而且相当混乱。
说了这么多,如果你必须...
nnoremap j :call CheckJ()<cr>
nnoremap k :call CheckK()<cr>
nnoremap h :call CheckH()<cr>
nnoremap l :call CheckL()<cr>
fun! CheckJ()
if line('.') == line('$')
norm! gg
else
norm! j
endif
endfun
fun! CheckK()
if line('.') == 1
norm! G
else
norm! k
endif
endfun
fun! CheckH()
if col('.') == 1
norm! $
else
norm! h
endif
endfun
fun! CheckL()
if col('.') == (col('$') - 1)
norm! 0
else
norm! l
endif
endfun
Vim 是一个文本编辑器,文本具有物理和逻辑属性,即在列和行中都有开始和结束。因此,您请求的功能不存在,并且可能永远不会包含在 Vim 中。
然而,通过将大多数移动命令绑定到自定义实现,它可以通过一些努力在 Vimscript 中进行模拟。但这会在使用模型中引入不一致,因为范围(例如:42,10
)仍然不会环绕。
你为什么想要这样的环绕?这是针对特定文件类型的,还是您从其他编辑器习惯了它?