1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
*ft-csv.txt*	For Vim version 7.4	Last Change: Thu, 15 Jan 2015

Author:		Christian Brabandt <cb@256bit.org>
Version:	0.31
Homepage:	http://www.vim.org/scripts/script.php?script_id=2830

The VIM LICENSE applies to the CSV filetype plugin (see |copyright|).
NO WARRANTY, EXPRESS OR IMPLIED.  USE AT-YOUR-OWN-RISK.
                                                           *csv-toc*
1. Introduction.................................|csv-intro|
2. Installation.................................|csv-installation|
3. CSV Commands.................................|csv-commands|
    3.1 WhatColumn..............................|WhatColumn_CSV|
    3.2 NrColumns...............................|NrColumns_CSV|
    3.3 SearchInColumn..........................|SearchInColumn_CSV|
    3.4 HiColumn................................|HiColumn_CSV|
    3.5 ArrangeColumn...........................|ArrangeColumn_CSV|
    3.6 UnArrangeColumn.........................|UnArrangeColumn_CSV|
    3.7 DeleteColumn............................|DeleteColumn_CSV|
    3.8 InitCSV.................................|InitCSV|
    3.9 Header..................................|Header_CSV|
    3.10 Sort...................................|Sort_CSV|
    3.11 CopyColumn.............................|Copy_CSV|
    3.12 MoveColumn.............................|MoveCol_CSV|
    3.13 Sum of a column........................|SumCol_CSV|
    3.14 Create new records ....................|NewRecord_CSV|
    3.15 Change the delimiter...................|NewDelimiter_CSV|
    3.16 Check for duplicate records............|Duplicate_CSV|
    3.17 Normal mode commands...................|csv-mapping|
    3.18 Convert CSV file.......................|csv-convert|
    3.19 Dynamic filters........................|csv-filter|
    3.20 Analyze a column.......................|csv-analyze|
    3.21 Vertical Folding.......................|csv-vertfold|
    3.22 Transposing columns....................|csv-transpose|
    3.23 Transforming into a table..............|csv-tabularize|
    3.24 Add new empty columns..................|AddColumn_CSV|
    3.25 Substitute in columns..................|Substitute_CSV|
4. CSV Filetype configuration...................|csv-configuration|
    4.1 Delimiter...............................|csv-delimiter|
    4.2 Column..................................|csv-column|
    4.3 HiGroup.................................|csv-higroup|
    4.4 Strict Columns..........................|csv-strict|
    4.5 Concealing..............................|csv-conceal|
    4.6 Newlines................................|csv-newline|
    4.7 Highlight column automatically..........|csv-hicol|
    4.8 Fixed width columns.....................|csv-fixedwidth|
        4.8.1 Manual setup
        4.8.2 Setup using a Wizard
    4.9 CSV Header lines........................|csv-header|
    4.10 Number format..........................|csv-nrformat|
    4.11 Move folded lines......................|csv-move-folds|
    4.12 Using Comments.........................|csv-comments|
5. Functions....................................|CSV-Functions|
    5.1 CSVPat()................................|CSVPat()|
    5.2 CSVField()..............................|CSVField()|
    5.3 CSVCol()................................|CSVCol()|
    5.4 CSVSum()................................|CSVSum()|
6. CSV Tips and Tricks..........................|csv-tips|
    6.1 Statusline..............................|csv-stl|
    6.2 Slow CSV plugin.........................|csv-slow|
    6.3 Defining custom aggregate functions.....|csv-aggregate-functions|
    6.4 Autocommand on opening/closing files....|csv-arrange-autocmd|
    6.5 CSV Syntax error........................|csv-syntax-error|
    6.6 Calculating new column values...........|csv-calculate-column|
7. CSV Changelog................................|csv-changelog|

==============================================================================
1. Introduction                                                    *csv-intro*

This plugin is used for handling column separated data with Vim. Usually those
files are called csv files and use the ',' as delimiter, though sometimes they
use e.g. the '|' or ';' as delimiter and there also exists fixedwidth columns.
The aim of this plugin is to ease handling these kinds of files.

This is a filetype plugin for CSV files. It was heavily influenced by
the Vim Wiki Tip667 (http://vim.wikia.com/wiki/VimTip667), though it
works differently. For instructions on installing this file, type
:help add-local-help |add-local-help| inside Vim. For a screenshot, of
how the plugin can be used, see http://www.256bit.org/~chrisbra/csv.gif

==============================================================================
2. Installation						*csv-installation*

In order to have vim automatically detect csv files, you need to have
|ftplugins| enabled (e.g. by having this line in your |.vimrc| file: >

   :filetype plugin on

<
The plugin already sets up some logic to detect CSV files. By default,
the plugin recognizes *.csv and *.dat files as CSV filetype. In order that the
CSV filetype plugin is loaded correctly, vim needs to be enabled to load
|filetype-plugins|. This can be ensured by putting a line like this in your
|.vimrc|: >
    :filetype plugin on
<
(see also |filetype-plugin-on|).

In case this did not work, you need to setup vim like this:

To have Vim automatically detect csv files, you need to do the following.

   1) Create your user runtime directory if you do not have one yet. This
      directory needs to be in your 'runtime' path. In Unix this would
      typically the ~/.vim directory, while in Windows this is usually your
      ~/vimfiles directory. Use :echo expand("~") to find out, what Vim thinks
      your user directory is.
      To create this directory, you can do: >

      :!mkdir ~/.vim
<
      for Unix and >

      :!mkdir ~/vimfiles
<
      for Windows.

   2) In that directory you create a file that will detect csv files. >

    if exists("did_load_csvfiletype")
      finish
    endif
    let did_load_csvfiletype=1

    augroup filetypedetect
      au! BufRead,BufNewFile *.csv,*.dat	setfiletype csv
    augroup END
<
      You save this file as "filetype.vim" in your user runtime diretory: >

        :w ~/.vim/filetype.vim
<
   3) To be able to use your new filetype.vim detection, you need to restart
      Vim. Vim will then  load the csv filetype plugin for all files whose
      names end with .csv.

==============================================================================
3. Commands							*csv-commands*

The CSV ftplugin provides several Commands. All commands are also provided
with the prefix :CSV (e.g. |:CSVNrColumns|)

                                                            *:CSVWhatColumn*
3.1 WhatColumn                                                *WhatColumn_CSV*
--------------

If you would like to know, on which column the cursor is, use >
    :WhatColumn
<
or >
    :CSVWhatColumn
<
Use the bang attribute, if you have a heading in the first line and you want
to know the name of the column in which the cursor is: >
    :WhatColumn!
<
                                                            *:CSVNrColumns*
3.2 NrColumns                                                 *NrColumns_CSV*
--------------

`:NrColumns` and `:CSVNrColumns` outputs the maximum number of columns
available. It does this by testing the first 10 lines for the number of
columns. This usually should be enough. If you use the '!' attribute, it
outputs the number of columns in the current line.

                                                        *:CSVSearchInColumn*
3.3 SearchInColumn                                        *SearchInColumn_CSV*
------------------

Use `:SearchInColumn` or `:CSVSearchInColumn` to search for a pattern within a
specific column. The usage is: >

    :SearchInColumn [<nr>] /{pat}/
<

So if you would like to search in Column 1 for the word foobar, you enter >

    :SearchInColumn 1 /foobar/

Instead of / as delimiter, you can use any other delimiter you like. If you
don't enter a column, the current column will be used.

                                                            *:CSVHiColumn*
3.4 HiColumn                                                    *HiColumn_CSV*
------------

`:HiColumn` or `:CSVHiColumn` <nr> can be used to highlight Column <nr>.
Currently the plugin uses the WildMenu Highlight Group. If you would like to
change this, you need to define the variable |g:csv_hiGroup|.

