我已经在Vim8.1和Neovim (nvr 2.1.10)中尝试了这一点,并使用和不使用我的~/.vimrc (后者检查vimrc条目是否具有因果关系-没有效果)。
给出这个例子
apple
banana
carrot
dates
我可以记录一个宏(@a)
yy
p
粘贴或粘贴(即复制)一行当我将(@a)宏应用于单个行,并在单个行上重复该宏(@@)时,它会复制该行。
但是,当我可视化地选择这些行并尝试应用宏时,尝试以下任何一个
:'<,>'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
等等,宏在所选文本中重复(每一行一次)第一个行:
apple
apple
apple
apple
apple
banana
carrot
dates
有什么问题吗?
发布于 2019-07-22 15:22:42
您之所以看到这个问题,是因为范围处理ex命令的方式。
当您指定范围时,该范围将在任何操作发生之前被计算为行号。在这种情况下,'<
被计算为1,而'>
被计算为4,因为这些都是行操作。当您第一次在第1行上运行宏时,将创建一个带有"apple“的新行。当宏在第2行上运行时,该行包含"apple",因此该单词被复制,依此类推。在执行命令时,将使用该行上的任何内容。如果您使用%
(针对所有行)或2,4
来选择“香蕉”或下面的内容,您可以看到相同的行为。
但是,POSIX为:g
命令指定了不同的行为:
全局命令和v命令在逻辑上是两次操作。首先,在不包括终止行(全局)或不匹配(v或全局!)的指定行内标记行。指定的模式。其次,执行命令提供的ex命令,将当前行( '.‘)设置为每一行标记行。
这就是为什么:g/^/norm yyp
在这里工作的原因:因为要修改的行在执行之前是标记的,而且只有标记的行才执行命令。不考虑在事实之后插入的行。正如您所提到的,:g
确实接受范围,因此您可以将操作限制在想要处理的一组行上。
https://stackoverflow.com/questions/57154361
复制相似问题