166

我开始使用 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 的行为:

在此处输入图像描述

如果您不知道它是如何工作的,它只会对每一行重复这些操作。怎样才能做到这一点?vim 在这里做什么?

4

8 回答 8

266

通过删除 Windows 兼容层来帮自己一个忙。

进入可视块模式的正常快捷方式是<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;
    
  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;
    
  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>进入视觉块模式并将您的选择扩展到底部:

    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;
    

使用可视块模式和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>进入视觉块模式并将您的选择扩展到底部和右侧:

    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;
    

具有视觉线模式和: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""在光标前插入 a

    • <C-v><Esc>是Vim在这个上下文中输入控制字符的方式,这里<Esc>用来退出插入模式

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

    • a""在光标后附加 a

    • <CR>执行命令

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

    :'<,'>norm ^wvees"<CR>
    
于 2012-08-03T06:32:41.940 回答
35

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

我认为这个看起来很有希望:

它似乎被遗弃了一段时间,但在 2014 年有了一些贡献。

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

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

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

如果您发现其中任何一项正在改进,请随时进行编辑。

于 2014-06-13T10:46:46.330 回答
33

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


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


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


上述任何方法对您有用吗?

于 2012-08-02T20:12:21.413 回答
18

如果您使用“全局”命令,您可以在一个在线的任意行数上重复您可以执行的操作。

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

例子:

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

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

:g/.*/

会在每一行做

于 2012-08-02T19:33:48.050 回答
16
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)
于 2017-09-15T18:04:23.340 回答
7

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

  1. qa:录制宏进行a注册。
  2. 0w:0转到行首,w跳一个字。
  3. i"<Esc>: 进入insert-mode,插入a ",返回normal-mode。
  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. 你想重复你刚刚做的,所以一个简单的.就足够了。
于 2012-08-02T20:29:21.723 回答
1

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

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>

尽管这会破坏您进行另一次编辑的能力。您必须重新选择您的线路。

于 2019-03-15T07:20:43.130 回答
0

如果有人喜欢我发现了这个老话题:

一个很棒的插件: https ://github.com/mg979/vim-visual-multi/

它真的很接近 SublimeText 的多行编辑体验并且效果很好。

于 2022-02-01T08:58:29.310 回答