据我了解,
ctrl-d
和ctrl-u
按照scroll
选项所设置的行数滚动窗口,默认情况下为窗口高度的一半。是否可以将其更改为滚动窗口高度的三分之一?ctrl-d
和ctrl-u
按照scroll
选项所设置的行数滚动窗口,默认情况下为窗口高度的一半。是否可以将其更改为滚动窗口高度的三分之一?12
,在另一个窗口中可能是21
,但比例50%
是硬编码的。据我所知,用于动态计算scroll
的该比例无法修改。
您可以通过类似以下代码轻松更改scroll
的值:
execute "set scroll=" . winheight('.') / 3
autocmd
是一个不错的选择,但我们应该使用什么事件呢?WinEnter
/WinLeave
?CursorMove
?还是其他事件?nnoremap <C-d> :execute "normal! " . winheight('.') / 3 . "^D"<CR>
" type <C-v> then <C-d> to produce ^D
^U
不起作用,它会在我的命令行中产生一个:"
。 - Bananach^U
无法工作,它在我的命令行中产生了一个:"
。 - mroavivim.api.nvim_set_keymap('n', '<C-d>', vim.api.nvim_replace_termcodes([[(winheight(0)/3).'<C-d>']], true, false, false), {noremap = true, expr = true, desc = '跳转到窗口高度的三分之一处'})
https://github.com/alxndr/dotfiles/blob/1e15f771a9/nvim/lua/mappings.lua#L80 - alxndr使用以下ex命令。它使用变量lines
来显示窗口中显示了多少行,并计算第三行。
:execute "set scroll=" .&lines / 3
编辑: 当窗口大小改变时,滚动值不会改变,因此请在您的vimrc
中添加以下自动命令来修复它:
:au VimResized * execute "set scroll=" . &lines / 3
~/.vimrc
中正确设置scroll
值。然而,使用set scroll=n
的问题是,每当当前窗口大小发生变化时,例如使用:h scroll
打开内置帮助或使用q/
浏览搜索历史时,该值会被重置为0
。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
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 循环,但这是完全可以接受的。:)