类似于Vim的“多重编辑”功能的Notepad++?

19

我将主要的文本编辑器从Notepad++转换到Vim。

在Notepad++中,你可以通过按住Ctrl并单击文本中的任何位置来拥有多个光标,这样,如果你键入文本,它会出现在多个位置。

在Vim中是否也可以实现类似的功能?例如在 Visual 模式下选择多行后插入文本,但又可以在文本的任何地方放置光标。

虽然这只是一个我很少使用的功能,并且它也可以很容易地被避免,但我仍然很好奇,因为这是我在Vim中尚未找到替代品的唯一一个功能。


3
我下载了最新版本的Notepad++,但当我按下Ctrl键并单击时没有反应,也没有出现两个光标。 - Alex Budovski
3
好的,那需要在偏好设置/编辑下启用。 - proto-n
2
哇,这很酷。我不知道还有这个功能。 - vobject
不错!我也不知道那个功能。 - leifericf
4个回答

6

没有这种内置功能。

让我建议一个函数,它可以在给定标记的位置重复命令(例如. 重复上一次更改命令)。 标记和命令都作为字符串参数指定。 标记以正则表达式范围或scanf格式说明符定义的方式指定。 例如,za-dx 表示标记 zabcdx

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

在您的情况下,该函数可以按如下方式使用。
  1. Mark all places for simultaneous insertions (except one) using Vim marks (by means of m command).
  2. Actually insert text in the one place that has not been marked.
  3. Run the function:

    :call MarksRepeat(‹marks›, '.')
    

谢谢,运行良好。我正在考虑重写它,不使用标记(因为我对编程 vim 完全不熟悉,所以这可能需要一些时间,我甚至不确定是否可能,但感谢您让我开始!) - proto-n
有趣的解决方案,使用标记。看看我的解决方案,不需要特殊函数。(使用:folddoclosed - darcyparker

5
你可以在一个地方插入文本,一次性完成,然后使用 . 在你想要文本的每个其他位置重复插入。
这与您所要求的相反,因为您希望在输入文本之前标记位置,但它以相同的击键次数给您相同的结果。 :)


3
ib的回答和多选vim插件很有趣,但以下是一个不需要特殊功能或插件的建议。
暂时将foldmethod=manual,然后使用zf标记要操作的块。
最后,使用ex命令:folddoclosed在折叠块上执行ex命令。
例如::folddoclosed norm Iinsert some text at the front 请注意,您可以在任何折叠组上使用:folddoclosed,因此您可以使用其他foldmethods...但通常手动创建折叠是有意义的。
您还可以使用视觉标记,然后使用:norm,这会给您:'<,'>norm......但视觉标记只允许您选择连续的行范围。使用折叠和:folddoclosed,您可以一次操作多个行范围。
另一个提示...为了节省输入:folddoclosed的时间,我会键入:fo<shifttab><shifttab><shifttab>

使用手动折叠作为标记是一个非常好的想法!但与尝试使用标记不同,这里不可能在这些行上存储特定位置,因为折叠是逐行对象。无论如何,多个光标与Vim编辑模式不搭配。 - ib.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接