81

Vim 中的主要滚动命令是:

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

我每次都失去前两者的视觉背景,所以我养成了反复 击打后者( Ctrl-YCtrl- )的坏习惯。E

由于目前没有第一方支持平滑滚动,最不令人反感的解决方法/插件是什么?

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

4

12 回答 12

39

更新:我现在已经将这段代码推: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

特征:

  • scroll在 Vim选项的底部滚动。
  • 可自定义的滚动速度(调整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>

于 2012-08-30T17:04:49.117 回答
11

vim 的tips.txt 中有一个简单的重映射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>
于 2010-10-31T19:16:38.087 回答
8

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

于 2013-04-05T07:39:20.200 回答
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 个参数:距离持续时间速度

我在我的.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>
于 2013-05-26T05:42:34.167 回答
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。

于 2010-12-01T03:27:49.923 回答
3

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

设置为=7

'scrolloff' 'so' 数值型 (缺省为 0) 全局
{Vi 无此功能}
保持在光标上方和下方的最小屏幕行数。这将使一些上下文在您工作的地方可见。如果将其设置为一个非常大的值 (999),则光标行将始终位于窗口的中间(文件开头或结尾处或长行换行时除外)。对于水平滚动,请参见“sidescrolloff”。注意:当设置“兼容”时,此选项设置为 0。

于 2010-11-01T02:38:14.997 回答
3

插件cskeeters/vim-smooth-scroll支持平滑滚动,无需配置。它支持使用 、 和 支持zt平滑zz滚动zb。这是 terryma 插件的一个分支。一些开放的拉取请求已被应用。

于 2016-12-21T16:33:53.197 回答
2

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

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
于 2020-07-10T02:11:14.480 回答
1

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

于 2021-03-25T11:53:36.650 回答
1
N <CR-E>
N <CR-Y>

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

字面意义上的不流畅,但你保留了键盘。

于 2019-12-07T21:19:59.560 回答
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>
于 2021-04-16T22:55:27.803 回答
0

我刚刚发现了这个名为“accelerated-smooth-scroll”的插件(“Vim 加速平滑滚动插件(映射到<C-D>/<C-U>, <C-F>/<C-B>)”),例如可以通过 Vundle 使用,将这一行放在你的 .vimrc 中:

Plugin 'yonchu/accelerated-smooth-scroll'

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

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

于 2016-04-29T18:21:50.387 回答