Vim:如何在不同的文本列之后粘贴一列文本(从剪贴板)?

时间:2015-08-08 13:43:21

标签: vim

我正在使用我的脚本测试代理:

$proxy =   "http://name:pass@133.245.122.91:80";
$proxy2 =  "http://name:pass@133.245.229.241:80";
$proxy3 =  "http://name:pass@133.245.113.197:80";
...
$proxy100 =  "http://name:pass@133.245.212.197:80";

我通过电子邮件获取新代理,因此可以复制新代理并通过Vim插入代理而不是旧代理:

"http://name:pass@133.245.122.91:80";
"http://name:pass@133.245.229.241:80";
"http://name:pass@133.245.113.197:80";
...
"http://name:pass@133.245.212.197:80";

正确知道我正在按照本页How do I paste a column of text after a different column of text in Vim?

中的描述进行操作
  

使用视觉块(ctrl-v)剪切字母列。然后转移到   数字列的第一行。移到最后并创建一个空格。   然后粘贴字母列。

我很好奇,如果没有额外的步骤就可以完成,只需从剪贴板粘贴数据?

2 个答案:

答案 0 :(得分:5)

简短版:你不能。有很多方法,但它们并不一定简单。更长的版本如下。

Vim有三种标记文本区域的方法:linewise(按 V 时开始此模式),按字符顺序(按 v 时触发)和blockwise (当您按 Ctrl-v 时)。标记的区域被复制到一个寄存器,该寄存器有一个属性," type",它反映了标记,行,字符或块的标记方式。从寄存器粘贴时会发生什么情况取决于此类型。

现在,当您从系统的剪贴板复制时,结果存储在*寄存器中,并且类型始终设置为linewise。因此,您无法粘贴列模式"无需额外的步骤"。但是,您可以在粘贴之前将*寄存器的类型设置为blockwise:

call setreg('*', @*, 'b')

因此,替换代理列表将是这样的:

  • 从邮件消息
  • 将新列表复制到剪贴板
  • 运行:call setreg('*', @*, 'b')*寄存器的类型设置为blockwise
  • 转到旧列表,按 Ctrl-v 并标记;假设除了代理之外文件中没有别的东西,Vim高尔夫球手的做法可能是这样的:
    1. f " - 转到第一个"
    2. Ctrl-v - 开始标记
    3. ; 输入 - 转到上一个;
  • 使用" * p 将新列表粘贴到选区上。

通过使*+寄存器始终引用相同的值,您可以稍微简化最后一步。为此,请将其添加到您的vimrc:

set clipboard=unnamedplus,autoselect,exclude:cons\\\\|linux

使用此设置,咒语变为:

  • 从邮件中复制新列表
  • 运行:call setreg('+', @+, 'b')
  • 转到旧列表并使用上面的 Ctrl-v 进行标记
  • p 将新列表粘贴到其上。

如果你有一个可以用Vim打开的文件中的新列表,你就不需要这种舞蹈了:

  • 使用旧列表打开文件
  • 在Vim的单独副本中使用新列表打开文件
  • 使用 Ctrl-v 标记新代理并使用 y
  • 将它们拉出来
  • 在另一个Vim中使用 Ctrl-v 标记旧列表,并使用 p 将新粘贴在其上。

这仍然涉及使用系统剪贴板,但Vim的第二个副本负责将相关寄存器的类型设置为blockwise。

答案 1 :(得分:0)

我不知道有什么直接的方法可以做到这一点。如果它对您来说非常重要,那么在进行实际编辑之前可能需要进行一些设置,这只会增加您必须执行的键入量(但是您可以向vimrc添加命令以使其永久化)。您可以设置一些键盘宏,或使用以下map命令:

:imap <CR> <Esc>j011lC

现在转到第一个"符号并按C,然后开始粘贴(仅适用于终端)。无论何时粘贴换行符,地图都会将您移至下一行的第11列。

完成后请记得:iunmap <CR>