If you do not specify a <nr>, HiColumn will highlight the column on which the
cursor is. Use >

    :HiColumn!

to remove any highlighting.

If you want to automatically highlight a column, see |csv-hicol|

                                            *:ArrangeColumn* *:CSVArrangeColumn*
3.5 ArrangeColumn                                          *ArrangeColumn_CSV*
-----------------

If you would like all columns to be visually arranged, you can use the
`:ArrangeColumn` or `:CSVArrangeColumn` command: >

    :[range]ArrangeColumn[!]

Beware, that this will change your file and depending on the size of
your file may slow down Vim significantly. This is highly experimental.
:ArrangeCommand will try to vertically align all columns by their maximum
column size.

Use the bang attribute to force recalculating the column width. This is
slower, but especially if you have modified the file, this will correctly
calculate the width of each column so that they can be correctly aligned. If
no column width has been calculated before, the width will be calculated, even
if the '!' has not been given.

If [range] is not given, it defaults to the current line.

By default, the columns will be righ-aligned. If you want them to be
left-aligned, set the buffer variable b:csv_arrange_leftalign = 1 for that
particular buffer, e.g. >

    :let b:csv_arrange_leftalign = 1
<
Note, arranging the columns can be very slow on large files or many columns (see
|csv-slow| on how to increase performance for this command). To prevent you
from accidently changing your csv file, the buffer will be set 'readonly'
afterwards. Note: this command does not work for fixed width columns
|csv-fixedwidth|

See also |csv-arrange-autocmd| on how to have vim automaticaly arrange a CSV
file upon entering it.

                                                        *:CSVUnArrangeColumn*
3.6 UnArrangeColumn                                    *UnArrangeColumn_CSV*
-----------------

If you would like to undo a previous :ArrangeColumn command, you can use this
`:UnArrangeColumn` or `:CSVUnArrangeColumn` command: >

    :[range]UnArrangeColumn

Beware, that is no exact undo of the :ArrangeColumn command, since it strips
away all leading blanks for each column. So if previously a column contained
only some blanks, this command will strip all blanks.

If [range] is given, it defaults to the current line.

                                                        *:CSVDeleteColumn*
3.7 DeleteColumn                                           *DeleteColumn_CSV*
----------------

The command `:DeleteColumn` or `:CSVDeleteColumn` can be used to delete a specific column. >

    :DeleteColumn 2

will delete column 2.

If you don't specify a column number, it will delete the column on which the
cursor is. Alternatively, you can also specify a search string. The plugin
will then delete all columns that match the pattern: >

    :DeleteColumn /foobar
<
will delete all columns where the pattern "foobar" matches.

                                                                *:CSVInitCSV*
3.8 InitCSV							*InitCSV*
-----------
Reinitialize the Plugin. Use this, if you have changed the configuration
of the plugin (see |csv-configuration| ).

                                                                *:CSVHeader*
3.9 Header lines						 *Header_CSV*
----------------
The `:Header` or `:CSVHeader` command splits the csv-buffer and adds a window,
that holds a small fraction of the csv file. This is useful, if the first line
contains some kind of a heading and you want always to display it. This works
similar to fixing a certain line at the top. As optional argument, you can
give the number of columns from the top, that shall be displayed. By default,
1 is used (You can define youre own default by setting the b:csv_headerline
variable, see |csv-header|). Use the '!' to close this window. So this >

    :Header 3

opens at the top a split window, that holds the first 3 lines, is fixed
and horizontally 'scrollbind'ed to the csv window and highlighted using the
CSVHeaderLine highlighting.
To close the header window, use >

    :Header!

Note, this won't work with linebreaks in the column.

Note also, that if you already have a horizontal header window (|VHeader_CSV|),
this command will close the horizontal Header window. This is because of a
limitation of Vim itsself, which doesn't allow to sync the scrolling between
two windows horizontally and at the same time have another window only sync
its scrolling vertically.

Note: this command does not work for fixed width columns |csv-fixedwidth|

                                                *:CSVVHeader* *VHeader_CSV*
If you want a vertical header line, use `:VHeader` or `:CSVVHeader`. This works
similar to the |Header_CSV| command, except that it will open a vertical split
window with the first column always visible. It will always open the first
column in the new split window. Use the '!' to close the window. If you
specify a count, that many columns will be visible (default: the first).

Note, this won't work with linebreaks in the column.
Note also: this command does not work for fixed width columns |csv-fixedwidth|


                                        *:CSVVHeaderToggle* *:CSVHeaderToggle*
                                        *VHeaderToggle_CSV* *HeaderToggle_CSV*
Use the `:HeaderToggle` and `:VHeaderToggle` command to toggle displaying the
horizontal or vertical header line. Alternatively, use `:CSVHeaderToggle` or
`:CSVVHeaderToggle`


                                                                *:CSVSort*
3.10 Sort							*Sort_CSV*
---------
The command `:Sort` or `:CSVSort` can be used to sort the csv file on a
certain column. If no range is given, is sorts the whole file. Specify the
column number to sort on as argument. Use the '!' attribute to reverse the
sort order. For example, the following command sorts line 1 til 10 on the 3
column >

    :1,10Sort 3

While this command >

    :1,10Sort! 3

reverses the order based on column 3.

Instead of a column, you can give the flag 'n' to have it sort numerically.
When no column number is given, it will sort by the column, on which the
cursor is currently.

                                                                *:CSVColumn*
3.11 Copy Column        					 *Copy_CSV*
----------------
If you need to copy a specific column, you can use the command `:CSVColumn` or
`:Column` >

    :[N]Column [a]

Copy column N into register a. This will copy all the values, that are
not folded-away (|csv-filter|) and skip comments.

If you don't specify N, the column of the current cursor position is used.
If no register is given, the default register
|quotequote| is used.

                                                                *:CSVMoveCol*
3.12 Move A Column        					 *MoveCol_CSV*
------------------
You can move one column to the right of another column by using the
`:CSVMoveColumn` or `:MoveColumn` command >

    :[range]MoveColumn [source] [dest]

This moves the column number source to the right of column nr destination. If
both arguments are not given, move the column on which the cursor is to the
right of the current last column. If [range] is not given, MoveColumn moves
the entire column, otherwise, it moves the columns only for the lines within
the range, e.g. given that your first line is a header line, which you don't
want to change >

    :2,$MoveColumn 1 $

this would move column 1 behind the last column, while keeping the header line
as is.


                                                                *:CSVSumCol*
3.13 Sum of a Column        					 *SumCol_CSV*
--------------------
You can let Vim output the sum of a column using the `:CSVSumCol` or `:SumCol`
command >

    :[range]SumCol [nr] [/format/]

This outputs the result of the column <nr> within the range given. If no range
is given, this will calculate the sum of the whole column. If <nr> is not
given, this calculates the sum for the column the cursor is on. Note, that the
delimiter will be stripped away from each value and also empty values won't be
considered.

By default, Vim uses the a numerica format that uses the '.' as decimal
separator while there is no thousands separator. If youre file contains
the numbers in a different format, you can use the /format/ option to specify
a different thousands separator or a different decimal separator. The format
needs to be specified like this:
    /x:y/
where 'x' defines the thousands separator and y defines the decimal
separator and each one is optional. This means, that >

    :SumCol 1 /:,/

uses the default thousands separator and ',' as the decimal separator and >

    :SumCol 2 / :./

uses the Space as thousands separator and the '.' as decimal separator.

Note, if you Vim is compiled without floating point number format (|+float|),
Vim will only aggregate the integer part and therefore won't use the 'y'
argument in the /format/ specifier.

See also |csv-aggregate-functions|

                                                            *:CSVNewRecord*
3.14 Create new Records                                      *NewRecord_CSV*
-----------------------
If you want to create one or several records, you can use the `:NewRecord` or
`:CSVNewRecord` command: >

    :[range]NewRecord [count]

