有没有办法在可视模式下切换相对数字设置,并且只针对当前 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>

这在普通模式下有效,但有两个问题:

  1. 当我进入可视模式并按 F2 切换相关行号时,选择丢失,我回到了普通模式。

  2. 在普通模式下,尽管使用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>

您的功能也需要注意。按原样,它做了两件事:

  1. 禁用时启用&number
  2. 切换 &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