vim 像在sublimetext中那样进行多行编辑吗?

5ktev3wc  于 2022-11-11  发布在  其他
关注(0)|答案(8)|浏览(186)

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

w8biq8rn

w8biq8rn1#

帮你自己一个忙,删除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;

1.点击<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;

1.点击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;

1.将光标放在第三个单词的最后一个字符上:

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;

1.点击<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;

1.点击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;

1.点击<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;

1.按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;]
  • 执行以下命令::'<,'>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]允许您在一定范围的行上执行 normal 模式命令('<,'>部分由Vim自动添加,表示“对选定区域执行操作”)
  • ^将光标放在该行的第一个字符上
  • w移动到下一个字
  • i"在光标前插入"
  • <C-v><Esc>是Vim在此上下文中输入控制字符的方式,这里是<Esc>,用于退出 insert 模式
  • ee移动到下一个字的结尾
  • a"在光标后追加一个"
  • <CR>执行命令

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

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

deyfvvtc2#

在Vim中有几种方法来实现这一点。我不知道哪一种最类似于崇高文本的。
第一种方法是通过 * 多行插入模式 *。将光标放在第一行的第二个“a”上,按Ctrl-V,选择所有行,然后按I(大写i),并输入双引号。按Escape将对每一行重复该操作。
第二种方法是通过宏。将光标放在第一个字符上,然后使用qa开始录制宏。使用llll向右移动,使用a进入插入模式,输入双引号,退出插入模式。然后返回到行的开头,输入<home>(或等效键)。按j向下移动一行。使用q停止录制。然后使用@a重新播放宏。重复几次。
以上方法是否适合您?

kcwpcxri

kcwpcxri3#

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

它似乎被遗弃了一段时间,但在2014年有一些贡献。
这是相当强大的,虽然我花了一点时间来适应流(这是相当崇高的,但仍然像Vim模态)。
根据我的经验,如果你安装了很多其他的插件,你可能会遇到一些冲突!
还有一些其他的尝试功能:

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

sdnqo3pr

sdnqo3pr4#

如果你使用“global”命令,你可以重复你可以在一个在线上做的任何数量的行。

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

例如:

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

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

:g/.*/

每一行都要做

qacovj5a

qacovj5a5#

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

kmynzznz6#

我不知道vim在做什么,但这是一个有趣的效果。你描述你想要的东西的方式听起来更像宏的工作方式(:help macro)。类似这样的东西会做你想要的宏(在正常模式下开始):

  1. qa:将宏记录到a寄存器。
  2. 0w0后藤行首,w跳转一个字。
  3. i"<Esc>:进入插入模式,插入"并返回正常模式。
  4. 2e:跳到第二个单词的结尾。
  5. a"<Esc>:附加一个"
  6. jq移到下一行并结束宏录制。
    综合考虑:qa0wi"<Esc>2ea"<Esc>
    现在你可以用@a执行宏,用@@重复上一个宏。要应用到文件的其余部分,请执行类似99@a的操作,假设你没有超过99行,宏执行将在到达文件末尾时结束。
    下面是如何使用visual-block-mode实现您想要的效果(在正常模式下启动):
    1.导航到要放置第一个报价的位置。
    1.输入visual-block-mode,选择要影响的行,然后输入G以转到文件的底部。
    1.点击I"<Esc>
    1.移动到下一个要插入"的位置。
    1.您希望重复刚才的操作,因此简单的.就足够了。
n8ghc7c1

n8ghc7c17#

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

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

使用方法:

1.选择你的线。如果我想选择接下来的12条线,我只需按V12j
1.按下<leader>n
1.对行进行更改
1.确保您处于正常模式,然后按<leader>m
要进行另一次编辑,您无需再次选择。只需按<leader>n,进行编辑,然后按<leader>m应用即可。

工作原理:

  • <Esc><Esc>0qq退出可视选择,转到行首并开始录制宏。
  • q停止录制宏。
  • :'<,'>-1normal!@q<CR>从视觉化选取范围的开头到结尾的前一行,在每一行上播放宏。
  • <Down>返回到最后一行。

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

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

虽然这会使您无法进行其他编辑,但您必须重新选择行。

a9wyjsp7

a9wyjsp78#

如果有人像我一样发现了这个古老的主题:
一个很棒的插件:https://github.com/mg979/vim-visual-multi/
它真的很接近SublimeText多行编辑体验,效果很好。

相关问题