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

cha*_*son 7 regex vim cursor

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

foo                     = 1;
barbar            = 2;
asdfasd    = 3;
jjkjfh                = 4;
baz              = 5;
Run Code Online (Sandbox Code Playgroud)

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

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

这是结果:

foo       = 1;
barbar    = 2;
asdfasd   = 3;
jjkjfh    = 4;
baz       = 5;
Run Code Online (Sandbox Code Playgroud)

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

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

foo = 1;
barbar = 2;
asdfasd = 3;
jjkjfh = 4;
baz = 5;
Run Code Online (Sandbox Code Playgroud)

至:

foo     = 1;
barbar  = 2;
asdfasd = 3;
jjkjfh  = 4;
baz     = 5;
Run Code Online (Sandbox Code Playgroud)

块选择和键组合.

Jun*_*hoi 5

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

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

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

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

vnoremap <silent> <Enter> :EasyAlign<cr>
Run Code Online (Sandbox Code Playgroud)

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

您在评论中提到的案例,

final int foo = 3;
public boolean bar = false;
Run Code Online (Sandbox Code Playgroud)

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

final  int     foo = 3;
public boolean bar = false;
Run Code Online (Sandbox Code Playgroud)


Ant*_*nko 5

没有插件

在这种情况下

foo = 1
fizzbuzz = 2
bar = 3
Run Code Online (Sandbox Code Playgroud)

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

0f=10iSPACEESCj

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

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

foo           = 1
fizzbuzz           = 2
bar           = 3
Run Code Online (Sandbox Code Playgroud)

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

0f=d12|j

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

对每一行重复并得到

foo        = 1
fizzbuzz   = 2
bar        = 3
Run Code Online (Sandbox Code Playgroud)

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

0f=10iSPACEESCd11|j