我将主要的文本编辑器从Notepad++转换到Vim。
在Notepad++中,你可以通过按住Ctrl并单击文本中的任何位置来拥有多个光标,这样,如果你键入文本,它会出现在多个位置。
在Vim中是否也可以实现类似的功能?例如在 Visual 模式下选择多行后插入文本,但又可以在文本的任何地方放置光标。
虽然这只是一个我很少使用的功能,并且它也可以很容易地被避免,但我仍然很好奇,因为这是我在Vim中尚未找到替代品的唯一一个功能。
我将主要的文本编辑器从Notepad++转换到Vim。
在Notepad++中,你可以通过按住Ctrl并单击文本中的任何位置来拥有多个光标,这样,如果你键入文本,它会出现在多个位置。
在Vim中是否也可以实现类似的功能?例如在 Visual 模式下选择多行后插入文本,但又可以在文本的任何地方放置光标。
虽然这只是一个我很少使用的功能,并且它也可以很容易地被避免,但我仍然很好奇,因为这是我在Vim中尚未找到替代品的唯一一个功能。
没有这种内置功能。
让我建议一个函数,它可以在给定标记的位置重复命令(例如.
重复上一次更改命令)。 标记和命令都作为字符串参数指定。 标记以正则表达式范围或scanf
格式说明符定义的方式指定。 例如,za-dx
表示标记 z
、a
、b
、c
、d
、x
。
function! MarksRepeat(marks, command)
let pos = 0
let len = strlen(a:marks)
let alpha = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
let beta = '1234567899bcdefghijklmnopqrstuvwxyzzBCDEFGHIJKLMNOPQRSTUVWXYZZ'
while pos < len
if a:marks[pos + 1] != '-'
exe 'norm `' . a:marks[pos] . a:command
let pos += 1
elseif a:marks[pos] <= a:marks[pos+2]
let mark = a:marks[pos]
let stop = a:marks[pos+2]
if mark =~ '[0-9a-zA-Z]' && stop =~ '[0-9a-zA-Z]'
while 1
exe 'norm `' . mark . a:command
if mark == stop
break
endif
let mark = tr(mark, alpha, beta)
endwhile
endif
let pos += 3
endif
endwhile
endfunction
m
command).Run the function:
:call MarksRepeat(‹marks›, '.')
:folddoclosed
) - darcyparker .
在你想要文本的每个其他位置重复插入。foldmethod=manual
,然后使用zf
标记要操作的块。:folddoclosed
在折叠块上执行ex命令。:folddoclosed norm Iinsert some text at the front
请注意,您可以在任何折叠组上使用:folddoclosed
,因此您可以使用其他foldmethods...但通常手动创建折叠是有意义的。:norm
,这会给您:'<,'>norm
......但视觉标记只允许您选择连续的行范围。使用折叠和:folddoclosed
,您可以一次操作多个行范围。:folddoclosed
的时间,我会键入:fo<shifttab><shifttab><shifttab>