This will create in each line given by range [count] number of new empty
records. If [range] is not specified, creates a new line below the line the
cursor is on and if count is not given, it defaults to 1.


                                                            *:CSVNewDelimiter*
3.15 Change the delimiter                                    *NewDelimiter_CSV*
-------------------------
If you want to change the field delimiter of your file you can use the
`:CSVNewDelimiter` or `:NewDelimiter` command: >

    :NewDelimiter char

This changes the field delimiter of your file to the new delimiter "char".
Note: Will remove trailing delimiters.

                                                            *:CSVDuplicate*
3.16 Check for duplicate records                            *Duplicate_CSV*
--------------------------------
If you want to check the file for duplicate records, use the command
`:Duplicate` or `:CSVDuplicate`: >

    :Duplicate columnlist
<

Columnlist needs to be a numeric comma-separated list of all columns that you
want to check. You can also use a range like '2-5' which means the plugin
should check columns 2,3,4 and 5.

If the plugin finds a duplicate records, it outputs its line number (but it
only does that at most 10 times).

3.17 Normal mode commands					 *csv-mapping*
-------------------------
The csv filetype plugin redefines the following keys as:

<C-Right> or L or W	Move [count] field forwards

<C-Left> or E or H	Move [count] field backwards (but see |csv-mapping-H| 
                        for the movement of H).

<Up> or K		Move [count] lines upwards within the same column

<Down> or J		Move [count] lines downwards within the same column

<Enter>                 Dynamically fold all lines away, that don't match
                        the value in the current column. See |csv-filter|

                        In |Replace-mode| and |Virtual-Replace-mode| does not
                        create a new row, but instead moves the cursor to the
                        beginning of the same column, one more line below.

<Space>                 Dynamically fold all lines away, that match
                        the value in the current column. See |csv-filter|

<BS>                    Remove last item from the dynamic filter.
                        See |csv-filter|

                                                    *csv-mapping-H*
Note how the mapping of 'H' differs from 'E'

H step fields backwards but also stops at where the content of the columns
begins.

If you look into this example (with the cursor being '|')

    aaa,   bbbb,|ccc `

Pressing 'H' moves to

    aaa,   |bbbb,ccc `

Pressing 'H' again moves to

    aaa,|   bbbb,ccc `

Pressing 'H' again moves to 

    |aaa,   bbbb,ccc `

While with 'E', the cursor moves to: 

     aaa,|  bbbb,ccc `

and pressing  'E' again, it would move directly to 

    |aaa,   bbbb,ccc `

Also, the csv plugin defines these text-object:

if                      Inner Field (contains everything up to the delimiter)

af                      Outer Field (contains everything up to and including
                        the delimiter)

Note, that the <BS>, <CR>, K and J overlap Vim's default mapping for |<CR>|,
|<BS>|, |J| and |K| respectively. Therefore, this functionality has been
mapped to a sane default of <Localleader>J and <LocalLeader>K. If you haven't
changed the |<Leader>| or |<LocalLeader>| variables, those the <Localleader>
is equival to a single backslash '\', e.g. \K would run the lookup function on
the word under the cursor and \J would join this line with the previous line.

If you want to prevent the mapping of keys, simply set the global variable
g:csv_nomap_<key> to 1, e.g. to prevent mapping of <CR> in csv files, put >

    let g:csv_nomap_cr = 1
<
into your |.vimrc|. Note, the keyname must be lower case.


                                           *:CSVConvertData* *ConvertData_CSV*
3.18 Converting a CSV File					 *csv-convert*
--------------------------
You can convert your CSV file to a different format with the `:ConvertData`
or `:CSVConvertData` command >

    ConvertData

Use the the ! attribute, to convert your data without the delimiter.

This command will interactively ask you for the definition of 3 variables.
After which it will convert your csv file into a new format, defined by those
3 variables and open the newly created file in a new window. Those 3 variables
define how the text converted.

First, You need to define what has to be done, before converting your column
data. That is done with the "pre convert" variable. The content of this
variable will be put in front of the new document.

Second, you define, what has to be put after the converted content of your
column data. This happens with the "post convert" variable. Basically the
contents of this variable will be put after processing the columns.

Last, the columns need to be converted into your format. For this you can
specify a printf() format like string, that defines how your data will be
converted. You can use '%s' to specify placeholders, which will later be
replaced by the content of the actual column.

For example, suppose you want to convert your data into HTML, then you first
call the >

    :ConvertData

At this point, Vim will ask you for input. First, you need to specify, what
needs to be done before processing the data:

    Pre convert text: <html><body><table> `

This would specify to put the HTML Header before the actual data can be
processed. If the variable g:csv_pre_convert is already defined, Vim will
already show you its' content as default value. Simply pressing Enter will use
this data. After that, Vim asks, what the end of the converted file needs to
look like:

    Post convert text: </table></body></html> `

So here you are defining how to finish up the HTML file. If the variable
g:csv_post_convert is already defined, Vim will already show you its' content
as default value which you can confirm by pressing Enter. Last, you define,
how your columns need to be converted. Again, Vim asks you for how to do that:

    Converted text, use %s for column input: `
    <tr><td>%s</td><td>%s</td><td>%s</td></tr>

This time, you can use '%s' expandos. They tell Vim, that they need to be
replaced by the actual content of your file. It does by going from the first
column in your file and replacing it with the corresponding %s in that order.
If there are less '%s' expandos then columns in your file, Vim will skip the
columns, that are not used. Again If the variable g:csv_convert is already
defined, Vim will already show you its' content as default value which you can
confirm by pressing Enter.

After you hit Enter, Vim will convert your data and put it into a new window.
It may look like this:

    <html><body><table> `
    <tr><td>1,</td><td>2,</td><td>3,</td></tr> `
    <tr><td>2,</td><td>2,</td><td>4,</td></tr> `
    </table></body></html> `

Note, this is only a proof of concept. A better version of converting your
data to HTML is bundled with Vim (|:TOhtml|).

But may be you want your data converted into SQL-insert statements. That could
be done like this: >

    ConvertData!
<
    Pre convert text: `

