如何获得视觉上的vimscript选择?


11

如果在插入vimrc之前要测试几行vimscript,是否可以直观地进行选择,然后提供它们?

我努力了

  • 进行视觉选择v,然后进行动作进行选择等,然后
  • :'<,'>so

但是vim给出了一个错误

不允许范围

:'<,'>w | so

采用 !写部分缓冲区

如何获得视觉选择的vimscript?

Answers:


11

在命令行上单击,<C-u>然后键入@*并输入。

<C-u>'<,'>如果在视觉上选择了某些文本,将删除自动插入的视觉范围。

:@*将执行*寄存器的内容,其中包含当前在视觉上选择的内容。

即使已选择/突出显示的文本在您的网络浏览器中(firefox,chrome,...)也可以使用,但该*寄存器将允许您直接在vim中对其进行访问。


如果在vim缓冲区中选择了文本,另一种解决方案是将其复制到命名寄存器中,例如通过键入来复制a寄存器"ay

然后,在命令行上键入:,<C-r>a然后输入。
Ctrl+ r将给您以字符表示的提示"(有关更多信息,请阅读:h c_Ctrl-r)。
在此新提示下,如果您提供寄存器的名称,它将在命令行中插入其内容,您可以在执行之前对其进行编辑。


此外,如果您在未指定寄存器的情况下复制了一些文本,则可以从未命名的寄存器中访问

因此,假设您在文件中有一行vimscript并希望快速获取它,您可以使用复制它Y,然后使用:在命令行中:<C-r>"输入它并输入。

最后,如果使用最后一种解决方案,那么您必须意识到一个问题。
如果您在这样的命令行上看到一个奇怪的字符^M,那就是脱字符号回车。您应该删除它,否则您可能会得到一个错误。

总之,您:

  1. 复制您的vimscript行 Y
  2. 切换到命令模式 :
  3. 击中 <C-r>进入注册提示
  4. 类型 "以调用未命名的寄存器
  5. 按退格键删除^M字符
  6. 然后按回车。

1
甜!:D效果很好-以前我从未遇到过@*,谢谢!
the_velour_fog

很高兴它对您有所帮助。我已经编辑了答案以提出另一种解决方案。
saginaw

1
不错,我也尝试过使用: <C-r>a 它的建议, 但实际上也很好:)我猜vim ^M在行返回时读了s-并将每个命令作为自己的单独行/命令执行?
the_velour_fog

老实说,这是一个很好的问题,我不知道。通常,如果我不删除此字符,则会出错。我很高兴它为您提供了没有错误的服务。也许对此主题有更多了解的人会向我们解释vim如何对待这种特殊字符。
saginaw

2

我实际上做的有点不同,我只是在vimrc中进行编辑,并在每次编写时重新获得它。(我有一组级联的vimrc文件,因此可以更改其中的任何一个。)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif

2

与我的其他答案相比,更直接地针对该问题,您可以定义一个这样的映射(nnoremap不选择,仅执行当前行;vnoremap当可视模式处于活动状态时):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

在这两种情况下,“当前行”都是:executed,因此在可视版本中,:execute通过可视选择逐行显示。

如另一个答案所述,在键入<C-u>时,delete删除在命令行中弹出的范围说明:。这些|字符需要转义,因为否则它们将被解释为vnoremap命令。

这也可以转换为摆脱一些逃生体操的功能,但对我而言,这似乎并不是一个巨大的胜利。call根据[nv]映射模式,基本上是将vnoremap扩展为多行并以一定范围进行编辑。


哦,可视模式映射会执行整行,因此如果您是块或字符方式,它将忽略行内的起点和终点。
dash-tom-bang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.