2

我想复制粘贴一些行vi

我有一个像

python class1 def:
   code code code
   ...
   code code code
   last line class1

python class2 def:
   code code code
   ...
   code code code

我想复制整个class1. 我试图用 来做到这一点yNy,所以我需要得到N,也就是说,计算班级的行数。

python class1 def:然后我认为获得(假设是X)和(Y)的行号会很好last line class1,计算N=Y-X,去类的第一行并做yNy。但是,我无法弄清楚如何获得行号。

那么,有什么方法可以知道我在哪一行?一般来说,有没有其他方法可以像我指出的那样复制粘贴整个块?

这是我的vi版本:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:44:45)
Included patches: 1-547
4

4 回答 4

7

当前行号可以通过 获取:.=Ctrl-g提供更多详细信息,包括文件名、列信息、...

要复制块,请转到要复制的行的开头0。击中v将启动视觉模式。导航到要复制的最后一行。扬克y。(视觉选择现在在缓冲区中。)

于 2013-05-08T11:09:32.990 回答
6
  • 仅使用正常模式命令:

    您可以y}将所有内容从当前行拉到下一个空行(包括下一个空行),从而界定 Vim 认为的“段落”。根据您的编码风格,这可能会或可能不会起作用。

    仍然使用“段落”的概念,您可以yipyap“段落”中的任何位置进行操作。

    您可以设置number允许您查看绝对行号的选项,因此可以y10G“将所有内容从此处拉到第 10 行”。

    您可以设置relativenumber允许您查看相对行号的选项,因此可以y5j“将所有内容从此处拉到下面的 5 行”。

    您可以V/foo<CR>y将所有内容从这里foo拉到 linewise。

    更一般地说,您可以简单地使用可视模式来选择您想要的内容并将其拉出。

    你也可以在类的第一行用 设置一个标记ma,将光标移动到它的最后一行并做y'a(这听起来像一个洛夫克拉夫特神灵的名字)。

  • 使用 Ex 命令:

    因为前面提到的number选项显示了绝对行号,所以你可以看到类在第 10 行结束并且 do :.,10y

    因为上述relativenumber选项显示了相对行号,您可以看到该类在下面的 5 行结束并执行:,+5y(删除了隐含的.)。

  • 使用您的状态栏(或不使用):

    如果您有一个,则可以:set ruler将当前行号显示在状态栏的右侧,如果您没有状态行,则可以在命令行的右侧显示。

  • 使用 Vimscript:

    您可以使用line('.')来检索当前行的编号。

  • 使用自定义文本对象:

    vim.org 上有许多自定义文本对象可用于缩进块、函数参数和许多其他内容。也许有一个用于 Python 类。

更一般地说,我建议您在您的设备中设置rulernumber永久relativenumber设置~/.vimrc并习惯它。

  • ruler是其中侵入性最小的,但也是最有限的:你知道自己在哪里,但是当你想定义一个目标时它根本没有帮助。

  • number是最经典的,可用于轻松定位特定行。

  • relativenumber一开始有点奇怪,就像number,可以很容易地用于定位特定行。

就我而言,选择number或是一个品味问题。relativenumber我觉得relativenumber很直观,YMMV。

于 2013-05-08T11:09:18.100 回答
3

在命令模式下尝试以下操作

  1. :.=返回屏幕底部当前行的行号
  2. yNyNyy复制接下来的 N 行,包括当前行
  3. p在当前行之后粘贴复制的文本

此外,

:set nu!在命令模式下将打开/关闭每行开头的行号。

于 2013-05-08T11:10:56.517 回答
1

让 vim 寄存器来完成这个任务。为什么要计算线

例如,如果您想将第 X 行复制到第 y 行

1) 将光标移动到第 X 行的第一个字符。

2) 键入“ma”。这会将当前光标位置保存在寄存器“a”中。

3) 将光标移动到 Y 行的最后一个字符。

4) 输入“y`a”。复制完成

5) p 粘贴复制的文本

这种方法不仅可以用于行,还可以用于块,甚至是字符。

于 2013-05-08T11:36:22.690 回答