首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在选定的行上应用yank粘贴宏的Vim问题

在选定的行上应用yank粘贴宏的Vim问题
EN

Stack Overflow用户
提问于 2019-07-22 22:10:01
回答 1查看 158关注 0票数 2

我已经在Vim8.1和Neovim (nvr 2.1.10)中尝试了这一点,并使用和不使用我的~/.vimrc (后者检查vimrc条目是否具有因果关系-没有效果)。

给出这个例子

代码语言:javascript
运行
复制
apple
banana
carrot
dates

我可以记录一个宏(@a)

代码语言:javascript
运行
复制
yy
p

粘贴或粘贴(即复制)一行当我将(@a)宏应用于单个行,并在单个行上重复该宏(@@)时,它会复制该行。

但是,当我可视化地选择这些行并尝试应用宏时,尝试以下任何一个

代码语言:javascript
运行
复制
:'<,>'norm @a    ## :'<,>'norm @a on single line works
:'<,>'normal @a
:'<,>'norm! @a

:'<,>':norm @a
:'<,>':normal @a
:'<,>':norm! @a

:1,4norm! @a    ## https://stackoverflow.com/a/390194/1904943

等等,宏在所选文本中重复(每一行一次)第一个行:

代码语言:javascript
运行
复制
apple
apple
apple
apple
apple
banana
carrot
dates

有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 23:22:42

您之所以看到这个问题,是因为范围处理ex命令的方式。

当您指定范围时,该范围将在任何操作发生之前被计算为行号。在这种情况下,'<被计算为1,而'>被计算为4,因为这些都是行操作。当您第一次在第1行上运行宏时,将创建一个带有"apple“的新行。当宏在第2行上运行时,该行包含"apple",因此该单词被复制,依此类推。在执行命令时,将使用该行上的任何内容。如果您使用% (针对所有行)或2,4来选择“香蕉”或下面的内容,您可以看到相同的行为。

但是,POSIX为:g命令指定了不同的行为:

全局命令和v命令在逻辑上是两次操作。首先,在不包括终止行(全局)或不匹配(v或全局!)的指定行内标记行。指定的模式。其次,执行命令提供的ex命令,将当前行( '.‘)设置为每一行标记行。

这就是为什么:g/^/norm yyp在这里工作的原因:因为要修改的行在执行之前是标记的,而且只有标记的行才执行命令。不考虑在事实之后插入的行。正如您所提到的,:g确实接受范围,因此您可以将操作限制在想要处理的一组行上。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57154361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档