我想创建一个映射的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;
使用块选择和键组合。
答案 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