3

是否可以配置 vim 以使移动命令“环绕”垂直(或水平)缓冲区?

换句话说,假设我在缓冲区的第 2 行,处于可视模式。我按3k。我的光标现在位于缓冲区的最后一行。

或者更简单地说,我的光标位于文件的第一行——我按下k. 现在我的光标翻转到文件的最后一行。

抱歉,如果以前有人问过这个问题,但我找不到任何搜索“圆形滚动”或“环绕滚动”的参考资料。

4

2 回答 2

5

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
于 2012-09-12T04:06:28.180 回答
4

Vim 是一个文本编辑器,文本具有物理和逻辑属性,即在列和行中都有开始和结束。因此,您请求的功能不存在,并且可能永远不会包含在 Vim 中。

然而,通过将大多数移动命令绑定到自定义实现,它可以通过一些努力在 Vimscript 中进行模拟。但这会在使用模型中引入不一致,因为范围(例如:42,10)仍然不会环绕。

你为什么想要这样的环绕?这是针对特定文件类型的,还是您从其他编辑器习惯了它?

于 2012-09-12T05:18:27.637 回答