2015-08-08 61 views
1

我测试与我的脚本代理,看起来像:Vim:如何在文本的不同列后粘贴一列文本(来自剪贴板)?

$proxy = "http://name:[email protected]:80"; 
$proxy2 = "http://name:[email protected]:80"; 
$proxy3 = "http://name:[email protected]:80"; 
... 
$proxy100 = "http://name:[email protected]:80"; 

我通过电子邮件获得新的代理所以我复制新的代理和Vim插入它,而不是旧的:

"http://name:[email protected]:80"; 
"http://name:[email protected]:80"; 
"http://name:[email protected]:80"; 
... 
"http://name:[email protected]:80"; 

权利知道我在做它,因为这页How do I paste a column of text after a different column of text in Vim?

使用视觉块(CTRL-v)上被描述削减信列。然后移至号码列的第一行 。移动到最后并创造一个空间。 然后粘贴字母列。

我很好奇,如何在没有额外步骤的情况下完成,只需从剪贴板粘贴数据?

+1

Vim可能不适合这项工作。您应该从电子邮件中复制代理并将其粘贴到文本文件中,并使用脚本处理该文件。 – romainl

回答

5

简短版本:你不行。有办法绕过它,但它们并不一定简单。更长的版本如下。

Vim有标记文本区域的三种方式:面向行(当你按下V启动该模式),面向字符(当你按下v触发),并逐块(当你按下CTRL-V )。被标记的区域被复制到一个寄存器中,并且该寄存器具有属性“类型”,该属性反映了您进行标记的方式,线条,字符或块状。从寄存器粘贴时发生的情况取决于此类型。

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

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

因此,免去您的代理服务器列表会去是这样的:

  • 复制新的列表到剪贴板,从邮件消息
  • 运行:call setreg('*', @*, 'b')设置*寄存器的类型列块
  • 去老列表中,按CTRL-v并标记它;假设没有什么别的从代理一边在该文件中,这样做的Vim的高尔夫球手的方法可能是沿着线的东西:
    1. ˚F - 转到第一"
    2. 按Ctrl - v - 启动标志着
    3. ;输入 - 转到最后;
    4. 0123?
  • 粘贴新名单上的选择,与*p

可以简化最后一步一点,通过使*+寄存器始终是指相同的值。要做到这一点,它添加到你的vimrc:

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

使用此设置的咒语变成:

  • 从邮件复制到新的列表
  • 运行:call setreg('+', @+, 'b')
  • 去旧名单,标记为Ctrl-v同上
  • p粘贴新列表ov呃。

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

  • 打开该文件与旧名单
  • 打开该文件与Vim中的一个单独的副本新的列表
  • 标记与CTRL-v新的代理和与猛拉他们Ÿ
  • 在其他的Vim
  • 纪念醇d列表与Ctrl-v并粘贴新的与p

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

0

我不知道有任何直接的方法来做到这一点。如果它对你来说真的很重要,那么在你进行实际的编辑之前,你可能需要做一些设置,这只会增加你必须做的打字量(不过你可以向你的vimrc添加命令以使其永久)。你可能会设置一些键盘宏,或者使用下面的命令地图:

:imap <CR> <Esc>j011lC 

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

当您完成时请记住:iunmap <CR>

相关问题