我试图通过按F2键来切换相对行号。我的.vimrc
文件中有以下内容。
" toggle relative line numbers
function! RelativeNumberToggle()
if (&number == 0)
set number
elseif (&relativenumber == 1)
setlocal norelativenumber
else
setlocal relativenumber
endif
endfunction
noremap <silent> <F2> :call RelativeNumberToggle()<CR>
这在正常模式下工作,但有两个问题:
正常模式下的
setlocal
仅切换当前窗口的相对数字设置,但所有窗口的相对数字设置都是切换的。。
是否有一种方法在视觉模式下切换相对数字设置,并且仅用于当前窗口?
应该指出的是,我还尝试使用ModeChanged
事件激活/取消相对行号,以便在输入视觉模式时启用相对行号,在编辑器离开可视化模式时启用相对行号。当进入视觉模式时激活相对行号是很容易的,ModeChanged *:[vV\x16]
做这项工作。问题是在编辑器退出视觉模式时禁用相对行号,因为编辑器加载了特殊情况:例如,在单击或删除文本之后,编辑器切换到正常模式,但ModeChanged [vV\x16]:*
和ModeChanged *:n
事件不会触发--因此不会禁用相对行号。我可以使用TextYankPost
事件来修复这个问题。但是,在用=
或>
格式化可视选择后,编辑器也会下降到正常模式,相对行号也不会被禁用。我不知道如何解决最后一个特例。
发布于 2021-12-21 01:16:31
如果Vim是最近的(8.2.1978及更高版本),则可以使用<Cmd>
在映射中执行Ex命令,而不必真正离开当前模式:
noremap <silent> <F2> <Cmd>call RelativeNumberToggle()<CR>
你的功能也需要注意。实际上,它做了两件事:
当禁用&relativenumber
.时,
&number
,第一件事可以简化为:
set number
因为当选项已经启用时,启用它基本上没有任何作用。
第二件事也可以简化,因为布尔选项已经有一个切换机制,不需要检查当前值:
setlocal relativenumber!
或者:
setlocal invrelativenumber
这意味着您不再需要该功能了,因为您可以使用更少的样板来实现完全相同的功能:
noremap <silent> <F2> <Cmd>set number <bar> setlocal relativenumber!<CR>
参考资料:
:help :map-cmd
:help :set-!
:help map-bar
https://stackoverflow.com/questions/70432184
复制相似问题