2013-05-08 54 views
1

我想在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 
+1

尝试在给定的行上按下“Ctrl-g”。实际上,它比':。='提供更多的细节。 – devnull 2013-05-08 10:58:13

回答

4

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

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

6
  • 只使用普通模式命令:

    你可以做y}猛拉从当前行的一切,包括一个空行,划定Vim认为这是一个“段落”。这可能会或可能不会工作,具体取决于您的编码风格。

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

    您可以设置number选项,该选项允许您查看绝对行号,因此可以执行y10G“从这里抽取所有内容到第10行”。

    您可以设置relativenumber选项,该选项允许您查看相关的行号,因此可以执行y5j“从这里抽取所有内容到下面5行”。

    你可以做V/foo<CR>y来从这里拉开所有的东西到foo linewise。

    更一般地说,你可以简单地使用可视化模式来选择你想要的和想要的。

    您也可以在班级的第一行用ma设置一个标记,将光标移动到最后一行并做y'a(这听起来像Lovecraftian神的名字)。

  • 使用Ex命令:

    由于上述number选项显示绝对行号,你可以看到,在班线10结束,并做:.,10y

    由于上述relativenumber选项显示相对行号,可以看到该类结束5线下方,并做:,+5y(下降隐含.)。

  • 使用您的状态行(或没有):

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

  • 使用的Vimscript:

    您可以使用line('.')检索当前行的数量。

  • 使用自定义文本的对象:

    有许多关于vim.org的缩进块,函数参数和许多其他事情上的自定义文本的对象。也许有一个Python类。

更一般地,我建议你设置任何rulernumberrelativenumber永久您~/.vimrc和习惯它。

  • ruler是一堆的侵入性最小的,但它也是最有限的:但你知道你在哪里,当你要定义一个目标没有帮助的。

  • number是最经典的,可以用来轻松定位特定的线。

  • relativenumber起初有点怪异,并且像number一样,可以很容易地用于定位特定的线。

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

+0

太棒了! 'y}'完全适合Python的目的。我无法正确使用的一个是*你可以':设置数字'并执行'y10G' *。我收到*“E488:拖尾字符”*错误。另外,我会添加':set nonu'来退出':set number'模式。谢谢你这么全面的解释 – fedorqui 2013-05-08 11:44:26

+0

这些是两个分开的命令:':set number'用来显示绝对行号,'y10G'是另一个从这里到第10行的命令。 ':set nu'和':set rnu'仅用于激活行号,并不意味着每次要键入多行时都要输入。这将是疯狂无益!只需在'〜/ .vimrc'中添加其中一个或其他设置即可。 – romainl 2013-05-08 12:53:36

+0

我已添加更多信息。 – romainl 2013-05-08 17:29:30

2

尝试在命令模式当前行的

  1. :.=返回的行号在屏幕的底部下面
  2. yNyNyy拷贝下一个N行,包括电流线
  3. p糊剂的复制文本的当前行之后

另外,

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

+0

谢谢! ':。='适合这个目的。另一个答案也建议'Ctrl-g'选项获取更多信息。 – fedorqui 2013-05-08 11:48:16

1

让vim寄存器来完成这个任务。如果要复制线X到线Y

1)将光标移到线X

2)的第一个字符键入“MA”何苦计算行

例如。这会将当前光标位置保存在寄存器“a”中。

3)将光标移动到线Y.

4)的最后一个字符输入 “y`a”。复制完成后

5)p糊剂复制的文本

该方法可以工作不仅线,但块,话甚至在字符。

+0

非常好!我不知道这种注册方法。我还修复了代码中的格式,只是很小的事情。谢谢! – fedorqui 2013-05-08 11:53:03

+0

如果您想将linex复制到y行,只需执行':xty' – Kent 2013-05-08 12:54:04

+0

谢谢@Kent。我得到的只是复制的'x'行。 – fedorqui 2013-05-08 14:18:11

相关问题