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

时间:2010-10-31 19:12:02

标签: vim scroll smooth-scrolling

Vim中的主要滚动命令是:

  1. Ctrl - B Ctrl - F ,以及 PageUp PageDown 滚动整页
  2. Ctrl - U Ctrl - D 默认滚动半页
  3. Ctrl - Y Ctrl - E 滚动一行
  4. 每次前两次都失去了视觉上下文,所以我养成了打击后者的坏习惯( Ctrl - Y Ctrl - E )重复。

    由于目前没有第一方支持平滑滚动,最不受欢迎的变通办法/插件是什么?

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

12 个答案:

答案 0 :(得分:32)

更新:我现在推动了这段代码,根据:help write-plugin的指导原则对Github repo进行了一些重构。

使用键盘

以下是我.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

特点:

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

注意:所有复制和粘贴的人都记得^字符表示控制字符;复制粘贴会产生无效结果,必须手动输入!

  • ^Y - CTRL - V 然后 CTRL - Y
  • ^E - CTRL - V 然后 CTRL - E

但是,<C-U><Enter>样式语法按字面输入为那些字符; map命令会智能地将它们转换为控制字符。

使用鼠标

问题提到用鼠标滚动在GVim中运行良好,但需要键盘解决方案。这对我来说,如果它在常规终端Vim中工作,那么提问者可能对鼠标解决方案感兴趣。

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

this question的基础上,似乎有些人除了简单地打开鼠标之外还需要做一些手动设置(我只是使用set mouse=n):


我的.vimrc有以下几行

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

答案 1 :(得分:9)

vim的tips.txt中有一个简单的重映射黑客:

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>

答案 2 :(得分:6)

最新插件

我发布了类似here的内容,但基本上有一个很棒的插件,我们现在可以用它来滚动,称为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> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>

答案 3 :(得分:4)

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

答案 4 :(得分:3)

这不是完全平滑的滚动,但它是我在跳页时不会丢失上下文的方法。

设置so = 7

'scrolloff''so'号码(默认为0)                         全球
                        {Vi in Vi}
        保持光标上方和下方的最小屏幕行数。         这将使您可以在工作的地方看到一些上下文。如果         你将它设置为一个非常大的值(999),光标线将永远是         在窗口中间(文件的开头或结尾除外)         当长线包裹时)。         要水平滚动,请参阅'sidescrolloff'。         注意:设置“兼容”时,此选项设置为0.

答案 5 :(得分:3)

我所做的是将键盘重复设置为非常快,大约120个字符/秒,延迟很小。 然后我映射到4j和4k 我使用j和k上下导航源代码,它可以上下移动光标,非常快速,非常流畅。 但这是好的部分,这适用于Linux,而不是Windows。 多年来,X11的键盘输入工作方式使得当你按住j时显然会开始输出j个字符。但是当你继续按住j然后再按下ctrl键时,X11开始输出c-j字符而不必重新按下j键。然后当你放开ctrl键并仍然按下j时,X11继续再次放入j。 所以j让光标开始向下移动很好并且平滑,你可以定期点击ctrl而不放弃j来给它一个提升,一个震动。

另外,我做了Devin所做的事情,并将scrolloffset设置为5。

最后,我交换了ctrl和cap lock。 ctrl键的默认位置是完全延迟的(没有违法行为)。它让你必须旋转你的左手。我几乎从不使用大写锁定,所以我交换它们。然后我的左手粉红色手指可以在没有任何瑜伽动作的情况下到达ctrl键。

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

答案 6 :(得分:2)

插件cskeeters/vim-smooth-scroll支持平滑滚动,无需配置。它支持使用ztzzzb支持平滑滚动。它是terryma's plugin的分支。一些公开拉取请求已被应用。

答案 7 :(得分:1)

这对于铁杆用户来说可能是有争议的,但是……在 Vim 中平滑滚动的最佳方式是……鼠标滚轮。

答案 8 :(得分:0)

我刚刚发现this plugin名为&#34;加速平滑滚动&#34; (&#34;用于加速平滑滚动的Vim插件(映射到<C-D>/<C-U><C-F>/<C-B>)&#34;),例如可以通过将此行放在.vimrc中来通过Vundle使用:

Plugin 'yonchu/accelerated-smooth-scroll'

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

可悲的是,这个插件还会移动光标而不是我想要的:只需像 <C-E> <C-Y> 那样滚动屏幕

答案 9 :(得分:0)

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

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

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

答案 10 :(得分: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)

答案 11 :(得分:0)

我稍微修改了@Keith Pinson 的代码,以便 ctrl-f 和 ctrl-b 也可以映射:

function SmoothScroll(scroll_direction, n_scroll)
    let n_scroll = a:n_scroll
    if a:scroll_direction == 1
        let scrollaction=""
    else 
        let scrollaction=""
    endif
    exec "normal " . scrollaction
    redraw
    let counter=1
    while counter<&scroll*n_scroll
        let counter+=1
        sleep 10m " ms per line
        redraw
        exec "normal " . scrollaction
    endwhile
endfunction

" smoothly scroll the screen for some scrolling operations
nnoremap <C-U> :call SmoothScroll(1,1)<cr>
nnoremap <C-D> :call SmoothScroll(2,1)<cr>
nnoremap <C-B> :call SmoothScroll(1,2)<cr>
nnoremap <C-F> :call SmoothScroll(2,2)<cr>