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

And*_*ner 70 vim scroll smooth-scrolling

Vim中的主要滚动命令是:

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

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

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

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

Kei*_*son 34

更新:我现在已将此代码推: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
Run Code Online (Sandbox Code Playgroud)

特征:

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

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

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

然而,<C-U><Enter>风格的语法被原样输入那些字符; map命令会智能地将它们转换为控制字符.

使用鼠标

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

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

但是,在这个问题的基础上,似乎有些人不得不做一些手动设置,而不仅仅是打开鼠标(我只是使用set mouse=n):


.vimrc有以下几行

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>
Run Code Online (Sandbox Code Playgroud)

  • 关于'记住^字符表示控制字符'的小注释:你可以用'let scrollaction ="\ <Cy>"'替换'let scrollaction ="^ Y"',这样你就不必使用<Cv> <Cy>生成键绑定,它可以复制粘贴:) (2认同)

And*_*ner 10

在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>
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`:map <CU> 20 <CY>` (5认同)

小智 8

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


Mic*_*ick 6

一个最近的插件

我在这里发布了类似的东西,但基本上有一个很棒的插件,我们现在可以用来滚动,称为terryma/vim-smooth-scroll.它提供了非常漂亮和流畅的滚动.


安装非常简单:

1我使用Vundle所以我只是在.vimrc.bundles中添加它:

Bundle terryma/vim-smooth-scroll
Run Code Online (Sandbox Code Playgroud)

在2016年4月29日的最新版Vundle中,您可以将它放在.vimrc中:

Plugin 'terryma/vim-smooth-scroll'
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)