Vim中的主要滚动命令是:
每次前两次都失去了视觉上下文,所以我养成了打击后者的坏习惯( Ctrl - Y 和 Ctrl - E )重复。
由于目前没有第一方支持平滑滚动,最不受欢迎的变通办法/插件是什么?
我根据任务使用Vim和GVim,如果没有一个真正适合两者的黑客,我很乐意单独定制它们。鼠标滚轮在GVim中运行良好,但我正在寻找基于键盘的解决方案。
答案 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
特点:
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支持平滑滚动,无需配置。它支持使用zt
,zz
和zb
支持平滑滚动。它是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>