有没有办法在可视模式下切换相对数字设置,并且只针对当前 window?
Is there a way to toggle the relative number setting in Visual mode and only for the current window?
我正在尝试通过按 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>
这在普通模式下有效,但有两个问题:
当我进入可视模式并按 F2 切换相关行号时,选择丢失,我回到了普通模式。
在普通模式下,尽管使用setlocal
仅对当前window切换相对编号设置,但对所有windows切换相对编号设置.
有没有办法在可视模式下切换相对数字设置,并且仅适用于当前 window?
我应该提一下,我还尝试使用 ModeChanged
事件 activating/deactivating 相对行号,以便在进入可视模式时启用相对行号,而在编辑器离开可视模式时禁用相对行号。
进入可视模式时激活相对行号很容易,ModeChanged *:[vV\x16]
就可以完成这项工作。问题是当编辑器退出可视模式时禁用相对行号,因为它加载了特殊情况:例如,在提取或删除文本后,编辑器切换到普通模式,但 ModeChanged [vV\x16]:*
和 ModeChanged *:n
不会触发事件——因此不会禁用相关行号。我可以使用 TextYankPost
事件来解决这个问题。但是,在使用 =
或 >
格式化视觉选择后,编辑器也会降到普通模式并且相关行号不会被禁用。我不知道如何解决最后一个特殊情况。
如果您的 Vim 足够新(8.2.1978 及更高版本),您可以使用 <Cmd>
在映射中执行 Ex 命令而无需真正离开当前模式:
noremap <silent> <F2> <Cmd>call RelativeNumberToggle()<CR>
您的功能也需要注意。按原样,它做了两件事:
- 禁用时启用
&number
,
- 切换
&relativenumber
.
第一件事可以简化为:
set number
因为在一个选项已经启用的情况下启用它实际上什么都不做。
第二件事也可以简化,因为已经有一个不需要检查当前值的布尔选项的切换机制:
setlocal relativenumber!
或:
setlocal invrelativenumber
这意味着您不再真正需要该功能,因为您可以使用更少的样板文件获得完全相同的功能:
noremap <silent> <F2> <Cmd>set number <bar> setlocal relativenumber!<CR>
参考:
:help :map-cmd
:help :set-!
:help map-bar
我正在尝试通过按 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>
这在普通模式下有效,但有两个问题:
当我进入可视模式并按 F2 切换相关行号时,选择丢失,我回到了普通模式。
在普通模式下,尽管使用
setlocal
仅对当前window切换相对编号设置,但对所有windows切换相对编号设置.
有没有办法在可视模式下切换相对数字设置,并且仅适用于当前 window?
我应该提一下,我还尝试使用 ModeChanged
事件 activating/deactivating 相对行号,以便在进入可视模式时启用相对行号,而在编辑器离开可视模式时禁用相对行号。
进入可视模式时激活相对行号很容易,ModeChanged *:[vV\x16]
就可以完成这项工作。问题是当编辑器退出可视模式时禁用相对行号,因为它加载了特殊情况:例如,在提取或删除文本后,编辑器切换到普通模式,但 ModeChanged [vV\x16]:*
和 ModeChanged *:n
不会触发事件——因此不会禁用相关行号。我可以使用 TextYankPost
事件来解决这个问题。但是,在使用 =
或 >
格式化视觉选择后,编辑器也会降到普通模式并且相关行号不会被禁用。我不知道如何解决最后一个特殊情况。
如果您的 Vim 足够新(8.2.1978 及更高版本),您可以使用 <Cmd>
在映射中执行 Ex 命令而无需真正离开当前模式:
noremap <silent> <F2> <Cmd>call RelativeNumberToggle()<CR>
您的功能也需要注意。按原样,它做了两件事:
- 禁用时启用
&number
, - 切换
&relativenumber
.
第一件事可以简化为:
set number
因为在一个选项已经启用的情况下启用它实际上什么都不做。
第二件事也可以简化,因为已经有一个不需要检查当前值的布尔选项的切换机制:
setlocal relativenumber!
或:
setlocal invrelativenumber
这意味着您不再真正需要该功能,因为您可以使用更少的样板文件获得完全相同的功能:
noremap <silent> <F2> <Cmd>set number <bar> setlocal relativenumber!<CR>
参考:
:help :map-cmd
:help :set-!
:help map-bar