在 Vim 中标记选择

Mark selections in Vim

我有时梦想 Vim 中的标记选择功能,就像您键入时一样:

ma

在普通模式下,你可以从任何地方点击:

`a

回到这个地方a。 我希望有这样的东西:

ma

视觉模式下。这将保存您视觉选择的区域。然后你只需在正常模式下的任何地方输入:

<someHeader>a

使用此 a 选择返回可视模式。

Vim有这样的功能吗?或者看起来像的扩展?或者一个简单的实现方法?

我很确定没有任何方法可以像引用标记或寄存器那样命名选择。

我能想到的最接近的功能是 gv 命令,它进入可视化模式,last 先前选择的块已经重新选择。我发现这比必须多次手动重新选择同一文本块要方便得多。


应该可以使用 Vimscript 编写一个函数,将可视块的开始和结束保存为可以重新用于重新选择可视块的标记。我看了一下是否可以使用 Vimscript 将 <> 标记保存为其他(不太短暂的)标记,但我没有看到任何东西。

我已经写了这个,我相信这就是你想要的:

function! VisualMark()
  call inputsave()
  let registers = input("m")
  call inputrestore()
  exec "normal! `<m" . registers[0]
  exec "normal! `>m" . registers[1]
endfun

function! GetVisualMark()
  call inputsave()
  let registers = input("`")
  call inputrestore()
  exec "normal! `" . registers[0]
  if strlen(registers) > 1
    exec "normal! v`" . registers[1]
  endif
endfun

vnoremap m <esc>:call VisualMark()<cr>
nnoremap ` :call GetVisualMark()<cr>

除了在可视模式下,它们的行为应该与常规标记相同,并且它们都需要两个参数。

首先,要保存可视化 selected 区域,在带有方块 selected 的可视化模式下,像往常一样按 m 键。然后它会让你输入更多的文本……这里的函数需要 2 个字符,这是两个寄存器,开始和结束标记将被保存到……所以例如在可视模式下输入 mab 然后按回车(我想不出一种方法让它在没有输入的情况下工作),会在寄存器 a 中为块的开头创建一个标记,而 b 将是块的结尾。

要在视觉上重新select 块,进入视觉模式并执行与常规标​​记相同的 `...这也需要两个字符

编辑:

我认为我已经改进了实施。在我拥有它之前,为了带回可视化 selected 块,您必须处于可视化模式,然后点击反引号(与用于普通标记的按钮相同)按钮,然后点击 2 个寄存器。现在你在正常模式下做......这意味着默认使用反引号现在使用这个函数,但是这个函数现在检查你提供了多少个寄存器......所以如果你只使用一个寄存器,它只会带你回到那个。如果您提供 2 个寄存器,那么它会在视觉上 select 它们...如果您提供超过 2 个,它将只使用前 2 个。

虽然输入 selection 仍然需要回车键。无论如何,使用新的实现方式可能会更好。

对于那些想要查看或使用旧实现的人来说,就是这样:

function! VisualMark()
  call inputsave()
  let registers = input("m")
  call inputrestore()
  exec "normal! `<m" . registers[0]
  exec "normal! `>m" . registers[1]
endfun

function! GetVisualMark()
  call inputsave()
  let registers = input("`")
  call inputrestore()
  exec "normal! `" . registers[0]
  exec "normal! v`" . registers[1]
endfun

vnoremap m <esc>:call VisualMark()<cr>
vnoremap ` <esc>:call GetVisualMark()<cr>

这是 的解决方案,以及我需要的一些修改,以使视觉标记不会覆盖常规寄存器。

https://github.com/iago-lito/vim-visualMarks

它是一个小型 vimScript,允许在 visual 模式下通过键入来标记视觉选择区域:

ma

(标记a

然后在正常模式下通过在任何地方输入:

<a

它仍然需要一些基本的改进,但现在任何人都可以尝试、改进和分享。感谢 Steven 启动了这个过程:)