0

我正在整理我的 vimrc。

任务:
- 复制单引号内的内容(最好在斜线之后)
- 将它们粘贴到第 1 行下方

1: Name:
2: 
3: Bundle 'tpope/vim-rails'
4: Bundle 'tpope/vim-endwise'
5: Bundle 'mileszs/ack.vim'
6: Bundle 'scrooloose/nerdcommenter'
7: Bundle 'kana/vim-textobj-entire'
8: Bundle 'kana/vim-textobj-user'

我知道

:{source_address}t{target_address}

Ex 命令,我知道它接受模式。但是,我仍然无法做到恰到好处。我对正则表达式也很陌生,所以请耐心等待。我尝试了一些类似的东西(在视觉选择上

:'<,'>/\/.*\'t1

我尝试匹配以下模式的地方:

  • 以 / 开头
  • 中间可能包含东西。*
  • 以 ' 结尾

显然,我在某种程度上偏离了。有任何想法吗?

4

4 回答 4

2

:t复制整行,而不是matchstr

要实现你想要的,你需要matchstr()功能。

这条线将做类似的事情,但顺序相反。希望你没问题:

:'<,'>g/\/.*'/call append(1,matchstr(getline('.'),@/))

例如,如果我只选择前两个“Bundle”行,然后执行 cmd,我会得到:

1: Name:
/vim-endwise'
/vim-rails'
2: 
3: Bundle 'tpope/vim-rails'
4: Bundle 'tpope/vim-endwise'
.... (other lines)

你看到顺序是相反的。

要保持订单,您可以选择:

  • 用列表编写脚本
  • 选择那些“反转”的行,然后做'<,'>g/.*/m1
  • 将 matchstr 分配给 reg x,并且2put! x
于 2013-12-11T10:26:57.447 回答
2
  1. 拉动方块。
  2. 把它放在你想要的地方。
  3. 删除你不想要的。

假设光标位于第 1 行的某处:

:3,8t.
:'[,norm dt/$x

解释:

  • '[']标记最新更改的开始和结束。
  • 我们希望范围从第一Bundle行开始,所以我们从'[标记开始。我们可以简单地使用2,但这不那么“神奇”。
  • 它以我们可以省略的当前行结束,因为它是默认值。
  • 我们使用:normal从命令行执行正常模式命令。
  • 我们删除直到第一个/( dt/) 并删除行上的最后一个字符 ($x)一次。

另一种方式:

:3,8t.
v'[
:'<,'>s/.*\/\(.*\)'/\1 ('<,'> being inserted automatically)
于 2013-12-11T10:55:40.107 回答
0

你正在做的问题是 ex 命令在行上工作,而不是像你想的那样在行的一部分上工作。您不能:t像那样直接使用命令来复制您需要的内容。

可能有一种方法可以完全按照您的想法进行操作,但我会这样做来完成您想要的操作:复制所有第 3-8 行,将它们粘贴到第 1 行下方,然后隔离您感兴趣的文本。

有很多方法可以复制一系列行。如果您需要帮助,请发表评论并询问。

现在我们如何隔离斜线后引号中的部分?我们可以使用与您编写的基本相同的模式进行替换:

:'<,'>s/.*\/\(.*\)'/\1
于 2013-12-11T10:17:55.367 回答
0

/命令(与大多数 Ex 命令一样)总是复制:t,而不是其中的一部分。为此,您需要, 并在其替换表达式中使用副作用将它们收集到一个寄存器中。将搜索结果复制到剪贴板Vim Tips Wiki 页面解释了这一点。:copy:substitute

不过,使用我的ExtractMatches 插件,这很容易做到:

:3,$YankMatchesToReg#/\zs.*\ze'#
:1put

这使用/.*'模式,并限制匹配(使用\zs\ze原子)以排除前导斜杠和尾随引号。

如果没有插件,复制整行然后用 修剪不需要的内容可能更容易:s,如@pandubear 的答案所示。

于 2013-12-11T10:20:03.070 回答