如何知道VI在光标所在的哪一行?

时间:2013-05-08 10:39:21

标签: linux vim copy copy-paste vi

我想复制粘贴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)和last line class1(Y)的行号,计算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 个答案:

答案 0 :(得分:6)

  • 仅使用普通模式命令:

    你可以y}从当前行到包括下一个空行的所有东西,划定Vim认为是“段落”的内容。根据您的编码风格,这可能有效,也可能无效。

    仍然使用“段落”的概念,您可以在“段落”的任何位置执行yipyap

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

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

    您可以V/foo<CR>y将所有内容从此处抽到foo行。{/ p>

    更一般地说,你可以简单地使用视觉模式来选择你想要的东西并将其拉出来。

    您还可以使用ma在类的第一行设置标记,将光标移动到最后一行并执行y'a(听起来像是一个Lovecraftian神的名字)。< / p>

  • 使用Ex命令:

    由于上述number选项显示绝对行号,您可以看到该类在第10行结束并执行:.,10y

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

    < / LI>
  • 使用您的状态行(或不使用):

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

  • 使用Vimscript:

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

  • 使用自定义文字对象:

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

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

  • ruler是最不具侵略性的,但它也是最有限的:你知道你在哪里但是当你想要定义一个目标时它根本没有帮助。

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

  • relativenumber起初有点奇怪,与number一样,可以轻松用于定位特定的行。

就我而言,选择numberrelativenumber是一个品味问题。我发现relativenumber非常直观,YMMV。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

  1. :.=返回屏幕底部当前行的行号
  2. yNyNyy复制下N行,包括当前行
  3. p将复制的文字粘贴到当前行
  4. 之后

    此外,

    命令模式下的

    :set nu!将打开/关闭每行开头的行号。

答案 3 :(得分:1)

让vim寄存器执行此任务。为什么要麻烦计算行

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

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

2)输入“ma”。这样可以将当前光标位置保存在寄存器“a”中。

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

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

5)p粘贴复制的文本

此方法不仅可以处理行,还可以处理字符,甚至可以处理字符。