我想复制粘贴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
答案 0 :(得分:6)
仅使用普通模式命令:
你可以y}
从当前行到包括下一个空行的所有东西,划定Vim认为是“段落”的内容。根据您的编码风格,这可能有效,也可能无效。
仍然使用“段落”的概念,您可以在“段落”的任何位置执行yip
或yap
。
您可以设置number
选项,该选项可让您查看绝对行号,因此可以执行y10G
,“将此处的所有内容从此处拉到第10行”。
您可以设置relativenumber
选项,该选项可让您查看相对行号,从而能够y5j
“将所有内容从此处拉到下面的5行”。
您可以V/foo<CR>y
将所有内容从此处抽到foo
行。{/ p>
更一般地说,你可以简单地使用视觉模式来选择你想要的东西并将其拉出来。
您还可以使用ma
在类的第一行设置标记,将光标移动到最后一行并执行y'a
(听起来像是一个Lovecraftian神的名字)。< / p>
使用Ex命令:
由于上述number
选项显示绝对行号,您可以看到该类在第10行结束并执行:.,10y
。
由于前面提到的relativenumber
选项显示了相对行号,您可以看到该类在下面的5行结束并执行:,+5y
(删除隐含的.
)。
使用您的状态行(或不使用):
如果您没有状态行,如果您有一个或在命令行的右侧,您可以:set ruler
显示状态栏右侧的当前行号。
使用Vimscript:
您可以使用line('.')
来检索当前行的编号。
使用自定义文字对象:
vim.org上有许多自定义文本对象可用于缩进块,函数参数和许多其他内容。也许有一个Python类。
更一般地说,我建议您在ruler
中永久设置number
,relativenumber
或~/.vimrc
并习惯它。
ruler
是最不具侵略性的,但它也是最有限的:你知道你在哪里但是当你想要定义一个目标时它根本没有帮助。
number
是最经典的,可用于轻松定位特定行。
relativenumber
起初有点奇怪,与number
一样,可以轻松用于定位特定的行。
就我而言,选择number
或relativenumber
是一个品味问题。我发现relativenumber
非常直观,YMMV。
答案 1 :(得分:5)
当前行号可以通过:.=
获得。 Ctrl-g
提供了更多详细信息,包括文件名,列信息,......
要复制块,请转到要复制的行的开头0
。点击v
将启动可视模式。导航到要复制的最后一行。 Yank y
。 (视觉选择现在在缓冲区中。)
答案 2 :(得分:2)
在命令模式下尝试以下操作
:.=
返回屏幕底部当前行的行号yNy
或Nyy
复制下N行,包括当前行p
将复制的文字粘贴到当前行此外,
命令模式下的 :set nu!
将打开/关闭每行开头的行号。
答案 3 :(得分:1)
让vim寄存器执行此任务。为什么要麻烦计算行
例如,如果要将第X行复制到第y行
1)将光标移动到X行的第1个字符。
2)输入“ma”。这样可以将当前光标位置保存在寄存器“a”中。
3)将光标移动到Y行的最后一个字符。
4)输入“y`a”。复制完成
5)p粘贴复制的文本
此方法不仅可以处理行,还可以处理字符,甚至可以处理字符。