在Vim中顺利滚动的最好方法是什么?

Vim中的主要滚动命令是:

  1. CtrlBCtrlF ,以及PageUpPageDown滚动整页
  2. CtrlUCtrlD默认为半页滚动
  3. CtrlYCtrlE滚动一行

前两者每次都失去了视觉上下文,所以我开发了重复击中后者的不良习惯( CtrlYCtrlE )。

由于目前没有第一方支持平滑滚动,所以最不引人注意的解决方法/插件是什么?

我根据任务使用Vim和GVim,如果没有一个真正适合两者的好黑客,我很乐意单独定制它们。 鼠标滚轮在GVim中很好地工作,但我正在寻找基于键盘的解决scheme。

更新 :现在我已经推动了这个代码,按照指导原则进行了重构:help write-plugin , Github回购 。

使用键盘

这是我在.vimrc

 function SmoothScroll(up) if a:up let scrollaction="^Y" else let scrollaction="^E" endif exec "normal " . scrollaction redraw let counter=1 while counter<&scroll let counter+=1 sleep 10m redraw exec "normal " . scrollaction endwhile endfunction nnoremap <CU> :call SmoothScroll(1)<Enter> nnoremap <CD> :call SmoothScroll(0)<Enter> inoremap <CU> <Esc>:call SmoothScroll(1)<Enter>i inoremap <CD> <Esc>:call SmoothScroll(0)<Enter>i 

特征:

  • 滚动Vim scroll选项的底部。
  • 可定制的滚动速度(调整sleep命令的时间参数;我使用十毫秒)。 注意 :就像减慢video的帧速率一样,如果你减慢平滑滚动太多,它将是滚动的,而不是平滑的滚动。 但是,无论什么最适合你。
  • 以正常或插入模式工作。

注意 :所有的复制和粘贴,请记住^字符表示一个控制字符; 复制粘贴将产生无效的结果,这些必须手动input!

  • ^YCTRLV然后CTRLY
  • ^ECTRLV然后CTRLE

但是, <CU><Enter>风格的语法按照字面input, 地图命令智能地将它们转换为控制字符。

使用鼠标

这个问题提到用鼠标滚动在GVim中运行良好,但是需要键盘解决scheme。 这意味着提交者可能对鼠标解决scheme感兴趣,如果它在常规terminalVim中工作的话。

对于我来说,开启鼠标支持可以顺利滚动鼠标滚轮。 另外,对于我来说,平滑的滚动是最重要的,当我环顾四周(即在正常模式),而不是当我正在编辑(插入模式),如果我不积极编辑,需要我的手留在键盘在任何时候都被删除,所以这个效果很好。

在这个问题的基础上,虽然看起来有些人不仅仅是简单地打开鼠标(我只是使用set mouse=n ),还要做更多的手动设置:


我的.vimrc有以下几行

  set mouse=a map <ScrollWheelUp> <CY> map <ScrollWheelDown> <CE> 

在vim的tips.txt中有一个简单的重新映射:

 Smooth scrolling *scroll-smooth* If you like the scrolling to go a bit smoother, you can use these mappings: :map <CU> <CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY><CY> :map <CD> <CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE><CE> 

最近的插件

我在这里发布了类似的东西 ,但基本上有一个伟大的插件,我们现在可以用于滚动,称为terryma / vim-smooth-scroll 。 它提供了一个非常好的和平滑的滚动。


安装非常简单:

1我使用Vundle,所以我只是将其添加到.vimrc.bundles中

 Bundle terryma/vim-smooth-scroll 

在2016年4月29日发布的Vundle最新版本中,您可以将其放在.vimrc中

 Plugin 'terryma/vim-smooth-scroll' 

2如文档中所述,您可以设置3个参数: 距离持续时间速度

我在我的.vimrc文件中使用这个:

 noremap <silent> <cb> :call smooth_scroll#up(&scroll*2, 10, 4)<CR> noremap <silent> <cf> :call smooth_scroll#down(&scroll*2, 10, 4)<CR> 

这不是完全平滑的滚动,但这是我如何处理跳跃页面时不丢失上下文。

设置如此= 7

'scrolloff''so'number(default 0)global
{Vi无此function}
保持光标上方和下方的最less数量的屏幕线条。 这将使您在工作的地方可以看到一些上下文。 如果将其设置为非常大的值(999),则光标线始终位于窗口的中间(文件的开头或结尾除外,或者换行较长时)。 要水平滚动,请参阅“sidescrolloff”。 注:设置“兼容”时,此选项设置为0。

我所做的是将键盘重复速度设置得非常快,大约120个字节/秒,延迟小。 然后我映射到4j和4k我使用j和k来上下导航源代码,上下移动光标很好,很快,很顺利。 但是这里有很好的一面,这在Linux上是可行的,而不是Windows。 多年以来,X11的键盘input工作方式使得当您按住j时显然会开始输出j个字符。 但是当你按住j然后再按ctrl键时,X11开始输出cj字符,而不必重新按j键。 那么当你松开ctrl键并仍然按住j时,X11会继续放置j。 所以j使光标开始向下移动,并且可以周期性地按下ctrl,而不用让j给它一个提升,一个颠簸。

另外,我做德文所做的,我把scrolloffset设置为5。

最后,我交换ctrl和大写locking。 ctrl键的默认位置是完全减速的(没有违规意图)。 它使你必须旋转你的左手。 我几乎从来没有使用大写locking,所以我交换了它们。 然后,我的左手粉红色的手指可以到达Ctrl键没有任何瑜伽动作。

这些东西多年来一直为我工作。 我只使用vim,从来没有gvim。

无耻的插件,但我在这里创build了一个插件,您可以使用它来轻松调整滚动animation的距离,速度和持续时间: https : //github.com/terryma/vim-smooth-scroll

插件cskeeters / vim-smooth-scroll支持平滑滚动,不需要configuration。 它支持使用ztzzzb平滑滚动。 这是Terryma插件的一个分支。 一些公开的拉请求已被应用。

我刚刚发现这个名为“加速平滑滚动”的插件(“用于加速平滑滚动的Vim插件(映射到<CD>/<CU><CF>/<CB>) ”),可以通过Vundle把这行放在你的.vimrc里:

 Plugin 'yonchu/accelerated-smooth-scroll' 

然后重新启动Vim并运行:PluginInstall命令,然后重新启动Vim并正常使用<CD>Ctrl + D )和<CO>Ctrl + O )命令。

不幸的是,这个插件也移动光标,而不是我想要的:像<CE><CY>命令一样滚动屏幕。