在Vim中进行平滑滚动的最佳方法是什么?


76

Vim中的主要滚动命令是:

  1. Ctrl-BCtrl- F,以及PageUpPageDown滚动的整版
  2. Ctrl-UCtrl-D默认滚动半页
  3. Ctrl-YCtrl-E滚动一行

对于前两个,我每次都会失去视觉上下文,因此我养成了反复打后一个(Ctrl-YCtrl- E)的坏习惯。

由于目前尚无第一方支持平滑滚动,所以最不讨厌的解决方法/插件是什么?

我会根据任务同时使用Vim和GVim,如果没有人能同时使用这两个工具,我很乐意分别定制它们。鼠标滚轮在GVim中效果很好,但是我正在寻找基于键盘的解决方案。


[Ctrl + U]不起作用,[Ctrl + u]起作用,您使用的是哪个版本的vi(m)?
AjayKumarBasuthkar 2014年

Answers:


37

更新:现在,我已将此代码(根据其指南进行了某种程度的重构)推: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 <C-U> :call SmoothScroll(1)<Enter>
nnoremap <C-D> :call SmoothScroll(0)<Enter>
inoremap <C-U> <Esc>:call SmoothScroll(1)<Enter>i
inoremap <C-D> <Esc>:call SmoothScroll(0)<Enter>i

特征:

  • 在Vimscroll选项的基础上滚动。
  • 可自定义的滚动速度(调整sleep命令的时间参数;我使用十毫秒)。注意:就像减慢视频的帧速率一样,如果您减慢平滑滚动的速度,则将是抖动滚动,而不是平滑滚动。但是,最适合您的是什么。
  • 在普通或插入模式下工作。

注意:所有复制粘贴操作,请记住该^字符表示控制字符;复制粘贴将产生无效的结果,必须手动输入这些结果!

  • ^Y- CTRL-V那么CTRL-Y
  • ^E- CTRL-V那么CTRL-E

但是,<C-U>and<Enter>样式语法的字面意义是这些字符。map命令智能地将它们转换为控制字符。

使用鼠标

该问题提到在GVim中使用鼠标滚动效果很好,但是需要键盘解决方案。这对我来说意味着,如果问询者可以在常规终端Vim中工作,那么它可能会对鼠标解决方案感兴趣。

对我来说,打开鼠标支持可以平滑地滚动鼠标滚轮。另外,对我来说,平滑滚动是最重要的,这时我环顾四周(即在正常模式下),而不是在编辑时(在插入模式下),并且如果我不积极进行编辑,则需要我的手一直保持在始终都卸下键盘,因此效果很好。

但是,基于此问题,似乎有些人需要做更多的手动设置,而不仅仅是简单地打开鼠标(我只是使用set mouse=n):


.vimrc有以下几行

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>


这很好用...并且不像其他答案一样依赖机器的速度。干杯!
Steve Vermeulen 2013年

1
警告:我发现您不应该按<kbd> Ctrl </ kbd>-<kbd> D </ kbd>等,直到上一次滚动完成或行为怪异为止。我以前没有遇到过这个问题,所以我不知道是否只是没有注意到它,还是它特定于我正在使用的当前计算机上的Vim配置。如果有人知道如何应对多线程的Vim(!!),请随时插入内容。
基思潘松

我想到的一种可能的改进是对zz,z-,z <cr>命令应用相同的平滑滚动
Steve Vermeulen13年

好主意。我想,您可以以相同的方式重新映射它们。
基思·品森

3
关于“记住^字符表示控制字符”的小注释:您可以将'let scrollaction =“ ^ Y”'替换为'let scrollaction =“ \ <Cy>”'',这样您就不必使用<Cv> <Cy>产生键绑定,并使得复制粘贴成为可能:)
gospes

11

在vim的tips.txt中有一个简单的remap hack:

Smooth scrolling                    *scroll-smooth*

If you like the scrolling to go a bit smoother, you can use these mappings:

    :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
    :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>

1
为什么最好使用“滚动”选项设置(例如:set scroll = 15)?滚动选项似乎更可取,因为您甚至可以创建一个au命令,该命令可在窗口高度更改时自动更改它。(我想您也可以使用这种映射方法执行类似的操作,但是使用滚动选项可以简化操作。)
Herbert Sitz 2010年

