9

我想创建一个映射的 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;

带有块选择和组合键。

4

3 回答 3

7

对 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;
于 2013-05-02T10:19:42.640 回答
7

没有插件

在这种情况下

foo = 1
fizzbuzz = 2
bar = 3

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

0f=10iSPACEESCj

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

应用宏 M 次(对于 M 行)并得到

foo           = 1
fizzbuzz           = 2
bar           = 3

然后使用删除所有字符的宏删除过多的空格,直到某个列 N:

0f=d12|j

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

对每一行重复并得到

foo        = 1
fizzbuzz   = 2
bar        = 3

您可以将这两个宏合二为一:

0f=10iSPACEESCd11|j

于 2020-05-30T00:53:04.937 回答
5

为此有两个插件:较早的Align - Help people to align text、eqns、声明、表格等,或Tabular

于 2013-01-26T17:48:28.493 回答