vi/Vim:如何滚动窗口高度的三分之一

tuwxkamq  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(102)

据我所知,ctrl-dctrl-u根据scroll选项中设置的行数滚动窗口,默认为窗口高度的一半。可以将其更改为滚动窗口高度的三分之一吗?

5lhxktic

5lhxktic1#

scroll的默认值是动态的-在一个窗口中可以是12,在另一个窗口中可以是21-但比例50%是硬编码的。AFAIK,用于动态计算scroll的比例不能修改。
你可以很容易地改变scroll的值,如下所示:

execute "set scroll=" . winheight('.') / 3

现在,您必须找到如何、何时以及在何处使用该片段。一个autocmd似乎是一个很好的选择,但我们应该使用什么事件?WinEnter / WinLeaveCursorMove?还有别的吗?
也许是一个简单的Map,覆盖默认值?例如:

nnoremap <C-d> :execute "normal! " . winheight('.') / 3 . "^D"<CR>
" type <C-v> then <C-d> to produce ^D
kulphzqa

kulphzqa2#

使用ex命令。它使用变量lines来显示窗口中显示了多少行,并计算第三行。

:execute "set scroll=" .&lines / 3

EDIT:当窗口调整大小时,滚动值不会改变,所以在vimrc中添加以下自动命令来修复它:

:au VimResized * execute "set scroll=" . &lines / 3
e4eetjau

e4eetjau3#

解决方案是将scroll的值设置为~/.vimrc中窗口高度的三分之一。但是,使用set scroll=<value>这样做的问题是scroll的值被重置为0,即当当前窗口大小发生变化时,例如,当使用:h <topic>访问内置帮助或使用q/浏览搜索历史记录时,将窗口高度设置为窗口高度的一半。请参阅:h scroll了解更多详细信息。
要在所有窗口中以及所有窗口大小更改后保留scroll设置,您可以将此vimscript代码添加到~/.vimrc

set scroll=float2nr(winheight('.') / 3)
function! PreserveScroll(timer)
  set scroll=float2nr(winheight('.') / 3)
endfunction
augroup vimrc-preserve-scroll
  autocmd!
  autocmd VimResized * set scroll=float2nr(winheight('.') / 3)
  autocmd WinEnter   * set scroll=float2nr(winheight('.') / 3)
  autocmd WinLeave   * call timer_start(300, "PreserveScroll", {"repeat": 3})
augroup END

显然,设置一个计时器并不是最好的解决方案,但不幸的是,我没有看到更好的方法来让所需的set scroll=<value>在返回到一个窗口时执行,例如在关闭帮助窗口后。
下面是同一vimscript代码的一个稍微改进的版本,在这个意义上,将scroll值的计算和赋值保持在一个地方:

function! PreserveScroll(timer = v:null)
  set scroll=float2nr(winheight('.') / 3)
endfunction
augroup vimrc-preserve-scroll
  autocmd!
  autocmd VimResized * call PreserveScroll() 
  autocmd WinEnter   * call PreserveScroll()
  autocmd WinLeave   * call timer_start(300, "PreserveScroll", {"repeat": 3})
augroup END
call PreserveScroll()

这个版本的代码可能比原始版本的效率低了一点点,因为它不可避免地消耗了一些额外的CPU周期,但这是一个完全可以接受的权衡,因为没有重复的代码。
我在~/.vimrc中使用了vimscript代码的改进版本,但修改后将scroll的值设置为窗口的一个完整高度。

相关问题