像在sublimetext中的Vim多行编辑?


132

我开始使用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在这里做什么?


只需录制键盘宏即可更改第一行,然后播放所有其他行的宏。
2012年

Answers:


213

通过删除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""在光标之前插入

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

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

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

    • <CR> 执行命令

    使用Surround.vim,以上命令变为

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

7
对于第4步和第5步,我建议单击,gv以恢复先前的视觉选择,然后水平移动(也许使用)2e。(越多的行,就越有价值gv!)
joeytwiddle

4
sSS"
Surround.vim

1
visual-block + Surround.vim的第3点应该为S",而不是s"
zool

1
您可以将光标放在第三个单词之后,然后按,而不是可视块模式步骤5和6 .
乔纳斯(Jonas)

2
这很酷,但是这仅在某些情况下有效,即您要在不同行上编辑的字符在每行上的水平位置完全相同,并且已编辑的行接一个接一个。我们不能选择在Vim的哪一行上以编辑方式进入哪里?我们可以在Sublim ... 编辑:实际上,第二个答案就是我想要的
Alexandre Bourlier

30

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

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

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

它非常强大,尽管花了我一些时间来适应流程(这非常类似于Sublime,但仍然像Vim一样是模态的)。

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

还有其他尝试使用此功能的方法:

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


看起来github.com/osyo-manga/vim-over是目前最活跃的。
2015年


1
在测试了大多数hlissner / vim-multiedit之后,似乎是最好的AFAIAC
Alexandre Bourlier

1
检查mg979 / vim-visual-multi是否可以很好地替代vim-
multi

29

有几种方法可以在Vim中完成此操作。我不知道哪个与Sublime Text最相似。


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


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


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


15

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

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

例:

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

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

:g/.*/

将在每一行上做


1
这是如此有用,我不知道。似乎是命令的强大而巧妙的组合。
0xc0de

为方便起见,我编写了一个小函数,将单词(或视觉上选择的单词)放在光标下,提示进行替换,然后运行:g此处描述的命令。我喜欢用来/gc要求“确认”,因此我可以点击yn每次替换,或a更改全部。
joeytwiddle

11
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)

在步骤3中,I无法进入插入模式,您知道为什么会发生这种情况吗?
忍者

尝试加载没有插件的vim:vim -u NONE然后尝试再次执行所需的操作,可能是某些映射或插件改变了vim的行为。
SergioAraujo,

6

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

  1. qa:记录要a注册的宏。
  2. 0w0转到行首,w跳一个字。
  3. i"<Esc>:进入插入模式,插入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. 您想重复您刚才做的事情,这样简单.就足够了。

4
不需要99 @ a。如果您希望在文件的每一行上执行宏,请尝试:%norm!@一个。
Rook 2012年

没有圆点(它们只是句子的结尾,而不是命令的一部分)
Rook 2012年

9999@a可能很难看,但键入起来要容易得多:%norm! @a,而且不会在您刚刚编辑的行上重新运行。无论如何仍然很高兴知道它。:)
joeytwiddle

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>

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.