2017-04-07 64 views
1

1)是否有自动缩进/重复在一组行上,而不是整个文件?在所选文本的vim中自动缩进

set shiftwidth=4 
set expandtab 
set tabstop=4 

已在我的.vimrc中定义。

我要的是选择一堆线,只对他们适用的压痕。这是因为该文件很大,我只想清理我的代码行。通过做:retab,我将不得不强制整个文件进行重新缩进。

例如选择下面的代码和缩进自动

def hello(self): 
line1 
line2 

def hello(self) 
    line1 
    line2 

2)是否有可以逆转标签任何方式? Eclipse中的Shift-Tab。它返回4个空格。

+0

当你说你已经设置了shifttab = 4,我假设你的意思是'shiftwidth'? Vim没有任何'shifttab'设置。 – DJMcMayhem

+0

你能澄清,如果你有的例子是一个空间或选项卡? (SO不区分两者很好) – DJMcMayhem

+0

在第一个空格中,第二个空格有4个空格(1个选项卡)。 – infoclogged

回答

1

我要的是选择一堆线,只有在他们申请压痕

您可以将缩进到Visual模式的某些行。为此请按照下列步骤操作:

  1. 位置的第一行光标缩进

  2. 通过键入转变 + v

  3. 向下移动进入可视化模式,打字Ĵ,直到到达最后一行缩进(或者你可以键入线# + G如果您知道要缩进的最后一行的行号)。

  4. 类型>

另一种解决方案是在命令行模式中的正则表达式来做到这一点:

2,5s/\v(.*)/\t\1/g

在这里,线路范围中的前两个数字指定正则表达式(在这种情况下,从第2行到第5行)。

+0

第四步:输入'='。调用格式化函数 – komar

+1

步骤4或> with或=会失败。正如你所看到的那样,>将仅仅前进4(shiftwidth = 4),其中在上面的例子中,只需要3个额外的空间(因为一个空间已经存在) – infoclogged

+0

@infoclogged我明白了你的观点,那么你可以使用正则表达式:'2,5s/\ v \ s(。*)/ \ t \ 1/g' – Sergio

0

要在同一时间回答您的两个问题,你可以使用><运营商。由于他们是运营商,他们的行为就像ydc,和所有其他运营商做的,所以你必须与运动提供给他们。例如,将>>缩进电流线(带有4个空格),>j将缩进当前行和下方线。 >G会将所有内容缩进缓冲区的末尾等。

同样,<将不管您指定的内容。

在您的具体示例中,我会推荐两种不同的方法。

  1. 使用正常模式。这一点有赖于你的功能有多大。如果只是两行,则可以将光标放在行1,并键入<j>,。 (当然,如果你的函数有两行以上,你需要调整)。不幸的是,您需要在重新注册之前进行unindent,否则您最终会得到5个空格,我认为您不想要这些空格。

  2. 使用可视化模式。除非您修改您的.vimrc,否则这个方法稍微不方便,因为在视觉模式下调用><会丢失您的视觉选择。这就是为什么我在我的.vimrc如下:

    "Make it easier to indent a visual selection several times. 
    xnoremap > >gv 
    xnoremap < <gv 
    

    有了这个设置,您可以直观地选择你想缩进当前行,然后做<>。海事组织,这是最好的解决方案,我经常使用这种工作流程。

+0

在第一个点中不幸的部分让我问这个问题。 vim中没有智能缩进吗? Eclipse有它,并且智能化,例如即使是4的倍数的边界,也可以使光标移动3(4的倍数的边界)。 – infoclogged

0

大多数(如果不是全部的话)Ex命令需要一个范围,因此您只需在视觉上选择线条并执行:'<,'>retab即可。

:12,16retab

:.,+9retab

依此类推。

参见:help :retab:help :range

+0

我的问题中,我错了retab。 Retab在我的代码行中根本不会工作,因为我用.vimrc中的expandtab替换了带空格的选项卡。解决方案会像indent边界一样,但我不认为vim有这个。 (我在eclipse中广泛使用了这个) – infoclogged