【问题标题】:Notepad++ like "multi editing" in Vim?Notepad++ 像 Vim 中的“多重编辑”?
【发布时间】:2010-05-08 21:33:53
【问题描述】:

我正在从 Notepad++ 切换到 Vim 作为我的主要文本编辑器。

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

在 Vim 中可以吗?类似于在可视模式下选择多行后插入,但可以在文本中的任何位置放置光标。

这是我很少使用的功能,也很容易避免;我只是好奇,因为它是唯一一个我在 Vim 中找不到替代品的。

【问题讨论】:

  • 我下载了最新版本的 NP++,当我 ctrl-click 时没有任何反应。我没有两个光标。
  • 是的,必须在首选项/编辑下启用
  • 哇,这有点酷。我不知道那个功能。
  • 不错!我也不知道这个功能。

标签: vim notepad++


【解决方案1】:

没有那种内置功能。

让我建议一个重复命令的函数(例如 . repeating last 更改命令)在给定标记的位置。标记和命令都是 指定为字符串参数。以常规方式指定的标记范围 表达式或scanf-format 说明符已定义。例如,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. 使用 Vim 标记同时插入的所有位置(一个除外) 标记(通过m 命令)。
  2. 实际上是在没有标记的地方插入文字。
  3. 运行函数:

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

【讨论】:

  • 谢谢,工作正常。我正在考虑重写它,而不使用标记(我完全是编程 vim 的新手,所以它需要一些时间,我不确定它是否可能,但感谢你让我开始!)
  • 使用标记的有趣解决方案。查看我不需要特殊功能的解决方案。 (使用:folddoclosed
【解决方案2】:

您可以在一次操作中将文本插入一个位置,然后使用. 在您想要文本的其他位置重复插入。

这与您所要求的相反,因为您想在输入文本之前标记位置,但它以相同的击键次数为您提供相同的结果:)。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      ib 的回复和多选 vim 插件很有意思,但以下是一个不需要特殊功能或插件的建议。

      暂时set foldmethod=manual,然后用zf标记你要操作的块。

      最后,使用 ex 命令:folddoclosed 对折叠块执行 ex 命令。

      例如::folddoclosed norm Iinsert some text at the front

      注意,您可以在任何折叠的行组上使用:folddoclosed,因此您可以使用其他折叠方法...但通常手动创建折叠是有意义的。

      您也可以使用视觉标记,然后是:norm,它会为您提供:'&lt;,'&gt;norm...但是视觉标记只能让您选择连续范围的线条。使用 folds 和:folddoclosed,您可以一次对多个范围的行进行操作。

      另一个提示...为了节省输入:folddoclosed 的时间,我将输入:fo&lt;shifttab&gt;&lt;shifttab&gt;&lt;shifttab&gt;

      【讨论】:

      • 使用手动折叠作为标记是一个非常好的主意!然而,与使用标记的尝试相比,这里不可能在这些线上存储特定位置,因为折叠是逐行对象。无论如何,多个光标与 Vim 编辑模型不匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2011-03-28
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多