Vim阻塞 - 直到某个字符和块粘贴在同一位置

时间:2014-02-12 12:36:17

标签: ruby vim vi

我正面对这段代码:

@store= Store.new(name:"Storename",
                  address:"Main road, 2",
                  phone:677879878,
                  city:"bluecity",
                  email:"storename@gmail.com.com")

it{ should respond_to(:toreplace)}
it{ should respond_to(:toreplace)}
it{ should respond_to(:toreplace)}
it{ should respond_to(:toreplace)}
it{ should respond_to(:toreplace)}

我想把它变成另一个:

@store= Store.new(name:"Storename",
                  address:"Main road, 2",
                  phone:677879878,
                  city:"bluecity",
                  email:"storename@gmail.com.com")


it{ should respond_to(:name)}
it{ should respond_to(:address)}
it{ should respond_to(:phone)}
it{ should respond_to(:city)}
it{ should respond_to(:email)}

我想“阻止”所有hashkeys,例如:name,来自contructor调用,并在()内“阻塞”它们。 我想知道是否有一种方法可以“阻止 - 直到某个角色:所有线条”,然后“阻止粘贴”,我只能“阻塞”每个人的第一个角色线!

注意:如果可能,我想避免使用宏和REGEX。虽然我也对宏观观点持开放态度,这可以改善我自己的想法。

4 个答案:

答案 0 :(得分:4)

使用阻止选择/ yanking和粘贴无法按预期转换文本,除非您“准备”文本,特别是@store语句。因为现在哈希键不在块中。

但是,您的任务可以通过宏完成。

qq0f:yb6+;pldt)5-q

用光标在@store线上按上方键。按下后,您的光标将显示在address上,然后按4@q,您就可以获得所需内容。

请注意,宏中的6 and 5是经过编码的。您可能想要调整它们取决于您的真实文本。但你明白了。

它的工作原理如下:

enter image description here

答案 1 :(得分:4)

正如@Kent所说,这不能用阻止甩/放。

我不会在不知道它们是什么的情况下尝试改进你的宏。

为了可能有相同问题的其他人,没有您的限制,这是一个有趣的方法。这可能会扩展为可重用的功能。首先,

:let args = []

接下来,选择带有hashkeys的行,并使用进入Ex模式。范围'<,'>将自动输入。完成

:'<,'>g/^/let args += [matchstr(getline('.'), '\k*\ze:')]

这应该将hashkeys保存在args列表中;你可以查看:echo args。最后,选择带有替换文本的行并输入

:'<,'>g/:\zstoreplace/s//\=remove(args, 0)

答案 2 :(得分:2)

这是一个稍微偏离主题的方式:

您首先要抓取@store段:

yip

然后你自己粘贴它:

}p

然后使用:normal在当前的一行和最后一行之间的每一行上运行一个简单的宏:

:,']norm 0f:bc0it{ should respond_to(:<C-v><CR>;C)}<CR>

故障:

:,']                       from current line to last pasted line
norm                       run the following normal mode comman
0                          jump to first column
f:                         jump to first :
b                          jump to beginning of word on the left
c0                         change from cursor to first column
it{ should respond_to(:    type that text
<C-v><Esc>                 literal <Esc>
;                          jump to first :
C                          change from cursor to EOL
)}                         type that text

答案 3 :(得分:1)

这是一种主要使用块yank / put命令的方法。

诀窍是,为了能够做一个不规则(不是方形)的块猛拉,首先要确保你想要的东西是在线的末端。

所以:

  1. 选择包含属性名称的行:ggV5G
  2. 在每一行上,删除属性名称后的所有内容::normal f:D 输入
  3. 阻止yank属性名称到寄存器“a”:?name 输入 Ctrl-V 5G$"ay
  4. 恢复上一行,不要丢失任何内容:u
  5. 阻止选择“替换”行:/toreplace 输入 Ctrl-V 11Gt)
  6. 放置属性名称:"ap
  7. (可选)在关闭括号前删除多余的空格:gv:normal f:f dt) 输入
  8. 步骤1-6为您提供以下内容:

    it{ should respond_to(:name   )}
    it{ should respond_to(:address)} 
    it{ should respond_to(:phone  )}
    it{ should respond_to(:city   )}
    it{ should respond_to(:email  )}
    

    步骤7(可选)是在关闭括号之前删除多余的空格,这样就可以得到:

    it{ should respond_to(:name)}
    it{ should respond_to(:address)}
    it{ should respond_to(:phone)}
    it{ should respond_to(:city)}
    it{ should respond_to(:email)}