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

whi*_*roi 1 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";
Run Code Online (Sandbox Code Playgroud)

我通过电子邮件获得新代理,因此我可以复制新代理并通过以下方式插入新代理而不是旧代理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";
Run Code Online (Sandbox Code Playgroud)

正确知道我正在按照本页所述进行操作如何在Vim中的另一列文本后粘贴一列文本?

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

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

lcd*_*047 5

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

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

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

call setreg('*', @*, 'b')
Run Code Online (Sandbox Code Playgroud)

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

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

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

set clipboard=unnamedplus,autoselect,exclude:cons\\\\|linux
Run Code Online (Sandbox Code Playgroud)

使用此设置,咒语变为:

  • 从邮件中复制新列表
  • :call setreg('+', @+, 'b')
  • 转到旧列表并按Ctrl-v上述标记
  • p将新列表粘贴到其上.

如果您在可以使用Vim打开的文件中有新列表,则不需要此舞蹈:

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

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