1
实际上,自动设置滚动变量也是我也在考虑的选项之一。如您所述,它必须适合窗口大小。scroll变量默认为窗口高度的1/2,但似乎没有提供改变该比例的方法。您只能根据行数进行更改。您可能还需要为滚动设置一个较小的值,而不是进行某种平滑的滚动,因为您的眼睛没有任何中间滚动状态可以改善视觉的持久性。
安德鲁·瓦格纳

1
为了明确起见,cd和cu将使用“ scroll”选项设置为的内容进行滚动。默认值为窗口高度的1/2,但您可以将其设置为所需的任何高度。如果要根据窗口高度设置新值,请使用“ winheight(“%”)”函数,该函数返回窗口中的行数。因此,例如,命令':set scroll = winheight(“%”)/ 3'将使cu和cd滚动显示窗口高度的1/3。
2010年

1
@Drew Wagnernoremap <expr> <C-u> repeat("\<C-y>", 20)为了便于阅读,应重写此映射。
ZyX

9
或者只是:map <C-U> 20<C-Y>
艾西珊(Anishsane),2015年


7

最近的插件

我在这里发布了类似的内容,但是基本上有一个很棒的插件,我们现在可以使用它进行滚动,称为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个参数:distancedurationspeed

我在我的.vimrc文件中使用了它:

noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>

1
可悲的是,这个插件也移动了光标,而不是我想要的:只是像<C-E><C-Y>命令一样滚动屏幕。
silviubogan '16

4

我要做的是将键盘重复设置为非常快,大约120个字符/秒,并且延迟很小。然后,我映射到4j和4k,然后使用j和k上下移动源代码,这样可以很好,快速,流畅地上下移动光标。但这是很好的部分,它可以在Linux而不是Windows上运行。多年来,X11的键盘输入以这样的方式工作:当您按住j时,显然会开始输出j个字符。但是,当您随后按住j并同时按ctrl键时,X11开始放出cj字符,而无需再次按j键。然后,当您松开ctrl键并仍然继续按j时,X11会再次放回j。因此,j使光标开始向下平滑移动,并且您可以定期按下ctrl而不放开j来增强它,

另外,我做Devin的工作,并将scrolloffset设置为5。

最后,我交换Ctrl和Cap Lock。Ctrl键的默认位置被完全延迟(无意冒犯)。它使您不得不旋转左手。我几乎从不使用大写锁定,因此我将其交换。然后,我的左手粉红色手指无需任何瑜伽动作即可达到ctrl键。

这些东西对我有用了很多年。我只使用vim,从未使用gvim。


3
+1用于哀叹控制键的位置。IMO的Macbook命令键并没有更好。
三联画

3

这并不是完全平滑的滚动,但这是我在跳转页面时不丢失上下文的处理方式。

设置为7

'scrolloff''so'数字(默认为0)全局
{Vi无此功能}
保持在光标上方和下方的最小屏幕行数。这将使周围的工作环境可见。如果将其设置为非常大的值(999),则光标线将始终位于窗口的中间(文件的开头或结尾或长行换行时除外)。有关水平滚动的信息,请参见“ sidescrolloff”。注意:设置为“兼容”时,此选项设置为0。



1
N <CR-E>
N <CR-Y>

...其中“ N”是您要滚动的单行数。

从字面上看并不流畅,但您可以保留键盘。


0

我刚刚发现这个插件叫做“加速平滑滚动”(“Vim插件,加速平滑滚动(映射<C-D>/<C-U><C-F>/<C-B>)”),它可以例如通过把这个线在.vimrc通过Vundle使用:

Plugin 'yonchu/accelerated-smooth-scroll'

然后通过重新启动Vim并运行:PluginInstall命令,然后再次重新启动Vim并正常使用<C-D>Ctrl+D)和<C-O>Ctrl+O)命令。

可悲的是,这个插件也移动了光标,而不是我想要的:只是像<C-E><C-Y>命令一样滚动屏幕。


0

这结合了许多答案,这就是我所使用的。

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.