如何在VI编辑器中知道光标所在行?

4

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

2
尝试在给定行上按 Ctrl-g 键。实际上,这比 :.= 给出了更多的细节。 - devnull
4个回答

10

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

要复制一个块,请先到达要复制的行的开头位置0。按下v进入可视化模式。移动到要复制的最后一行。执行y命令进行复制。(现在可视选择已经存储在缓冲区中。)


7
  • 仅使用正常模式命令:

    你可以使用y}复制从当前行到下一个空行(即Vim认为的“段落”)的所有内容。这可能取决于你的代码风格是否适用。

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

    你可以设置number选项,以便查看绝对行号,因此可以执行y10G,“复制从此处到第10行的所有内容”。

    你可以设置relativenumber选项,以便查看相对行号,因此可以执行y5j,“复制从此处到下面5行的所有内容”。

    你可以执行V/foo<CR>y,以便按行复制从此处到foo的所有内容。

    更一般地,你可以直接使用可视模式选择要复制的内容并进行复制。

    你还可以在类的第一行上设置标记ma,将光标移动到其最后一行并执行y'a(这听起来像是Lovecraftian神灵的名字)。

  • 使用 Ex 命令:

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

    由于上述的relativenumber选项显示相对行号,因此可以看到类在下面5行结束,并执行:,+5y(省略了隐含的.)。

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

    如果你有状态栏,你可以执行:set ruler以便在其右侧显示当前行号。如果没有状态栏,则在命令行右侧显示。

  • 使用 Vimscript:

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

  • 使用自定义文本对象:

    vim.org上提供了许多自定义的文字对象,可用于缩进块、函数参数和其他许多东西。也许有一个适用于Python类的。

总之,我建议你在~/.vimrc中永久设置rulernumberrelativenumber,并逐渐习惯它们。

  • ruler 是这几个选项中最不侵入的,但也是最受限制的:你知道自己在哪里,但在想要定义目标时没有任何帮助。

  • number 是最经典的选项,可以轻松地定位到特定行。

  • relativenumber 刚开始有点奇怪,像 number 一样,可以轻松地定位到特定行。

选择 numberrelativenumber,就我而言,是一种口味问题。我认为 relativenumber 很直观,但也因人而异。


太棒了! y} 在Python方面完美地工作了。我无法正确使用的是 *你可以:set number并执行y10G*。我得到了一个“E488: 尾随字符”错误。另外,我会添加:set nonu来退出:set number模式。感谢您提供如此全面的解释。 - fedorqui
这是两个不同的命令::set number 启用绝对行号的显示,而 y10G 是另一个命令,它从当前行复制到第 10 行。:set nu:set rnu 只用于激活行号,根本不需要每次想要复制多行时都输入。那样做效率极低!只需在您的 ~/.vimrc 文件中添加其中一个设置即可。享受吧! - romainl

5
在命令模式下尝试以下操作:
  1. :.= 返回当前行号并显示在屏幕底部
  2. yNyNyy 复制下N行,包括当前行
  3. p 将复制的文本粘贴到当前行后面
此外,在命令模式下输入:set nu! 可以打开/关闭每行开头的行号。

谢谢! :.= 对于这个目的来说是可以的。另一个答案还建议使用 Ctrl-g 选项以获取更多信息。 - fedorqui

1
让vim寄存器来完成这个任务,为什么要费力地计算行数。
例如,如果您想将第X行复制到第Y行:
1)将光标移动到第X行的第一个字符。
2)键入“ma”。这将在寄存器“a”中保存当前光标位置。
3)将光标移动到第Y行的最后一个字符。
4)键入“y`a”。复制完成
5)键入“p”粘贴复制的文本。
这种方法不仅适用于行,还适用于块、单词甚至字符。

太好了!我不知道这个注册方法。我还修复了你代码中的格式,只是一些微小的东西。谢谢! - fedorqui
如果你想将行x复制到行y,只需执行:xty - Kent
谢谢,@Kent。我得到的只是x行被复制了。 - fedorqui
@fedorqui 是的,x和y是两个行号。 :) 也许我误解了重点。 - Kent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接