【问题标题】:Vim duplicate line multiple times with 2 keypressesVim 用 2 次按键多次重复行
【发布时间】:2017-05-03 18:46:07
【问题描述】:

我使用这个键映射来复制一行,然后转到这个新创建的行上的相同光标位置:

nnoremap , mqYp`qj

这是做什么的:

  1. 创建标记“q”
  2. 拉线
  3. 粘贴/放置行(当前行下方,光标现在位于新行的开头)
  4. 回到上一行标记
  5. 向下移动一行。 (光标现在位于上一行开头的同一位置的新行上)

这工作得很好,但是在命令前面放一个数字时我发现了一个缺陷。想象一下,我想将这条线复制 10 次。它基本上会尝试创建10个标记。我可以为此做Y10p,我明白这一点。我对这种方法的问题是,我的光标位置与我在第一行的光标位置不同,即我正在复制的那个位置。

所以我正在寻找一种方法来基本上完成10,,使用我之前制作的映射,并在最后一行结束,与我在第一行的光标位置相同。请注意,我只使用 IdeaVIM 来编写代码,这意味着我无法为此创建任何函数。

是否有可能让这个10, 在这种情况下工作?

编辑#1:

示例文本

# Start
# Initialize new variables
new_invoice_name_one = 'New Name One'
new_invoice_name_two = 'New Name Two'
new_invoice_address_one  = 'New Address One'

执行的命令:3,,光标位于第 2 行的第一个 I

期望的输出

# Start
# Initialize new variables
# Initialize new variables
# Initialize new variables
# Initialize new variables

new_invoice_name_one = 'New Name One'
new_invoice_name_two = 'New Name Two'
new_invoice_address_one  = 'New Address One'

光标位于第 5 行的第一个 I `

编辑#2:

我在LetHandler.javahere 看到了一些潜力,但是我似乎无法弄清楚如何使用它来匹配用例。另一方面,here 表示根本不支持。

【问题讨论】:

    标签: ideavim


    【解决方案1】:

    当我玩 vimgolf 时,我有时会使用一个技巧 [count]@='...。它可以用于您的要求。

    你可以映射:

    nnoremap , @='mqYp`q'<cr>
    

    然后你可以简单地按200,来实现你想要的。

    【讨论】:

    • 加上j (nnoremap , @='mqYp`qj'&lt;cr&gt;),这在 VIM 中可以正常工作。但是,IdeaVIM 似乎不支持这一点(如预期的那样)。 200, 与仅键入 , 相比没有什么不同。即使, 的工作方式与此命令在 VIM 中的工作方式不同。它复制当前行,然后在复制的行下方移动一行(使用我编辑的命令,因此包括j
    • @EdwinvanRooij 我没有注意到你在ideavim中需要这个。但是,我也使用ideavim,只是为了非常基本的vim 功能。毕竟它不是 vim,一些模拟是错误的。但我不得不说,它已经足够好了。我有一个相当长(>1000 行)的 vimrc 文件,它正在增加,因为我不时更改配置、创建新功能等。但我不会在ideavim上投入太多时间。
    • 对我来说,IdeaVIM 是一个巨大的东西。我在 IntelliJ IDE(CLion、Android Studio、PyCharm 等)中进行所有编程。例如,我注意到自己经常复制打印语句。这是此功能的一个用例。我什至将nnoremap ; :action VimFilePrevious&lt;cr&gt; 映射到最后使用的选项卡。感觉如此流畅和高效。无论如何,这就是为什么我非常渴望得到这个工作。我将在任何语言和我使用的任何 IDE 中使用它。 + 它为我的其他命令开辟了可能性。
    【解决方案2】:

    您可以通过粘贴到当前行的上方来实现此目的。这样做nnoremap , YmqP`q

    更新

    你不能这样做,因为 vim 的键映射只是字符串连接。实现此目的的一种方法是预定义宏。把这个放到相关的rc文件中,

    let @q="mqYP`q"
    nnoremap , @q
    

    【讨论】:

    • 也许我还没有说清楚,我想复制并粘贴 currentx 次。 10, 与您一起映射会拉出 next 十行。
    • @EdwinvanRooij 更新的解决方案是否适合您?
    • 它没有,IdeaVIM 中没有任何反应。在普通的 VIM 中,这是一个很好的解决方案。我想在回帖之前继续在 IdeaVIM 中进行试验,哦,好吧。然而,我注意到某种进展表明它也可能在 IdeaVIM 中工作,当我输入你的 let 作为命令时,它显示 VIM - Only simple '=' assignments are supported in 'let' expressions
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    相关资源
    最近更新 更多