像sublimetext一样的Vim多行编辑?

Alf*_*oVR 112 vim text-editor sublimetext

我开始使用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;
Run Code Online (Sandbox Code Playgroud)

ctrl + q,jjjjjj,$ everything被选中,然后我按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;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

rom*_*inl 188

删除Windows兼容性层,帮自己一个忙.

进入Visual-Block模式的常规快捷方式是<C-v>.

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

仅使用可视块模式.

  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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 点击<C-v>进入视觉块模式并将选择范围扩展到底部:

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 点击<C-v>进入视觉块模式并将选择范围扩展到底部:

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)

使用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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 点击<C-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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)

视线模式和: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;]
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)
    • :norm[al]允许您在一系列行上执行正常模式命令(该'<,'>部分由Vim自动添加,意味着"作用于所选区域")

    • ^ 将光标放在该行的第一个字符处

    • w 转到下一个单词

    • i""在光标前插入一个

    • <C-v><Esc>是Vim在这种情况下输入控制字符的方法,这里它<Esc>用于退出插入模式

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

    • a""在光标后附加一个

    • <CR> 执行命令

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

    :'<,'>norm ^wvees"<CR>
    
    Run Code Online (Sandbox Code Playgroud)

  • 对于步骤4和5,我建议点击`gv`以恢复之前的视觉选择,然后*然后*水平移动,也许用'2e`.(线条越多,`gv`越有价值!) (6认同)
  • surround.vim在正常模式下使用小`s`但在可视模式下使用大`S`,所以在surround.vim方法的第3步中,击键应为'S" (4认同)
  • 这很酷,但这只适用于某些情况,即您要在不同行上编辑的字符在每一行的水平位置完全相同,并且编辑的行一个接一个地正确。我们不能在 Vim 的哪一行上挑选进入编辑模式的位置吗?我们可以在 Sublim 中...... **编辑:** 实际上第二个答案是我正在寻找的 (2认同)
  • @AndrewBobulsky,你的假设是正确的。这是映射中使用的标准符号,也是编写 Vim 时的事实上的标准。请参阅“:help key-notation”。 (2认同)

joe*_*dle 27

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

我觉得这个很有希望:

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

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

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

此功能还有其他一些尝试:

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

  • 检查 [mg979/vim-visual-multi](https://github.com/mg979/vim-visual-multi) 作为 *vim-multiple-cursors* 的良好替代品 (2认同)

Roo*_*ook 26

在Vim中有几种方法可以实现这一点.我不知道哪些与Sublime Text最相似.


第一个是通过多线插入模式.将光标放在第一行的第二个"a",按Ctrl-V,选择所有行,然后按I,然后放入双引号.按下<esc>将在每一行重复操作.


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


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


sri*_*lla 12

如果你使用"全局"命令,你可以在一个在线的任何行上重复你可以做的事情.

:g/<search>/.<your ex command>
Run Code Online (Sandbox Code Playgroud)

例:

:g/foo/.s/bar/baz/g
Run Code Online (Sandbox Code Playgroud)

上面的命令查找所有具有foo的行,并用baz替换该行上所有出现的bar.

:g/.*/
Run Code Online (Sandbox Code Playgroud)

将在每一行做


Tho*_*hor 5

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

  1. qa:记录要a注册的宏.
  2. 0w:0转到行首,w跳一个字.
  3. i"<Esc>:输入insert-mode,插入a "并返回正常模式.
  4. 2e:跳到第二个单词的结尾.
  5. a"<Esc>:附加一个".
  6. jq 移至下一行并结束宏录制.

合在一起: qa0wi"<Esc>2ea"<Esc>

现在您可以执行宏@a,重复上一个宏@@.要应用于文件的其余部分,执行类似99@a假设您没有超过99行的操作,宏执行将在到达文件末尾时结束.

以下是如何实现您想要的visual-block-mode(从正常模式开始):

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

  • 不需要99 @ a.如果你想在文件的每一行上执行一个宏,请尝试:%norm!@一个. (4认同)

Ser*_*ujo 5

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)
Run Code Online (Sandbox Code Playgroud)

  • 第3步,`I`无法进入插入模式,你知道为什么会这样吗? (2认同)