像sublimetext一样的Vim多行编辑?

时间:2012-08-02 19:24:41

标签: vim sublimetext text-editor

我开始使用gvim,我不太明白gvim中的多行编辑是如何工作的。

例如:

原文:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q,jjjjjj,$ 一切都被选中,然后我按I进行多行插页。

我的意图是在第一行插入引号,然后按Esc:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

发生什么事了?我期望一种类似于sublimetext的行为:

enter image description here

如果你不知道它是如何工作的,它只是重复每一行的动作。怎么能实现呢? vim在这做什么?

7 个答案:

答案 0 :(得分:166)

通过删除Windows兼容性层帮助自己。

进入视觉阻止模式的常规快捷方式是<C-v>

其他人已经处理过录制宏,这里有一些其他的想法:

仅使用 visual-block 模式。

  1. 将光标放在第二个单词:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. 点击<C-v>进入 visual-block 模式并将选择范围扩展到底部:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. 点击I"<Esc>获取:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. 将光标放在第三个单词的最后一个字符上:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. 点击<C-v>进入 visual-block 模式并将选择范围扩展到底部:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. 点击A"<Esc>获取:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
  7. 使用 visual-block 模式和Surround.vim

    1. 将光标放在第二个单词:

      asd |a|sd asd asd asd;
      asd asd asd asd asd;
      asd asd asd asd asd;
      asd asd asd asd asd;
      asd asd asd asd asd;
      asd asd asd asd asd;
      asd asd asd asd asd;
      
    2. 点击<C-v>进入 visual-block 模式并向左下方展开您的选择:

      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      asd [asd asd] asd asd;
      
    3. 点击S"以“:

      围绕您的选择
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      asd "asd asd" asd asd;
      
    4. 使用视觉线模式和:normal

      1. 点击V选择整行并将其展开到底部:

        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        [asd asd asd asd asd;]
        
      2. 执行以下命令::'<,'>norm ^wi"<C-v><Esc>eea"<CR>获取:

        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        asd "asd asd" asd asd;
        
        • :norm[al]允许您在一系列行上执行普通模式命令('<,'>部分由Vim自动添加,表示“对所选行为执行操作区域“)

        • ^将光标放在行

        • 的第一个字符处
        • w转到下一个字

        • i"在光标

        • 之前插入"
        • <C-v><Esc>是Vim在此上下文中输入控制字符的方式,此处<Esc>用于退出插入模式

        • ee移到下一个单词的末尾

        • a"在光标后附加"

        • <CR>执行命令

        使用Surround.vim,上面的命令变为

        :'<,'>norm ^wvees"<CR>
        

答案 1 :(得分:23)

在Vim中有几种方法可以实现这一目标。我不知道哪个是最多的 类似于Sublime Text的。


第一个是通过多行插入模式。把光标放到 在第一行中输入第二个“a”,按Ctrl-V,选择所有行,然后按I,然后按 放入双引号。按<esc>将在每一行重复操作。


第二个是通过宏。将光标放在第一个字符上,然后开始 使用qa录制宏。 使用llll向右转,然后输入插入模式 a,放下双引号,退出插入模式,然后返回到开头 您的行<home>(或等效的)。按j向下移动一行。 使用q停止录制。 然后使用@a重播宏。好几次。


上述任何一种方法都适合您吗?

答案 2 :(得分:23)

这些是上面给出的一些优秀的开箱即用解决方案,但我们也可以尝试一些提供Sublime等多个游标的插件。

我认为这个很有希望:

它似乎已经放弃了一段时间,但在2014年有一些贡献。

这是非常强大的,虽然我花了一点时间来习惯流程(这很像Sublime,但仍然像Vim一样模态)。

根据我的经验,如果你安装了很多其他插件,你可能会遇到一些冲突!

此功能还有其他尝试:

如果您发现任何这些正在改进,请随时编辑。

答案 3 :(得分:10)

如果你使用“全局”命令,你可以在网上一行重复你可以做的任何行。

:g/<search>/.<your ex command>

示例:

:g/foo/.s/bar/baz/g

上面的命令找到所有拥有foo的行,并用baz替换该行上所有出现的bar。

:g/.*/

将在每一行

答案 4 :(得分:5)

我不确定vim正在做什么,但这是一个有趣的效果。您描述所需内容的方式听起来更像宏(:help macro)。像这样的东西可以用你想要的宏(从正常模式开始):

  1. qa:将宏记录到a注册。
  2. 0w0转到行首,w跳一个字。
  3. i"<Esc>:输入插入模式,插入"并返回正常模式。
  4. 2e:跳到第二个单词的结尾。
  5. a"<Esc>:附加"
  6. jq转到下一行并结束宏录制。
  7. 合在一起:qa0wi"<Esc>2ea"<Esc>

    现在您可以使用@a执行宏,使用@@重复上一个宏。要应用于文件的其余部分,请执行类似99@a的操作,假设您的行数不超过99行,宏执行将在文件结束时结束。

    以下是如何使用visual-block-mode(在正常模式下启动)实现您想要的效果:

    1. 导航到您想要第一个引用的位置。
    2. 输入visual-block-mode,选择您要影响的行,G转到文件底部。
    3. 点击I"<Esc>
    4. 移至要插入"
    5. 的下一个位置
    6. 你想重复你刚刚做的事情,这样一个简单的.就足够了。

答案 5 :(得分:4)

Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

答案 6 :(得分:0)

我的解决方案是使用以下两个映射:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

如何使用它们:

  1. 选择您的行。如果要选择接下来的12行,只需按V12j
  2. <leader>n
  3. 对行进行更改
  4. 确保您处于正常模式,然后按<leader>m

要进行其他编辑,您无需再次进行选择。只需按<leader>n,进行编辑,然后按<leader>m即可应用。


工作原理:

  • <Esc><Esc>0qq退出视觉选择,转到该行的开头并开始记录宏。

  • q停止录制宏。

  • :'<,'>-1normal!@q<CR>从视觉选择的开始到结尾的前一行,在每一行上播放宏。

  • <Down>回到最后一行。


您也可以只映射相同的键,但用于不同的模式:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

尽管这会打乱您进行其他编辑的能力。您必须重新选择行。