在多行上使用Vim的文本对象复制的方法

3
假设我有:
- 'autoindent' is set by default
- 'autoread' is set by default
- 'backspace' defaults to "indent,eol,start"
- 'backupdir' defaults to .,~/.local/share/nvim/backup (|xdg|)
- 'complete' doesn't include "i"
- 'directory' defaults to ~/.local/share/nvim/swap// (|xdg|), auto-created

如何使用可视块将单词 autoindent autoread backspace... 等复制到系统寄存器中?
附注:尝试使用 vim-multiple-cursors 插件,但该插件存在 缺陷(而且不是 Vim 的方式),如果在多光标模式下退出,则无法进行复制粘贴操作。

俄语版中也有很棒的答案


1
我并没有一个非常优雅的解决方案,但通常我会复制整行代码,然后使用宏逐步删除每一行(在这种情况下,宏可能看起来像:^dwxEDj)。从那里开始,块选择就很简单了。 - acushner
1
@acushner 是的,那不是我要找的,但还是谢谢。 - srghma
1
感谢cronfy的回答之一:选择所有匹配文本在Vim中 - srghma
4个回答

6

一种方法

:%norm f'"Zya'

我会將'autoindent' 'autoread' 'backspace' 'backupdir' 'complete' 'directory'放入寄存器z中。

method 1

要使其在 Vim 之外可用,可以执行以下操作:

:let @+ = @z

另一个与之前相同结果但更为复杂的例子(只是为了好玩)

/'\w\{-}' <CR>
"Zca'
<C-r><C-o>"<Esc>
n.n.n.n.n.

method 2

奖励

清空命名寄存器(这里是寄存器 z)的最快方法是:

qzq

这是我见过的第二好的答案,但如果它能像带有多光标的yank一样工作,那就更好了。但如果我必须选择,我会选择那个。 - srghma

1
为了使其工作:
1.清空寄存器 a:在正常模式下键入 `qaq`。
2.在命令行中执行以下操作:
``` :%s/^- '\(\w\+\)'/\=setreg('A',submatch(1),'V')/n ```
3.所需输出已复制到寄存器 a 中,您可以通过在命令行中键入以下内容来获取它:
``` :put A ```

http://superuser.com/questions/818290/select-all-matching-text-in-vim/818607#818607 - srghma
目前我认为最好的解决方案是使用vim-multiple-cursors和这个命令,但它在我的编辑器上无效,但也许它可以在你的编辑器上工作,请回复是否可行。 - srghma
1
看起来你使用的是visual-block,而不是vim-multiple-cursors插件,因为<C-v>{range}j<C-n>ve选择单词的效果很好,只是无法复制到寄存器。 - srghma
你只是复制了别人的帖子,却没有回答vim-multiple-cursors在你的编辑器上是否可用。 - srghma
1
请提供需要翻译的具体内容。 - srghma
显示剩余4条评论

1
一个没有视觉块的解决方案: :let @+='' - 清空系统寄存器 qa - 记录到寄存器 'a' ^3l"kyej - 跳到第四列,将单词复制到寄存器 'k' 并跳到下一行 :let @+=@+ . ' ' . @k - 将系统寄存器、空格和寄存器 'k' 连接起来,并再次存储结果到系统寄存器中 q - 停止记录 5@a - 重复记录的命令 5 次 - 完成 reg + - 显示 "+ autoindent autoread backspace backupdir complete

这是我见过的最好的解决方案,但像其他复杂的解决方案一样,你知道为什么'vim-multiple-cursors'的解决方案不起作用吗?我目前正在与Julio Batista一起尝试找到答案。 - srghma

1

我的 ExtractMatches插件 中有一个 :YankMatches 命令,用于此目的。它类似于内置的 :substitute 命令:

:YankMatches!/'\zs[^']\+\ze'/+

默认情况下,该命令通过换行符分隔元素;如果您想要它们以空格分隔,请使用这个变体:

:YankMatches!/'\zs[^']\+\ze'/& /+

当我尝试使用最后一次搜索来提取上面的文本时,可能出现了错误:首先我使用命令\v'\zs[^']+\ze'进行搜索,然后我尝试使用空格分隔符YankMatches!//& /+进行提取,现在我得到的文本完全没有分隔符autoindentautoreadbackspacebackupdircompletedirectory - srghma
@bjornmelgaard: 很好的观察!那是魔术修饰符(\v)和\zs的一个糟糕交互。当您将前者移动到后者之后时,它可以正常工作:'\zs\v[^']+\ze'(或完全避免使用\v)。我刚刚发布了插件的新版本1.40(也需要ingo-library 1.029),它也处理了这个问题。 - Ingo Karkat
雅虎,顺便说一下,我现在这样使用它,这里我尝试让你的插件 yank(和删除)突出显示的文本,也许我会制作插件(或者你,如果你想,因为我可能会切换到 kakoune,不知道)提供“highlight”(或匹配)文本对象。例如:ym - 复制突出显示的文本,+ym - 到剪贴板,dm - 删除,+dm - ...,yM - 复制除此之外的全部,dM - 删除除此之外的全部=)你认为呢? - srghma
@bjornmelgaard: 感谢分享。如果要插入单个高亮匹配项,您可以使用“ygn”; 我认为没有必要插入_所有_匹配项,因为通常会有很多重复,对吧? - Ingo Karkat

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