如何将选定的文本作为 Vim 命令执行

34
当我写文档时,我会采用一种适合该文档的组织约定,并希望Vim能够语法高亮显示它。但是制作一个ftplugin过于"全局性”,我希望语法着色能随文档而来,这样如果我在没有插件的地方发送它,他们仍然可以获得着色效果。我发现通过模型行无法实现,因为模型行只接受选项。
现在我正在尝试找出一种方法,在可视模式下选择一些文本(或其他模式),并将其执行为一系列Vim命令。
例如,在一个文档的底部,我有:
vim highlighting:
    syn match Comment "^>.*$"

我该怎么选择文本并说“干就完了,执行它”,而不必重新输入它?


很好的问题 -- 我一直希望可以启用扩展模型行来实现各种自定义匹配和类似的东西。以前需要编写临时的 ftplugins 来实现。 - mike3996
3个回答

54

你可以选择行,复制选中的内容并执行它。

:@"

2
请参见此答案[https://dev59.com/YW865IYBdhLWcg3wFqdV#3997110 ],以获取更多有关如何使用寄存器的见解。 - Benoit
3
顺便说一下,这适用于任何寄存器。你可以使用"ayy将整行复制到寄存器a中,然后使用@a来运行它。请注意,如果您运行缩进的行,将会得到一堆空格,这可能会捣乱(它会在正常模式下移动您)。最好使用可视模式v选择命令。 - naught101
2
我有 nnoremap <leader>2 :@"<CR> 并且我经常使用它。(助记符是 Shift-2=@=执行。) - Brady Trainor
+1,但请注意,如果使用“\”续行符号将命令分行书写,则此方法无效(请参阅:help line-continuation)。 - Codie CodeMonkey

4
我喜欢创建这个映射,它需要你先进行可视选择,不会覆盖你的未命名寄存器:
vmap <space> "xy:@x<CR>

如果你喜欢使用行延续方式编写Vim命令:
vmap <space> :w! /tmp/x.vim<CR>:so /tmp/x.vim<CR>

1

我基于lh-vim-lib定义了几个映射,它们不涉及任何寄存器。 虽然这确实是一个过度解决方案,但对于映射来说是一个整洁的解决方案--因为它永远不会修改默认寄存器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接