(Leave this empty. It won't be used).

    Post convert text: Commit; `

After inserting the data, commit it into the database.

    Converted text, use %s for column input: `
    Insert into table foobar values ('%s', '%s', %s); `

Note, that the last argument is not included within single quotation marks,
since in this case the data is assumed to be integer and won't need to be
quoted for the database.

After hitting Enter, a new Window will be opened, which might look like this:

    Insert into table foobar values('Foobar', '2', 2011); `
    Insert into table foobar values('Bar', '1', 2011); `
    Commit; `

Since the command was used with the bang attribute (!), the converted data
doesn't include the column delimiters.

Now you can copy it into your database, or further manipulate it.

3.19 Dynamic filters      					 *csv-filter*
--------------------
If you are on a value and only want to see lines that have the same value in
this column, you can dynamically filter the file and fold away all lines not
matching the value in the current column. To do so, simply press <CR> (Enter).
Now Vim will fold away all lines, that don't have the same value in this
particular row. Note, that leading blanks and the delimiter is removed and the
value is used literally when comparing with other values. If you press <Space>
on the value, all fields having the same value will be folded away.

The way this is done is, that the value from the column is extracted and a
regular expression for that field is generated from it. In the end this
regular expression is used for folding the file.

A subsequent <CR> or <Space> on another value, will add this value to the
current applied filter (this is like using the logical AND between the
currently active filter and the new value). To remove the last item from the
filter, press <BS> (backspace). If all items from the filter are removed,
folding will be disabled.

If some command messes up the folding, you can use |zX| to have the folding
being reinitialized.

By default, the first line is assumed to be the header and won't be folded
away. See also |csv-header|.

If you have set the g:csv_move_folds variable and the file is modifiable, all
folded lines will be moved to the end of the file, so you can view all
non-folded lines as one consecutive area  (see also |csv-move-folds|)

                                           *:CSVFilter* *:Filter* *Filter_CSV*
To see the active filters, you can use the `:Filter` or `:CSVFilter` command.
This will show you a small summary, of what filters are active and looks like
this:

Nr      Match   Col           Name              Value ~
===================================================== `
01       -       07          Price              23.10 `
02       +       08            Qty                 10 `

This means, there are two filters active. The current active filter is on
column 7 (column name is Price) and all values that match 23.10 will be folded
away AND all values that don't match a value of 10 in the QTY column will also
be folded away.
When removing one item from the filter by pressing <BS>, it will always remove
the last item (highest number in NR column) from the active filter values.

Note, that depending on your csv file and the number of filters you used,
applying the filter might actually slow down vim, because a complex regular
expression is generated that is applied by the fold expression. Look into the
@/ (|quote_/|) register to see its value.

Use |zX| to apply the current value of your search register as filter. Use >

    :Filters!

to reapply all values from the current active filter and fold non-matching
items away.

                                                    *:CSVAnalyze* *Analyze_CSV*
3.20 Analyze a Column       					 *csv-analyze*
---------------------
If you'd like to know, how the values are distributed among a certain column,
you can use the `:CSVAnalyze` or `:Analyze` command. So >

    :Analyze 3

outputs the the distribution of the top 5 values in column 3. This looks like
this:

Nr      Count    %      Value ~
============================= `
01      20      50%     10    `
02      10      25%     2     `
03      10      25%     5     `

This tells you, that the the value '10' in column 3 occurs 50% of the time
(exactly 20 times) and the other 2 values '2' and '5' occur only 10 times, so
25% of the time.

                                                 *:CSVVertFold* *VertFold_CSV*
3.21 Vertical Folding       					 *csv-vertfold*
---------------------
Sometimes, you want to hide away certain columns to better view only certain
columns without having to horizontally scroll. You can use the `:CSVVertFold`
or `:VertFold` command to hide certain columns: >

    :VertFold [<nr>]
<
This will hide all columns from the first until the number entered. It
currently can't hide single columns, because of the way, syntax highlighting
is used. This command uses the conceal-feature |:syn-conceal| to hide away
those columns. If no nr is given, hides all columns from the beginning till
the current column.

Use >
    :VertFold!

to display all hidden columns again.

                                                *:CSVTranspose* *Transpose_CSV*
3.22 Transposing a column                                      *csv-transpose*
-------------------------
Transposing means to exchange rows and columns. You can transpose the csv
file, using the `:CSVTranspose` or `:Transpose` : >

    :[range]Transpose
<
command. If [range] is not given, it will transpose the complete file,
otherwise it will only transpose the lines in the range given. Note, comments
will be deleted and transposing does not work with fixed-width columns.

                                                          *:CSVTabularize*
3.23 Transforming into a table                      *:CSVTable* *csv-tabularize*
------------------------------
You  can also transform your csv data into a visual table, using the
`:CSVTabularize` or `:CSVTable`: >

    :CSVTabularize
<
command. This will make a frame around your csv data and substitute all
delimiters by '|', so that it will look like a table.

e.g. consider this data: >
>
First,Second,Third ~
10,5,2 `
5,2,10 `
2,10,5 `
10,5,2 `

This will be transformed into: >

    |---------------------|
    | First| Second| Third|
    |------|-------|------|
    |    10|      5|     2|
    |     5|      2|    10|
    |     2|     10|     5|
    |    10|      5|     2|
    |---------------------|

If your Vim uses an unicode 'encoding', the plugin makes a nice table using
special unicode drawing glyphs (but it might be possible, that those chars are
not being displayed correctly, if either your terminal or the gui font doesn't
have characters for those codepoints). If you use the bang form, each row will
be separated by a line.
You can also visual select a range of lines and use :Tabularize to have only
that range converted into a nice ascii table. Else it try to use the current
paragraph and try to transform it.

If you use the '!' bang argument, between each row, a line will be drawn.

In csv files, you can also use the :CSVTabularize command, in different
filetypes you can use the :CSVTable command (and is available as plugin so it
will be available for non-CSV filetypes).

Set the variable g:csv_table_leftalign=1 if you want the columns to be
leftaligned.

Note: Each row must contain exactly as many fields as columns.

                                                            *:CSVAddColumn*
3.24 Add new empty columns                                   *AddColumn_CSV*
--------------------------
If you want to add new empty columns to your file you can use the
`:CSVAddColumn` or `:AddColumn` command: >

    :[range]AddColumn [column] [count]

By default, this works for the whole file, but you can give a different range
to which the AddColumn command applies. If no arguments are given, the new
empty column will be added after the column on which the cursor is. You can
however add as first argument the column number after which the new column
needs to be added.

Additionally, you can also add a count number to add several columns at once
after the specified column number. You 0 for the column number, if you want to
add several columns after the current column.

                                                            *:CSVSubstitute*
3.25 Substitute in columns                                  *Substitute_CSV*
--------------------------
If you want to substitute only in specific columns, you can use the
`:CSVSubstitute` or `:Substitute` command: >

    :[range]Substitute [column/]pattern/string[/flags]

This means in the range and within the given columns replace pattern by
string. This works bascially like the |:s| command, except that you MUST use
forward slashes / to delimit the command. The optional part `[column/]` can
take either the form of an address or if you leave it out, substitution will
only happen in the current column. Additionally, you can use the `1,5/` form
to substitute within the columns 1 till 5 or you can even use `1,$` which
means to substitute in each column (so in fact this simplifies to a simple
`:s` command whithin the given range. For the use of `[/flags]` see |:s_flags|
Here are some examples: >

    :%Substitute 1,4/foobar/baz/gce

Substitutes in the whole file in columns 1 till 4 the pattern foobar by baz
for every match ('g' flag) and asks for confirmation ('c' flag).

    :%S 3,$/(\d\+)/\1 EUR/g

Substitutes in each column starting from the third each number and appends the
EURO suffix to it.
==============================================================================
4. CSV Configuration					 *csv-configuration*

The CSV plugin tries to automatically detect the field delimiter for your
file, cause although often the file is called CSV (comma separated values), a
semicolon is actually used. The column separator is stored in the buffer-local
variable b:delimiter. This delimiter is heavily used, because you need
it to define a column. Almost all commands use this variable therefore.

4.1 Delimiter							*csv-delimiter*
-------------
To override the automatic detection of the plugin and define the separator
manually, use: >

    :let g:csv_delim=','

to let the comma be the delimiter. This sets the buffer local delimiter
variable b:delimiter.

If your file does not consist of delimited columns, but rather is a fixed
width csv file, see |csv-fixedwidth| for configuring the plugin appropriately.

If you changed the delimiter, you should reinitiliaze the plugin using
|InitCSV|

Note: the delimiter will be used to generate a regular expression that matches
a column. Therefore, you need to escape special characters. So instead of '^'
use '\^'.

4.2 Column							*csv-column*
----------
The definition, of what a column is, is defined as buffer-local variable
b:col. By default this variable is initialized to: >

    let b:col='\%(\%([^' . b:delimiter . ']*"[^"]*"[^' . b:delimiter . ']*'
    \. b:delimiter . '\)\|\%([^' . b:delimiter . ']*\%(' . b:delimiter
    \. '\|$\)\)\)'

This should take care of quoted delimiters within a column. Those should
obviously not count as a delimiter. This regular expression is quite
complex and might not always work on some complex cases (e.g. linebreaks
within a field, see RFC4180 for some ugly cases that will probably not work
with this plugin).

If you changed the b:delimiter variable, you need to redefine the b:col
variable, cause otherwise it will not reflect the change. To change the
variable from the comma to a semicolon, you could call in your CSV-Buffer
this command: >

    :let b:col=substitute(b:col, ',', ';', 'g')

Check with :echo b:col, if the definition is correct afterwards.

You can also force the plugin to use your own defined regular expression as
column. That regular expression should include the delimiter for the columns.
To define your own regular expression, set the g:csv_col variable: >

    let g:csv_col='[^,]*,'

This defines a column as a field delimited by the comma (where no comma can be
contained inside a field), similar to how |csv-strict| works.

You should reinitialize the plugin afterwards |InitCSV|

4.3 Highlighting Group                                         *csv-higroup*
----------------------
By default the csv ftplugin uses the WildMenu highlighting Group to define how
the |HiColumn| command highlights columns. If you would like to define a
different highlighting group, you need to set this via the g:csv_hiGroup
variable. You can e.g. define it in your |.vimrc|: >

    :let g:csv_hiGroup = "IncSearch"

You need to restart Vim, if you have changed this variable or use |InitCSV|

The |hl-Title| highlighting is used for the Header line that is created by the
|Header_CSV| command. If you prefer a different highlighting, set the
g:csv_hiHeader variable to the prefered highlighting: >

    let g:csv_hiHeader = 'Pmenu'
<
This would set the header window to the |hl-Pmenu| highlighting, that is used
for the popup menu. To disable the custom highlighting, simply |unlet| the
variable: >

    unlet g:csv_hiHeader

You should reinitialize the plugin afterwards |InitCSV|

4.4 Strict Columns						*csv-strict*
------------------
The default regular expression to define a column is quite complex
(|csv-column|). This slows down the processing and makes Vim use more memory
and it could still not fit to your specific use case.

If you know, that in your data file, the delimiter cannot be contained inside
the fields quoted or escaped, you can speed up processing (this is quite
noticeable when using the |ArrangeColumn_CSV| command) by setting the
g:csv_strict_columns variable: >

    let g:csv_strict_columns = 1

This would define a column as this regex: >

    let b:col = '\%([^' . b:delimiter . ']*' . b:delimiter . '\|$\)'

Much simpler then the default column definition, isn't it?
See also |csv-column| and |csv-delimiter|

You can disable the effect if you |unlet| the variable: >

    unlet g:csv_strict_columns

You should reinitialize the plugin afterwards |InitCSV|

For example when opening a CSV file you get the Error |E363|: pattern uses
more memory than 'maxmempattern'. In this case, either increase the
'maxmempattern' or set the g:csv_strict_columns variable.


4.5 Concealing					*csv-syntax*	*csv-conceal*
--------------
The CSV plugin comes with a function to syntax highlight csv files. Basically
allt it does is highlight the columns and the header line.

By default, the delimiter will not be displayed, if Vim supports |conceal| of
syntax items and instead draws a vertical line. If you don't want that, simply
set the g:csv_noconceal variable in your .vimrc >

    let g:csv_no_conceal = 1

and to disable it, simply unlet the variable >

    unlet g:csv_no_conceal

You should reinitialize the plugin afterwards |InitCSV|
Note: You can also set the 'conceallevel' option to control how the concealed
chars will be displayed.

If you want to customize the syntax colors, you can define your own groups.
The CSV plugin will use already defined highlighting groups, if they are
already defined, otherwise it will define its own defaults which should be
visible with 8, 16, 88 and 256 color terminals. For that it uses the
CSVColumnHeaderOdd and CSVColumnHeaderEven highlight groups for syntax
coloring the first line. All other lines get either the CSVColumnOdd or
CSVColumnEven highlighting.

In case you want to define your own highlighting groups, you can define your
own syntax highlighting like this in your |.vimrc| >

    hi CSVColumnEven term=bold ctermbg=4 guibg=DarkBlue
    hi CSVColumnOdd  term=bold ctermbg=5 guibg=DarkMagenta
    hi CSVColumnHeaderEven ...
    hi CSVColumnHeaderOdd ...

<
Note, these changes won't take effect, until you restart Vim.


4.6 Newlines						*csv-newline*
------------
RFC4180 allows newlines in double quoted strings. By default, the csv-plugin
won't recognize newlines inside fields. It is however possible to make the
plugin aware of newlines within quoted strings. To enable this, set >

    let g:csv_nl = 1

and to disable it again, simply unset the variable >

    unlet g:csv_nl

It is a good idea to reinitialize the plugin afterwards |InitCSV|

Note, this might not work correctly in all cases. The syntax highlighting
seems to change on cursor movements. This could possibly be a bug in the
syntax highlighting engine of Vim. Also, |WhatColumn_CSV| can't handle
newlines inside fields and will most certainly be wrong.

4.7 Highlight column automatically				*csv-hicol*
----------------------------------
You can let vim automatically highlight the column on which the cursor is.
This works by defining an |CursorMoved| autocommand to always highlight the
column, when the cursor is moved in normal mode. Note, this does not update
the highlighting, if the Cursor is moved in Insert mode. To enable this,
define the g:csv_highlight_column variable like this >

    let g:csv_highlight_column = 'y'

and to disable it again, simply unset the variable >

    unlet g:csv_highlight_column

It is a good idea to reinitialize the plugin afterwards |InitCSV|

4.8 Fixed width columns                                        *csv-fixedwidth*
-----------------------
Sometimes there are no real columns, but rather the file is fixed width with
no distinct delimiters between each column. The CSV plugin allows you to
handle such virtual columns like csv columns, if you define where each column
starts.

Note: Except for |ArrangeColumn_CSV| and the |Header_CSV| commands, all
commands work in either mode. Those two commands won't do anything in the case
of fixedwidth columns, since they don't really make sense here.

4.8.1 Manual setup
------------------
You can do this, by setting the buffer-local variable
b:csv_fixed_width like this >

    let b:csv_fixed_width="1,5,9,13,17,21"

This defines that each column starts at multiples of 4. Be sure, to issue
this command in the buffer, that contains your file, otherwise, it won't
have an effect, since this is a buffer-local option (|local-option|)

After setting this variable, you should reinitialize the plugins using
|InitCSV|

                                                                    *CSVFixed*
4.8.2 Setup using a Wizard
--------------------------
Alternatively, you can setup the fixed width columns using the :CSVFixed
command. This provides a simple wizard to select each column. If you enter
the command: >
    :CSVFixed
<
The first column will be highlighted and Vim outputs:
<Cursor>, <Space>, <ESC>, <BS>, <CR>...
This means, you can now use those 5 keys to configure the fixed-width columns:

   <Cursor> Use Cursor Left (<Left>) and Cursor Right (<Right>) to move the
            highlighting bar.
   <Space>  If you press <Space>, this column will be fixed and remain
            highlighted and there will be another bar, you can move using
            the Cursor keys. This means this column will be considered to be
            the border between 2 fixed with columns.
   <ESC>    Abort
   <BS>     Press the backspace key, to remove the last column you fixed with
            the <Space> key.
   <CR>     Use Enter to finish the wizard. This will use all fixed columns
            to define the fixed width columns of your csv file. The plugin
            will be initialized and syntax highlighting should appear.

Note: This only works, if your Vim has the 'colorcolumn' option available
(This won't work with Vim < 7.3 and also not with a Vim without +syntax
feature).


4.9 CSV Header lines                                        *csv-header*
--------------------
By default, dynamic filtering |csv-filter| will not fold away the first line.
If you don't like that, you can define your header line using the variable
b:csv_fold_headerline, e.g. >

    let b:csv_headerline = 0

to disable, that a header line won't be folded away. If your header line
instead is on line 5, simply set this variable to 5. This also applies to the
|Header_CSV| command.

4.10 Number format                                           *csv-nrformat*
------------------
When using the |SumCol_CSV| command, you can specify a certain number format
using the /x:y/ argument. You can however also configure the plugin to detect
a different number format than the default number format (which does not
support a thousands separator and uses the '.' as decimal separator).

To specify a different thousands separator by default, use >

    let b:csv_thousands_sep = ' '

to have the space use as thousands separator and >

    let b:csv_decimal_sep = ','

to use the comma as decimal separator.

4.11 Move folded lines                                        *csv-move-folds*
----------------------
If you use dynamic filters (see |csv-filter|), you can configure the plugin to
move all folded lines to the end of the file. This only happens if you set the
variable >

    let g:csv_move_folds = 1
<
and the file is modifiable. This let's you see all non-folded records as a
consecutive area without being disrupted by folded lines.

4.12 Using comments                                           *csv-comments*
-------------------
Strictly speaking, in csv files there can't be any comments. You might however
still wish to comment or annotate certain sections in your file, so the CSV
plugin supports Comments.

Be default, the CSV plugin will use the 'commentstring' setting to identify
comments. If this option includes the '%s' it will consider the part before
the '%s' as leading comment marker and the part behind it as comment
delimiter.

You can however define your own comment marker, using the variable
g:csv_comment. Like with the 'commentstring' setting, you can use '%s'
expandos, that will denote where the actual comment text belongs. To define
your own comment string, put this in your |.vimrc| >

    :let g:csv_comment = '#'
<
Which will use the '#' sign as comment leader like in many scripting
languages.

After setting this variable, you should reinitialize the plugins using
|InitCSV|

                                                            *csv-foldtext*
By default, the csv plugin sets the 'foldtext' option. If you don't want this,
set the variable `g:csv_disable_fdt` in your |.vimrc| >

    :let g:csv_disable_fdt = 1

==============================================================================
5. Functions                                                    *CSV-Functions*

The csv plugins also defines some functions, that can be used for scripting
when a csv file is open

5.1 CSVPat()  							*CSVPat()*
------------
CSVPat({column}[, {pattern}])

This function returns the pattern for the selected column. If only columns is
given, returns the regular expression used to search for the pattern '.*' in
that column (which means the content of that column). Alternatively, an
optional pattern can be given, so the return string can be directly feeded to
the |/| or |:s| command, e.g. type: >

    :s/<C-R>=CSVPat(3, 'foobar')<cr>/baz

where the <C-R> means pressing Control followed by R followed by =
(see |c_CTRL-R_=|). A prompt will apear, with the '=' as the first character
on which you can enter expressions.

In this case enter CSVPat(3, 'foobar') which returns the pattern to search for
the string 'foobar' in the third column. After you press enter, the returned
pattern will be put after the :s command so you can directly enter / and the
substitute string.

5.2 CSVField(x,y[, orig])					*CSVField()*
-------------------------
This function returns the field at index (x,y) (starting from 1). If the
parameter orig is given, returns the column "as is" (e.g. including delimiter
and leading and trailing whitespace, otherwise that will be stripped.)

5.3 CSVCol([name])				        	*CSVCol()*
------------------
If the name parameter is given, returns the name of the column, else returns
the index of the current column, starting at 1.

5.4 CSVSum(col, fmt, startline, endline)                        *CSVSum()*
----------------------------------------
Returns the sum for column col. Uses fmt to parse number format (see
|:CSVSumCol|) startline and endline specify the lines to consider, if empty,
will be first and last line.

==============================================================================
6. CSV Tips and Tricks						*csv-tips*

Here, there you'll find some small tips and tricks that might help when
working with CSV files.

6.1 Statusline							*csv-stl*
--------------
Suppose you want to include the column, on which the cursor is, into your
statusline. You can do this, by defining in your .vimrc the 'statusline' like
this: >

    function MySTL()
        if has("statusline")
            hi User1 term=standout ctermfg=0 ctermbg=11 guifg=Black guibg=Yellow
            let stl = ...
            if exists("*CSV_WCol")
                let csv = '%1*%{&ft=~"csv" ? CSV_WCol() : ""}%*'
            else
                let csv = ''
            endif
            return stl.csv
        endif
    endfunc
    set stl=%!MySTL()
<

This will draw in your statusline right aligned the current column and max
column (like 1/10), if you are inside a CSV file. The column info will be
drawn using the User1 highlighting (|hl-User1|), that has been defined in the
second line of the function. In the third line of your function, put your
desired 'statusline' settings as |expression|. Note the section starting with
'if exists(..)' guards against not having loaded the filetype plugin.

Note: vim-airline (https://github.com/bling/vim-airline) by default supports
the csv plugin and enables a nice little csv statusline which helps for
navigating within a csv file. For details, see the Vim-Airline documentation.

                                                                 *CSV_WCol()*
The CSV_WCol() function controls, what will be output. In the simplest case,
when no argument is given, it simply returns on which column the cursor is.
This would look like '1/10' which means the cursor is on the first of 10
columns. If you rather like to know the name of the column, simply give as
parameter to the function the string "Name". This will return the column name
as it is printed on the first line of that column. This can be adjusted, to
have the column name printed into the statusline (see |csv-stl| above) by
replacing the line >

    let csv = '%1*%{&ft=~"csv" ? CSV_WCol() : ""}%*'
<
by e.g.

    let csv = '%1*%{&ft=~"csv" ? CSV_WCol("Name") . " " . CSV_WCol() : ""}%*'

which will output "Name 2/10" if the cursor is in the second column
which is named "Name".

6.2 Slow CSV plugin						*csv-slow*
-------------------
Processing a csv file using |ArrangeColumn_CSV| can be quite slow, because Vim
needs to calculate the width for each column and then replace each column by
itself widened by spaces to the optimal length. Unfortunately, csv files tend
to be quite big. Remember, for a file with 10,000 lines and 50 columns Vim
needs to process each cell, which accumulates to 500,000 substitutions. It
might take some time, until Vim is finished.

You can speed up things a little bit, if you omit the '!' attribute to the
|ArrangeColumn| (but this will only work, if the width has been calculated
before, e.g. by issuing a :1ArrangeColumn command to arrange only the first
line. Additionally you can also configure how this command behaves by setting
some configuration variables.

Also note, using dynamic filters (|csv-filter|), can slow down Vim
considerably, since they internally work with complex regular expressions, and
if you have a large file, containing many columns, you might hit a performance
penalty (especially, if you want to filter many columns). It's best to avoid
those functions if you are using a large csv file (so using strict columns
|csv-strict| might help a little and also setting 're' to 1 might also
alleviate it a little).


6.3 Defining custom aggregate functions		    *csv-aggregate-functions*
---------------------------------------
The CSV plugin already defines the |SumCol_CSV| command, to let you calculate
the sum of all values of a certain column within a given range. This will
consider all values within the range, that are not folded away (|csv-filter|),
and also skip comments and the header lines. The delimiter will be deleted
from each field.

But it may be, that you don't need the sum, but would rather want to have the
average of all values within a certain column. You can define your own
function and let the plugin call it for a column like this:

    1) You define your own custom function in the after directory of your
       vim runtime path |after-directory| (see also #2 below) >

        fun! My_CSV_Average(col)
            let sum=0
            for item in a:col
                let sum+=item
            endfor
            return sum/len(a:col)
        endfun
<
       This function takes a list as argument, and calculates the average for
       all items in the list. You could also make use of Vim's |eval()|
       function and write your own Product function like this >

        fun! My_CSV_Product(col)
            return eval(join(a:col, '*'))
        endfun
<

    2) Now define your own custom command, that calls your custom function for
    a certain column >

            command! -buffer -nargs=? -range=% AvgCol
            \ :echo csv#EvalColumn(<q-args>,
            \ "My_CSV_Average", <line1>,<line2>)
<
        This command should best be put into a file called csv.vim and save
        it into your ~/.vim/after/ftplugin/ directory. Create directories
        that don't exist yet. For Windows, this would be the
        $VIMRUNTIME/vimfiles/after/ftplugin directory.

    3) Make sure, your |.vimrc| includes a filetype plugin setting like this >

        filetype plugin on
<
       This should make sure, that all the necessary scripts are loaded by
       Vim.

    After restarting Vim, you can now use your custom command definition
    :AvgCol. Use a range, for the number of lines you want to evaluate and
    optionally use an argument to specify which column you want to be
    evaluated >

        :2,$AvgCol 7
<
    This will evaluate the average of column seven (assuming, line 1 is the
    header line, which should not be taken into account).

6.4 Autocommand on opening/closing files                *csv-arrange-autocmd*
----------------------------------------
If you want your CSV files to always be displayed like a table, you can
achieve this using the |ArrangeColumn_CSV| command and some autocommands.
Define these autocommands in your |.vimrc| >

    aug CSV_Editing
        au!
        au BufRead,BufWritePost *.csv :%ArrangeColumn
        au BufWritePre *.csv :%UnArrangeColumn
    aug end

Upon Entering a csv file, Vim will visually arrange all columns and before
writing, those columns will be collapsed again. The BufWritePost autocommand
makes sure, that after the file has been written successfully, the csv file
will again be visually arranged.

You can also simply set the variable >

    let g:csv_autocmd_arrange = 1
<
in your vimrc and an autocmd will be installed, that visually arranges your
csv file whenever you open them for editing. Alternatively, you can restrict
this setting to files below a certain size. For example, if you only want to
enable this feature for files smaller than 1 MB, put this into your |.vimrc| >

    let g:csv_autocmd_arrange      = 1
    let g:csv_autocmd_arrange_size = 1024*1024

Note, this is highly experimental and especially on big files, this might
slow down Vim considerably.

6.5 Syntax error when opening a CSV file               *csv-syntax-error*
----------------------------------------
This happens usually, when the syntax script is read before the filetype
plugin, so the plugin did not have a chance to setup the column delimiter
correctly.

The easy way to fix it, is to reverse the order of the :syntax on (|:syn-on|)
and :filetype plugin (|:filetype-plugin-on|) statements in your |.vimrc|

Alternatively, you can simply call |InitCSV| and ignore the error.

6.6 Calculate new columns               *csv-calculate-column*
-------------------------
Suppose you have a table like this:

Index;Value1;Value2~
1;100;3 `
2;20;4 `

And you need one more column, that is the calculated product of column 2 and
3, you can make use of the provided |CSVField()| function using a
|sub-replace-expression| of an |:s| command. In this case, you would do this: >

    :2,3s/$/\=printf("%s%.2f", b:delimiter,
    (CSVField(2,line('.'))+0.0)*(CSVField(3,line('.'))+0.0/

Note: Enter as single line. The result will be this: >

Index;Value1;Value2~
1;100;3;300.00 `
2;20;4;80.00 `
==============================================================================
7. CSV Changelog					       *csv-changelog*

0.31 Jan 15, 2015 "{{{1
- fix that H on the very first cell, results in an endless loop
  (https://github.com/chrisbra/csv.vim/issues/31, reported by lahvak, thanks!)
- fix that count for |AddColumn| did not work (according to the documentation)
  (https://github.com/chrisbra/csv.vim/issues/32, reported by lahvak, thanks!)
- invalid reference to a WarningMsg() function
- WhatColumn! error, if the first line did not contain as many fields
  as the line to check.
- Rename |:Table| command to |:CSVTable| (
  https://github.com/chrisbra/csv.vim/issues/33,
  reported by Peter Jaros, thanks!)
- Mention to escape special characters when manually specifying the delimiter.
  https://github.com/chrisbra/csv.vim/issues/35), also detect '^' as
  delimiter.
- Csv fixed with columns better use '\%v' to match columns, otherwise, one
  could get problems with multibyte chars
- Sorting should work better with csv fixed with patterns (could generate an
  inavlide pattern before)
- Refactor GetSID() (provided by Ingo Karkat
  https://github.com/chrisbra/csv.vim/pull/37, thanks!)
- New public function |CSVSum()|
- Restrict |csv-arrange-autocmd| to specific file sizes (suggested by Spencer
  Boucher in https://github.com/chrisbra/csv.vim/issues/39, thanks!)
- Make |:CSVSearchInColumn| wrap pattern in '%\(..\)' pairs, so it works
  correctly with '\|' atoms
- Small improvements on |:CSVTable| and |:NewDelimiter| command
- <Up> and <Down> should skip folds (like in normal Vi mode, suggested by
  Kamaraju Kusuma, thanks!)

0.30 Mar 27, 2014 {{{1
- |:CSVSubstitute| should substitute all matches in a column, when 'g' flag is
  given
- Don't override 'fdt' setting (https://github.com/chrisbra/csv.vim/issues/18,
  reported by Noah Frederick, thanks!)
- Consistent Commands naming (https://github.com/chrisbra/csv.vim/issues/19,
  reported by Noah Frederick, thanks!)
- New Function |CSVField()| and |CSVCol()|
- clean up function did not remove certain buffer local variables,
  possible error when calling Menu function to disable CSV menu
- make |:CSVArrangeColumn| do not output the numer of substitutions happened
  (suggested by Caylan Larson, thanks!)
- better cleaning up on exit, if Header windows were used
- Let |:CSVVHeader| accept a number, of how many columns to show
  (suggested by Caylan Larson, thanks!)
- better error-handling for |CSVFixed|
- selection of inner/outer text objects  was wrong, reported by Ingo Karkat,
  thanks!)
- errors, when using |:CSVAnalyze| and there were empty attributes
- allow to left-align columns when using |:CSVArrangeColumn|
- |SumCol_CSV| did not detect negative values
- make <cr> in (Virtual-) Replace work as documented

0.29 Aug 14, 2013 {{{1
- setup |QuitPre| autocommand to quit cleanly in newer vims when using :Header
  and :VHeader
- new |AddColumn_CSV| command
- prevent mapping of keys, if g:csv_nomap_<keyname> is set
  (reported by ping)
- new |Substitute_CSV| command
- better syntax highlighting
- small speedup for |ArrangeColumn_CSV|
- 'E' did not correctly move the the previous column
- support for vim-airline added

0.28 Dec 14, 2012 {{{1
- new command :Table to create ascii tables for non-csv files

0.27 Nov 21, 2012 {{{1
- Better |CSV-Tabularize|
- Documentation update

0.26 Jul 25, 2012 {{{1
- Better handling of setting filetype specific options
- |CSV-Tabularize|
- fix some small errors

0.25 May 17, 2012 {{{1
- |SearchInColumn_CSV| should match non-greedily, patch by Matěj Korvas,
- better argument parsing for |SearchInColumn_CSV|, patch by Matěj Korvas,
  thanks!
0.24 Apr 12, 2012 {{{1
- Allow to transpose the file (|csv-transpose|, suggested by Karan Mistry,
  thanks!)
- |DeleteColumn_CSV| allows to specify a search pattern and all matching
  columns will be deleted (suggested by Karan Mistry, thanks!)

0.23 Mar 25, 2012 {{{1
- Don't error out, when creating a new file and syntax highlighting
  script can't find the delimiter
  (ftplugin will still give a warning, so).
- Don't pollute the search register when loading a file
- Give Warning when number format is wrong
- Don't source ftdetect several times (patch by Zhao Cai, thanks!)
- |NewDelimiter_CSV| to change the delimiter of the file
- |Duplicate_CSV| to check for duplicate records in the file
- Issue https://github.com/chrisbra/csv.vim/issues/13 fixed (missing quote,
  reported by y, thanks!)
- |CSVPat()| function
- 'lz' does not work with |:silent| |:s| (patch by Sergey Khorev, thanks!)
- support comments (|csv_comment|, suggested by Peng Yu, thanks!)
0.22 Nov 08, 2011 {{{1
- Small enhancements to |SumCol_CSV|
- :Filters! reapplys the dynamic filter
- Apply |csv-aggregate-functions| only to those values, that are
  not folded away.
- |SumCol_CSV| can use a different number format (suggested by James Cole,
  thanks! (also |csv-nrformat|
- Documentation updates (suggested by James Cole and Peng Yu)
- More code cleanup and error handling
  https://github.com/chrisbra/csv.vim/issues/9 reported Daniel Carl, thanks!
  https://github.com/chrisbra/csv.vim/issues/8 patch by Daniel Carl, thanks!
- New Command |NewRecord_CSV| (suggest by James Cole, thanks!)
- new textobjects InnerField (if) and outerField (af) which contain the field
  without or with the delimiter (suggested by James Cole, thanks!)
- |csv-arrange-autocmd| to let Vim automatically visually arrange the columns
  using |ArrangeColumn_CSV|
- |csv-move-folds| let Vim move folded lines to the end
- implement a Menu for graphical Vim

0.21 Oct 06, 2011 {{{1
- same as 0.20 (erroneously uploaded to vim.org)

0.20 Oct 06, 2011 {{{1

- Implement a wizard for initializing fixed-width columns (|CSVFixed|)
- Vertical folding (|VertFold_CSV|)
- fix plugin indentation (by Daniel Karl, thanks!)
- fixed missing bang parameter for HiColumn function (by Daniel Karl, thanks!)
- fixed broken autodection of delimiter (reported by Peng Yu, thanks!)

0.19 Sep 26, 2011 {{{1

- Make |:ArrangeColumn| more robust
- Link CSVDelimiter to the Conceal highlighting group for Vim's that have
  +conceal feature (suggested by John Orr, thanks!)
- allow the possibility to return the Column name in the statusline |csv-stl|
  (suggested by John Orr, thanks!)
- documentation updates
- Allow to dynamically add Filters, see |csv-filter|
- Also display what filters are active, see |:Filter|
- Analyze a column for the distribution of a value |csv-analyze|
- Implement UnArrangeColumn command |UnArrangeColumn_CSV|
  (suggested by Daniel Karl in https://github.com/chrisbra/csv.vim/issues/7)

0.18 Aug 30, 2011 {{{1

- fix small typos in documentation
- document, that 'K' and 'J' have been remapped and the originial function is
  available as \K and \J
- Delimiters should not be highlighted within a column, only when used
  as actual delimiters (suggested by Peng Yu, thanks!)
- Performance improvements for |:ArrangeColumn|

0.17 Aug 16, 2011 {{{1

- small cosmetic changes
- small documentation updates
- fold away changelog in help file
- Document, that |DeleteColumn_CSV| deletes the column on which the cursor
  is, if no column number has been specified
- Support csv fixed width columns (|csv-fixedwidth|)
- Support to interactively convert your csv file to a different
  format (|csv-convert|)

0.16 Jul 25, 2011 {{{1

- Sort on the range, specified (reported by Peng Yu, thanks!)
- |MoveCol_CSV| to move a column behind another column (suggested by Peng Yu,
  thanks!)
- Document how to use custom functions with a column
  (|csv-aggregate-functions|)
- Use g:csv_highlight_column variable, to have Vim automatically highlight the
  column on which the cursor is (|csv-hicol|)
- Header/VHeader command should work better now (|Header_CSV|, |VHeader_CSV|)
- Use setreg() for setting the register for the |Column_CSV| command and make
  sure it is blockwise.
- Release 0.14 was not correctly uploaded to vim.org

0.14 Jul 20, 2011 {{{1

- really use g:csv_no_conceal variable (reported by Antonio Ospite, thanks!)
- Force redrawing before displaying error messages in syntax script (reported
  by Antonio Ospite, thanks!)
- Make syntax highlighting work better with different terminals (Should work
  now with 8, 88 and 256 color terminals, tested with linux konsole, xterm and
  rxvt) (https://github.com/chrisbra/csv.vim/issues/4)
- Automatically detect '|' as field separator for csv files

0.13 Mar 14, 2011 {{{1

- documentation update
- https://github.com/chrisbra/csv.vim/issues#issue/2 ('splitbelow' breaks
  |Header_CSV|, fix this; thanks lespea!)
- https://github.com/chrisbra/csv.vim/issues#issue/3 ('gdefault' breaks
  |ArrangeColumn_CSV|, fix this; thanks lespea!)
- https://github.com/chrisbra/csv.vim/issues#issue/1 (make syntax highlighting
  more robust, thanks lespea!)
- fix some small annoying bugs
- WhatColumn! displays column name

0.12 Feb 24, 2011 {{{1

- bugfix release:
- don't use |:noa| when switching between windows
- make sure, colwidth() doesn't throw an error

0.11 Feb 24, 2011 {{{1

- new command |Copy_CSV|
- |Search_CSV| did not find anything in the last column if no delimiter
  was given (reported by chroyer)
- |VHeader_CSV| display the first column as Header similar to how
  |Header_CSV| works
- |HeaderToggle_CSV| and |VHeaderToggle_CSV| commands that toggle displaying
  the header lines/columns

0.10 Feb 23, 2011 {{{1

- Only conceal real delimiters
- document g:csv_no_conceal variable
- document g:csv_nl variable
- document conceal feature and syntax highlighting
- Normal mode command <Up>/<Down> work like K/J
- More robust regular expression engine, that can also handle newlines inside
  quoted strings.
- Slightly adjusted syntax highlighting

0.9 Feb 19, 2011 {{{1

- use conceal char depending on encoding
- Map normal mode keys also for visual/select and operator pending mode

0.8 Feb 17, 2011 {{{1

- Better Error handling
- HiColumn! removes highlighting
- Enable NrColumns, that was deactivated in v.0.7
- a ColorScheme autocommand makes sure, that the syntax highlighting is
  reapplied, after changing the colorscheme.
- SearchInColumn now searches in the current column, if no column has been
  specified
- A lot more documentation
- Syntax Highlighting conceales delimiter
- small performance improvements for |ArrangeColumn_CSV|

0.7 Feb 16, 2011 {{{1

- Make the motion commands 'W' and 'E' work more reliable
- Document how to setup filetype plugins
- Make |WhatColumn_CSV| work more reliable (report from
  http://vim.wikia.com/Script:3280)
- DeleteColumn deletes current column, if no argument given
- |ArrangeColumn_CSV| handles errors better
- Code cleanup
- Syntax highlighting
- 'H' and 'L' move forward/backwards between csv fields
- 'K' and 'J' move upwards/downwards within the same column
- |Sort_CSV| to sort on a certain column
- |csv-tips| on how to colorize the statusline

0.6 Feb 15, 2011 {{{1

- Make |ArrangeColumn_CSV| work more reliable (had problems with multibyte
  chars before)
- Add |Header_CSV| function
- 'W' and 'E' move forward/backwards between csv fields
- provide a file ftdetect/csv.vim to detect csv files

0.5  Apr 20 2010 {{{1

- documentation update
- switched to a public repository: http://github.com/chrisbra/csv.vim
- enabled GLVS (see |GLVS|)

0.4a Mar 11 2010 {{{1

- fixed documentation

0.4  Mar 11 2010 {{{1

- introduce |InitCSV|
- better Error handling
- HiColumn now by default highlights the current column, if no argument is
  specified.

0.3  Oct, 28 2010 {{{1

- initial Version

vim:tw=78:ts=8:ft=help:norl:et:fdm=marker:fdl=0