在vim中重新格式化一个不错的列布局

我在csv文件中有这个数据集

1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153 1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917 

正如你所看到的,这些数字的格式不同,并且没有alignment。 有没有一种方法在vim快速alignment列正确,所以结果是这样的

 1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504,0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153 1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644,0.00078635, 0.000730052,0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669,0.00230171, 0.00217917 

用ctrl-v复制和粘贴部分会很棒。 任何提示?

如果你在某种UNIX(Linux等)上,你可以通过列命令(1)作弊和过滤:

 :%!column -t 

有时我们只想alignment两列。 在这种情况下,我们不需要任何插件,可以使用像这样的纯Vimfunction:

  1. select一个分隔符。 在OP的post中,这是一个逗号,在我的例子中这是=
  2. 在它之前/之后添加空格。 我使用s/=/= ...spaces... /在视觉select这个。
  3. find最长的单词并将光标放在它之后。
  4. 使用dw和垂直移动删除所有额外的空格。

这种技术的例子如下所示:

例

我不觉得自己需要经常调整以安装另一个插件,所以这是我完成它的首选方式 – 尤其是它不需要太多的思考。

正如sunny256所build议的那样, column命令是在Unix / Linux机器上执行此操作的好方法,但是如果您想在纯Vim中执行此操作(以便可以在Windows中使用),最简单的方法是安装alignment插件,然后执行:

 :%Align , :%s/\(\s\+\),\s/,\1/g 

第一行alignment逗号上的条目,第二行移动逗号,使其与前面的值齐平。 你也许可以使用AlignCtrl来定义一个完整的自定义映射,但我永远不会记得如何使用它…

编辑

如果您不介意条目之间的两个空格,并且希望在一个命令中执行此操作,则还可以执行以下操作:

 :%Align ,\zs 

这是一个很好的回答,使用vimmacros: https : //stackoverflow.com/a/8363786/59384 – 基本上,你开始录制一个macros,格式化第一列,停止录制,然后重复所有剩余的行的macros。

从该答案复制/粘贴:

 qa0f:w100i <Esc>19|dwjq4@a 

注意100i之后的单个空间,意思是“按下转义” – 不要直接input“”。

翻译:

 qa -- record macro in hotkey a 0 -- go to beginning of line f: -- go to first : symbol w -- go to next non-space character after the symbol 100i <Esc> -- insert 100 spaces 19| -- go to 19th column (value 19 figured out manually) dw -- delete spaces until : symbol j -- go to next line q -- stop recording macro 4@a -- run the macro 4 times (for the remaining 4 lines) 

你可以使用csv.vim插件。

 :%ArrangeColumn 

但是,这不会完全符合您所要求的:它将正确调整单元格的内容,而您的值由小数点或第一个数字alignment。

该插件有许多其他有用的命令来处理CSV文件。

另外如果你有很长的列,可以很方便地禁用默认包装

 :设置nowrap
 :%!列-t

(注意在debian中,如果你想分割多个相邻的分隔符,你还可以select列-n)

很老的问题,但是我最近利用了一个优秀的vim插件,可以随时或事后(根据您的用例要求)启用表格格式化:

https://github.com/dhruvasagar/vim-table-mode

我写了python脚本,它允许用户在vim之外基本上将任何types的文本串起来。 不知道这是否适用于Windows或Mac用户。

columnice.py要点

在vim中使用。

 :'<,'>!columnice = 

这将使用等号作为分隔符。 这个分隔符不会被丢弃。

我们现在也有由junegunn编写的神话般的EasyAlign插件。

从自述文件中演示GIF: