我开始使用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在这做什么?
答案 0 :(得分:166)
通过删除Windows兼容性层帮助自己。
进入视觉阻止模式的常规快捷方式是<C-v>
。
其他人已经处理过录制宏,这里有一些其他的想法:
仅使用 visual-block 模式。
将光标放在第二个单词:
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;
点击<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;
点击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;
将光标放在第三个单词的最后一个字符上:
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;
点击<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;
点击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;
使用 visual-block 模式和Surround.vim。
将光标放在第二个单词:
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;
点击<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;
点击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
。
点击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]
允许您在一系列行上执行普通模式命令('<,'>
部分由Vim自动添加,表示“对所选行为执行操作区域“)
^
将光标放在行
w
转到下一个字
i"
在光标
"
<C-v><Esc>
是Vim在此上下文中输入控制字符的方式,此处<Esc>
用于退出插入模式
ee
移到下一个单词的末尾
a"
在光标后附加"
<CR>
执行命令
使用Surround.vim,上面的命令变为
:'<,'>norm ^wvees"<CR>
答案 1 :(得分:23)
在Vim中有几种方法可以实现这一目标。我不知道哪个是最多的 类似于Sublime Text的。
第一个是通过多行插入模式。把光标放到
在第一行中输入第二个“a”,按Ctrl-V
,选择所有行,然后按I
,然后按
放入双引号。按<esc>
将在每一行重复操作。
第二个是通过宏。将光标放在第一个字符上,然后开始
使用qa
录制宏。
使用llll
向右转,然后输入插入模式
a
,放下双引号,退出插入模式,然后返回到开头
您的行<home>
(或等效的)。按j
向下移动一行。
使用q
停止录制。
然后使用@a
重播宏。好几次。
上述任何一种方法都适合您吗?
答案 2 :(得分:23)
这些是上面给出的一些优秀的开箱即用解决方案,但我们也可以尝试一些提供Sublime等多个游标的插件。
我认为这个很有希望:
它似乎已经放弃了一段时间,但在2014年有一些贡献。
这是非常强大的,虽然我花了一点时间来习惯流程(这很像Sublime,但仍然像Vim一样模态)。
根据我的经验,如果你安装了很多其他插件,你可能会遇到一些冲突!
此功能还有其他尝试:
如果您发现任何这些正在改进,请随时编辑。
答案 3 :(得分:10)
如果你使用“全局”命令,你可以在网上一行重复你可以做的任何行。
:g/<search>/.<your ex command>
示例:
:g/foo/.s/bar/baz/g
上面的命令找到所有拥有foo的行,并用baz替换该行上所有出现的bar。
:g/.*/
将在每一行
答案 4 :(得分:5)
我不确定vim
正在做什么,但这是一个有趣的效果。您描述所需内容的方式听起来更像宏(:help macro
)。像这样的东西可以用你想要的宏(从正常模式开始):
qa
:将宏记录到a
注册。0w
:0
转到行首,w
跳一个字。i"<Esc>
:输入插入模式,插入"
并返回正常模式。2e
:跳到第二个单词的结尾。a"<Esc>
:附加"
。jq
转到下一行并结束宏录制。合在一起:qa0wi"<Esc>2ea"<Esc>
现在您可以使用@a
执行宏,使用@@
重复上一个宏。要应用于文件的其余部分,请执行类似99@a
的操作,假设您的行数不超过99行,宏执行将在文件结束时结束。
以下是如何使用visual-block-mode
(在正常模式下启动)实现您想要的效果:
visual-block-mode
,选择您要影响的行,G
转到文件底部。I"<Esc>
。"
。.
就足够了。答案 5 :(得分:4)
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)
答案 6 :(得分:0)
我的解决方案是使用以下两个映射:
map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>
如何使用它们:
V12j
<leader>n
<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>
尽管这会打乱您进行其他编辑的能力。您必须重新选择行。