在vim中的空白之后轻松对齐字符

时间:2013-01-26 16:49:03

标签: regex vim cursor

我想创建一个映射的vim命令,它可以帮助我对多行中的变量进行对齐。想象一下,我在文件中有以下文字:

foo                     = 1;
barbar            = 2;
asdfasd    = 3;
jjkjfh                = 4;
baz              = 5;

如果我选择多行并使用下面的正则表达式,注意第10列在所有行的空白处,第10列之后的杂散空格将被删除到等号。

:'<,'>s/^\(.\{10}\)\s*\(=.*\)$/\1\2/g

结果如下:

foo       = 1;
barbar    = 2;
asdfasd   = 3;
jjkjfh    = 4;
baz       = 5;

有没有办法在执行可视块选择时获取当前光标位置(特别是列位置)并在正则表达式中使用该列?

或者,如果可以在所选行上找到任何等号的最大列并插入空格,那么所有等号都按列对齐,这比解决上一个问题更为可取。想象一下快速转换:

foo = 1;
barbar = 2;
asdfasd = 3;
jjkjfh = 4;
baz = 5;

为:

foo     = 1;
barbar  = 2;
asdfasd = 3;
jjkjfh  = 4;
baz     = 5;

使用块选择和键组合。

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

对Tabular和Align不完全满意,我最近构建了一个名为vim-easy-align的类似但更简单的插件。

查看演示截屏视频:https://vimeo.com/63506219

对于第一种情况,只需视觉选择线条并输入命令:EasyAlign=即可。

如果您已定义了一个映射,例如,

vnoremap <silent> <Enter> :EasyAlign<cr>

只需两次按键即可完成相同操作:Enter=

您在评论中提到的案例

final int foo = 3;
public boolean bar = false;

可以使用“:EasyAlign * \”命令轻松对齐,或使用前面提到的映射,Enter,*和空格键,产生

final  int     foo = 3;
public boolean bar = false;

答案 2 :(得分:1)

没有插件

在这种情况下

foo = 1
fizzbuzz = 2
bar = 3

您可以使用宏添加许多空格:

0 f = 1 0 i SPACE ESC j

其中10是任意数字,只是为了增加足够的空间。

应用宏M次(对于M行)并获取

foo           = 1
fizzbuzz           = 2
bar           = 3

然后使用宏删除多余的空格,该宏将删除所有字符,直到第N列为止

0 f = d 1 2 | j

其中12是要对齐的列号,而 | 是竖线( SHIFT + \ )。 1 2 | 一起是“转到第12列”命令。

每行重复并获得

foo        = 1
fizzbuzz   = 2
bar        = 3

您可以将两个宏合并为一个:

0 f = 1 0 i SPACE ESC d 1 1 | < kbd> j