vim自动滚屏-让光标行保持位置

本文介绍了一个改进的Vim滚屏插件,使光标与窗口底部保持30%的距离,同时解决了滚屏时可能出现的行末多余空白字符问题。提供了F2键一键清除空白符和保存键中集成空白符移除功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插件地址

function! MyAutoScroll()
let s:SusLines=winheight(winnr()) * 0.3 
if winheight(winnr())-winline()>=s:SusLines
return
else
let thisline=winline()
let inbetween=winheight(winnr())-thisline
while inbetween <= s:SusLines
exec "normal! \<c-e>"
let inbetween=inbetween+1
endwhile
endif                                                                                                    
endfunction

autocmd! CursorMoved,CursorMovedI * call MyAutoScroll()

这是通常的滚屏代码, 仅有一点改进。
let s:SusLines=winheight(winnr()) * 0.3,让光标所在行与窗口底部保持30%(当前窗口行数的30%)。

但是这个代码有个很头疼的问题,就是由于vim的原因(回退到命令模式时,光标会前进一个字符),那么在我们滚屏时,如果有tab或空格,就会导致有些行末多出一个空白字符(空格或TAB, 一般是TAB)。

那么解决这个问题方法是使用vim中的字符串替换:

nnoremap <silent> <F2> :%s/\s\+$//<CR>

按F2就可以删除当前文件中所有的行末空白字符。

但是对我来说,按F2也挺麻烦的。
就把它放到我的保存键中了,原本S键只映射为:w

function RemoveSpace()
try
    exec "%s/\\s\\+$//"
catch
    echo "No space!"
endtry
endfunction

map <silent> S :call RemoveSpace()<CR>:w<CR> 

注意不要简单地

map <silent> S :%s/\s\+$//<CR>:w<CR> 

因为字符串替换时,如果文件所有行末都没有空白字符的话,会抛出异常。导致后面的保存(:w)无法执行。
所以必须捕获异常。

本来是想把删除行末空白符的命令放到滚屏函数中的,既然每次滚屏时,可能多出空白符,那么就删掉就好了。
但是这个思路出现一些问题,如果是全局替换的话,替换后光标会跳转到行末有空白符的那行,而不在当前行了,而且会把新一行正常缩进的TAB也删掉。局部替换的话,不太好把握范围。
但是每次保存时去除所有行尾空白符,也是比较合适的。所以先这样吧。

大家看效果的话,可以用下面的,来显示行尾空白符。

highlight WhitespaceEOL ctermfg=red ctermbg=red
match WhitespaceEOL /\s\+$/

设置 set virtualedit=onemore,不会出现上面滚屏代码让某行多出空白符,某行少了tab这种情况。(光标可以移到行末的后一个字符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值