Vim 多行编辑,就像 sublimettext 中的那样?

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

187079 次浏览

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

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

例如:

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

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

:g/.*/

每句台词都是如此

有几种方法可以在 Vim 中实现这一点,我不知道哪一种是最好的 与《崇高的文本》类似。


第一个是通过 多行插入方式多行插入方式 第一行的第二个“ a”,按 Ctrl-V,选择所有行,然后按 (大写 i) ,然后 输入一个双引号。按 逃跑将在每一行上重复操作。


第二个是通过宏。把光标放在第一个字符上,然后开始 用 qa记录宏。 使用 llll向右转,使用 a,放下双引号,退出插入模式,然后返回 按 j向下移动一行。 停止用 q录音。 然后用 @a重播宏。多次。


以上任何一种方法对你有效吗?

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

  1. 记录宏到 a寄存器。
  2. 0开始行,w跳一个字。
  3. 进入插入模式,插入一个 "并返回到正常模式。
  4. 跳到第二个单词的结尾。
  5. 附加一个 "
  6. 移动到下一行,结束宏录制。

综合起来: qa0wi"<Esc>2ea"<Esc>

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

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

  1. 导航到您希望第一个引用的位置。
  2. 输入 visual-block-mode,选择您想要影响的行,G到文件的底部。
  3. I"<Esc>
  4. 移动到下一个要插入 "的位置。
  5. 您需要重复刚才的操作,这样一个简单的 .就足够了。

为了你自己好,放弃 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;
    
  2. Hit <C-v> to enter visual-block mode and expand your selection toward the bottom:

    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. Hit I"<Esc> to obtain:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "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. Put the cursor on the last char of the third word:

    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. Hit <C-v> to enter visual-block mode and expand your selection toward the bottom:

    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. Hit A"<Esc> to obtain:

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

With visual-block mode and Surround.vim.

  1. Put the cursor on the second word:

    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. Hit <C-v> to enter visual-block mode and expand your selection toward the bottom and the right:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [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. Hit S" to surround your selection with ":

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

With visual-line mode and :normal.

  1. Hit V to select the whole line and expand it toward the bottom:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd 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. Execute this command: :'<,'>norm ^wi"<C-v><Esc>eea"<CR> to obtain:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "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移动到下一个词

    • 在光标之前插入一个 "

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

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

    • a"在光标后面追加一个 "

    • <CR>执行命令

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

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

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

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

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

它非常强大,尽管我花了一些时间才适应这种流程(这种流程非常崇高,但模态仍然像 Vim)。

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

在这方面还有其他一些尝试:

请随时编辑,如果你注意到任何这些正在进行改进。

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)

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

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申请。


工作原理:

  • 退出视觉选择,转到行的开头并开始记录一个宏。

  • 停止录制宏。

  • 从视觉选择的开始到结束前的行,在每一行上播放宏。

  • 回到最后一行。


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

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

虽然这会影响你再次编辑的能力,但是你必须重新选择你的台词。

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

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

它非常接近 SublimText 的多行编辑经验,并且工作得很好。