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

11

我想创建一个映射的 vim 命令,帮助我在多行中对变量进行赋值时进行对齐。假设我有以下文本文件:

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

如果我选择多行并使用下面的正则表达式,请注意所有行中第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;

使用块选择和按键组合。


你可以做的一件事是删除类似这样的可视块开头的空格::'<,'>s/\%V *// - Vaughn Cato
4个回答

9

无需插件

在这种情况下

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

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;

5

“Tabular”非常出色:对于您的示例,您只需要在块的任何一行上键入:Tab /=即可。 - glts
这正是我所需要的。你有什么想法可以让"final int foo = 3;"和"public boolean bar = false;"两行中的每个标记对齐吗?我尝试了一下,但没有什么好结果。 - chardson

0
一个基于正则表达式的解决方案是:
``` :%g/^.*/norm f=15i ``` 这个命令在等号之间添加了15个空格。
接下来是:
``` :%s/\%>8c.*=/=/g ``` 这个命令用等号替换了超过第8列的多余空格。
你还可以使用以下命令进行多列对齐:
``` :%s/\s/ /g ```
然后是:
``` :%s/\([^,]\{10}\)\(\s\+\)/\1/g ```
示例:
foo =1; barbar
barbar =2; asdasd
asdfasd =3; baz
jjkjfh =4; foo
baz =5; jjjasd

转换为:

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

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