14
14
" Some ideas are taken from the wiki http://vim.wikia.com/wiki/VimTip667
15
15
" though, implementation differs.
16
16
17
- let s: csv_numeric_sort = v: version > 704 || v: version == 704 && has (" patch341 " )
17
+ let s: csv_numeric_sort = v: version > 704 || v: version == 704 && has (" patch951 " )
18
18
if ! s: csv_numeric_sort " {{{2
19
19
fu ! csv#CSVSortValues (i1, i2) " {{{3
20
20
return (a: i1+ 0 ) == (a: i2+ 0 ) ? 0 : (a: i1+ 0 ) > (a: i2+ 0 ) ? 1 : -1
@@ -222,6 +222,15 @@ fu! csv#LocalSettings(type) "{{{3
222
222
endif
223
223
endfu
224
224
225
+ fu ! csv#RemoveAutoHighlight () " {{{3
226
+ exe " aug CSV_HI" .bufnr (' ' )
227
+ exe " au! CursorMoved <buffer=" .bufnr (' ' )." >"
228
+ aug end
229
+ exe " aug! CSV_HI" .bufnr (' ' )
230
+ " Remove any existing highlighting
231
+ HiColumn!
232
+ endfu
233
+
225
234
fu ! csv#DoAutoCommands () " {{{3
226
235
" Highlight column, on which the cursor is
227
236
if exists (" g:csv_highlight_column" ) && g: csv_highlight_column = ~? ' y'
@@ -233,12 +242,7 @@ fu! csv#DoAutoCommands() "{{{3
233
242
" Set highlighting for column, on which the cursor is currently
234
243
HiColumn
235
244
else
236
- exe " aug CSV_HI" .bufnr (' ' )
237
- exe " au! CursorMoved <buffer=" .bufnr (' ' )." >"
238
- aug end
239
- exe " aug! CSV_HI" .bufnr (' ' )
240
- " Remove any existing highlighting
241
- HiColumn!
245
+ call csv#RemoveAutoHighlight ()
242
246
endif
243
247
" undo autocommand:
244
248
let b: undo_ftplugin .= ' | exe "sil! au! CSV_HI' .bufnr (' ' ).' CursorMoved <buffer> "'
@@ -539,7 +543,7 @@ fu! csv#WColumn(...) "{{{3
539
543
let temp= getpos (' .' )[2 ]
540
544
let j = 1
541
545
let ret = 1
542
- for i in sort (b: csv_fixed_width_cols , s: csv_numeric_sort ? ' n ' : ' csv#CSVSortValues' )
546
+ for i in sort (b: csv_fixed_width_cols , s: csv_numeric_sort ? ' N ' : ' csv#CSVSortValues' )
543
547
if temp >= i
544
548
let ret = j
545
549
endif
@@ -549,6 +553,9 @@ fu! csv#WColumn(...) "{{{3
549
553
call setpos (' .' ,_cur)
550
554
return ret
551
555
endfu
556
+ fu ! csv#ValidComment () " {{{3
557
+ return b: csv_cmt != [' ' , ' ' ] && ! empty (b: csv_cmt [0 ])
558
+ endfu
552
559
fu ! csv#MaxColumns (... ) " {{{3
553
560
let this_col = exists (" a:1" )
554
561
" return maximum number of columns in first 10 lines
@@ -561,8 +568,10 @@ fu! csv#MaxColumns(...) "{{{3
561
568
endif
562
569
563
570
" Filter comments out
564
- let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
565
- call filter (l , ' v:val !~ pat' )
571
+ if csv#ValidComment ()
572
+ let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
573
+ call filter (l , ' v:val !~ pat' )
574
+ endif
566
575
if ! empty (l ) || this_col
567
576
break
568
577
else
@@ -606,8 +615,10 @@ fu! csv#ColWidth(colnr, row, silent) "{{{3
606
615
endif
607
616
endif
608
617
let b: csv_list= getline (skipfirst+ 1 ,last )
609
- let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
610
- call filter (b: csv_list , ' v:val !~ pat' )
618
+ if csv#ValidComment ()
619
+ let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
620
+ call filter (b: csv_list , ' v:val !~ pat' )
621
+ endif
611
622
call filter (b: csv_list , ' !empty(v:val)' )
612
623
call map (b: csv_list , ' split(v:val, b:col.'' \zs'' )' )
613
624
endif
@@ -898,7 +909,7 @@ fu! csv#Columnize(field) "{{{3
898
909
return result
899
910
else
900
911
" right align
901
- return printf (" %*S" , width+ 1 , a: field )
912
+ return printf (" %*S" , width , a: field )
902
913
endif
903
914
endfun
904
915
fu ! csv#GetColPat (colnr, zs_flag) " {{{3
@@ -912,15 +923,15 @@ fu! csv#GetColPat(colnr, zs_flag) "{{{3
912
923
let pat= ' \%' . b: csv_fixed_width_cols [-1 ] . ' v.*'
913
924
else
914
925
let pat= ' \%' . b: csv_fixed_width_cols [(a: colnr - 1 )] .
915
- \ ' c.\{-}\% ' . b: csv_fixed_width_cols [a: colnr ] . ' v'
926
+ \ ' c.*\%< ' . ( b: csv_fixed_width_cols [a: colnr ] + 1 ) . ' v'
916
927
endif
917
928
endif
918
929
elseif ! exists (" b:csv_fixed_width_cols" )
919
930
let pat= b: col
920
931
else
921
- let pat= ' \%' . b: csv_fixed_width_cols [0 ] . ' v.\{-} ' .
932
+ let pat= ' \%' . b: csv_fixed_width_cols [0 ] . ' v.* ' .
922
933
\ (len (b: csv_fixed_width_cols ) > 1 ?
923
- \ ' \%' . b: csv_fixed_width_cols [1 ] . ' v' :
934
+ \ ' \%< ' . ( b: csv_fixed_width_cols [1 ] + 1 ) . ' v' :
924
935
\ ' ' )
925
936
endif
926
937
return pat . (a: zs_flag ? ' \zs' : ' ' )
@@ -1115,7 +1126,12 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
1115
1126
let pat= csv#GetColPat (1 , 0 )
1116
1127
else
1117
1128
" Move backwards
1118
- let pat= csv#GetColPat (maxcol, 0 )
1129
+ if cpos == 1 && (exists (" a:1" ) && a: 1 )
1130
+ " H move to previous line
1131
+ let pat= csv#GetColPat (maxcol, 0 )
1132
+ else
1133
+ let pat= ' \%1v'
1134
+ endif
1119
1135
endif
1120
1136
endif
1121
1137
else
@@ -1149,9 +1165,13 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
1149
1165
" of a field.
1150
1166
let epos = getpos (' .' )
1151
1167
if getline (' .' )[col (' .' )-1 ] == ' '
1152
- call search (' \S' , ' W' , line (' .' ))
1153
- if getpos (' .' )[2 ] > spos
1154
- call setpos (' .' , epos)
1168
+ if ! exists (" b:csv_fixed_width_cols" )
1169
+ call search (' \S' , ' W' , line (' .' ))
1170
+ if getpos (' .' )[2 ] > spos
1171
+ call setpos (' .' , epos)
1172
+ endif
1173
+ elseif cpos > b: csv_fixed_width_cols [colnr]
1174
+ call search (' \%' . b: csv_fixed_width_cols [colnr]. ' v' , ' W' , line (' .' ))
1155
1175
endif
1156
1176
endif
1157
1177
endif
@@ -1246,8 +1266,10 @@ fu! csv#CopyCol(reg, col, cnt) "{{{3
1246
1266
endfor
1247
1267
endif
1248
1268
" Filter comments out
1249
- let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1250
- call filter (a , ' v:val !~ pat' )
1269
+ if csv#ValidComment ()
1270
+ let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1271
+ call filter (a , ' v:val !~ pat' )
1272
+ endif
1251
1273
1252
1274
if ! exists (" b:csv_fixed_width_cols" )
1253
1275
call map (a , ' split(v:val, '' ^'' . b:col . '' \zs'' )[col-1:cnt_cols]' )
@@ -1288,10 +1310,9 @@ fu! csv#MoveColumn(start, stop, ...) range "{{{3
1288
1310
endif
1289
1311
1290
1312
" Swap line by line, instead of reading the whole range into memory
1291
-
1292
1313
for i in range (a: start , a: stop )
1293
1314
let content = getline (i )
1294
- if content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1315
+ if b: csv_cmt != [ ' ' , ' ' ] && content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1295
1316
" skip comments
1296
1317
continue
1297
1318
endif
@@ -1359,13 +1380,9 @@ fu! csv#DupColumn(start, stop, ...) range "{{{3
1359
1380
" skipping comment lines (we could do it with a single :s statement,
1360
1381
" but that would fail for the first and last column.
1361
1382
1362
- let commentpat = ' \%(\%>' .(a: start- 1 ).' l\V' .
1363
- \ escape (b: csv_cmt [0 ], ' \\' ).' \m\)' . ' \&\%(\%<' .
1364
- \ (a: stop+ 1 ). ' l\V' . escape (b: csv_cmt [0 ], ' \\' ). ' \m\)'
1365
-
1366
1383
for i in range (a: start , a: stop )
1367
1384
let content = getline (i )
1368
- if content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1385
+ if csv#ValidComment () && content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1369
1386
" skip comments
1370
1387
continue
1371
1388
endif
@@ -1429,10 +1446,12 @@ fu! csv#AddColumn(start, stop, ...) range "{{{3
1429
1446
" skipping comment lines (we could do it with a single :s statement,
1430
1447
" but that would fail for the first and last column.
1431
1448
1432
- let commentpat = ' \%(\%>' .(a: start- 1 ).' l\V' .
1433
- \ escape (b: csv_cmt [0 ], ' \\' ).' \m\)' . ' \&\%(\%<' .
1434
- \ (a: stop+ 1 ). ' l\V' . escape (b: csv_cmt [0 ], ' \\' ). ' \m\)'
1435
- if search (commentpat)
1449
+ if b: csv_cmt != [' ' ,' ' ]
1450
+ let commentpat = ' \%(\%>' .(a: start- 1 ).' l\V' .
1451
+ \ escape (b: csv_cmt [0 ], ' \\' ).' \m\)' . ' \&\%(\%<' .
1452
+ \ (a: stop+ 1 ). ' l\V' . escape (b: csv_cmt [0 ], ' \\' ). ' \m\)'
1453
+ endif
1454
+ if ! empty (commentpat) && search (commentpat)
1436
1455
for i in range (a: start , a: stop )
1437
1456
let content = getline (i )
1438
1457
if content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
@@ -1611,7 +1630,7 @@ fu! csv#MaxColumn(list) "{{{3
1611
1630
endtry
1612
1631
call add (result, str2float (nr))
1613
1632
endfor
1614
- let result = sort (result, s: csv_numeric_sort ? ' n ' : ' csv#CSVSortValues' )
1633
+ let result = sort (result, s: csv_numeric_sort ? ' N ' : ' csv#CSVSortValues' )
1615
1634
let ind = len (result) > 9 ? 9 : len (result)
1616
1635
if has_key (get (s: , ' additional' , {}), ' distinct' ) && s: additional [' distinct' ]
1617
1636
if exists (" *uniq" )
@@ -1672,7 +1691,7 @@ fu! csv#DoForEachColumn(start, stop, bang) range "{{{3
1672
1691
endif
1673
1692
let t = g: csv_convert
1674
1693
let line = getline (item)
1675
- if line = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1694
+ if b: csv_cmt != [ ' ' , ' ' ] && line = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1676
1695
" Filter comments out
1677
1696
call add (result, line )
1678
1697
continue
@@ -1736,7 +1755,7 @@ fu! csv#FoldValue(lnum, filter) "{{{3
1736
1755
for item in values (a: filter )
1737
1756
" always fold comments away
1738
1757
let content = getline (a: lnum )
1739
- if content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1758
+ if b: csv_cmt != [ ' ' , ' ' ] && content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1740
1759
return 1
1741
1760
elseif eval (' content' . (item.match ? ' !~' : ' =~' ) . ' item.pat' )
1742
1761
let result += 1
@@ -1898,7 +1917,7 @@ fu! csv#GetColumn(line, col, strip) "{{{3
1898
1917
" Return Column content at a:line, a:col
1899
1918
let a = getline (a: line )
1900
1919
" Filter comments out
1901
- if a = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1920
+ if csv#ValidComment () && a = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
1902
1921
return ' '
1903
1922
endif
1904
1923
@@ -1979,7 +1998,7 @@ fu! csv#AnalyzeColumn(...) "{{{3
1979
1998
let res [item]+= 1
1980
1999
endfor
1981
2000
1982
- let max_items = reverse (sort (values (res ), s: csv_numeric_sort ? ' n ' : ' csv#CSVSortValues' ))
2001
+ let max_items = reverse (sort (values (res ), s: csv_numeric_sort ? ' N ' : ' csv#CSVSortValues' ))
1983
2002
" What about the minimum 5 items?
1984
2003
let count_items = keys (res )
1985
2004
if len (max_items) > topn
@@ -2057,6 +2076,7 @@ fu! csv#InitCSVFixedWidth() "{{{3
2057
2076
endif
2058
2077
" Turn off syntax highlighting
2059
2078
syn clear
2079
+ call csv#RemoveAutoHighlight ()
2060
2080
let max_line = line (' $' ) > 10 ? 10 : line (' $' )
2061
2081
let t = getline (1 , max_line)
2062
2082
let max_len = max (map (t , ' len(split(v:val, '' \zs'' ))' ))
@@ -2118,8 +2138,8 @@ fu! csv#InitCSVFixedWidth() "{{{3
2118
2138
endw
2119
2139
let b: csv_fixed_width_cols= []
2120
2140
let tcc= 0
2121
- let b: csv_fixed_width_cols = sort (keys (Dict), s: csv_numeric_sort ? ' n ' : ' csv#CSVSortValues' )
2122
- let b: csv_fixed_width = join (sort (keys (Dict), s: csv_numeric_sort ? ' n ' : ' csv#CSVSortValues' ), ' ,' )
2141
+ let b: csv_fixed_width_cols = sort (keys (Dict), s: csv_numeric_sort ? ' N ' : ' csv#CSVSortValues' )
2142
+ let b: csv_fixed_width = join (sort (keys (Dict), s: csv_numeric_sort ? ' N ' : ' csv#CSVSortValues' ), ' ,' )
2123
2143
call csv#Init (1 , line (' $' ))
2124
2144
2125
2145
let &l: cc= _cc
@@ -2200,7 +2220,7 @@ fu! csv#CSVMappings() "{{{3
2200
2220
call csv#Map (' nnoremap' , ' <C-Right>' , ' :<C-U>call csv#MoveCol(1, line("."))<CR>' )
2201
2221
call csv#Map (' nnoremap' , ' L' , ' :<C-U>call csv#MoveCol(1, line("."))<CR>' )
2202
2222
try
2203
- if g: csv_bind_B == 1
2223
+ if get ( g: , ' csv_bind_B' , 0 ) == 1
2204
2224
call csv#Map (' nnoremap' , ' B' , ' :<C-U>call csv#MoveCol(-1, line("."))<CR>' )
2205
2225
else
2206
2226
call csv#Map (' nnoremap' , ' E' , ' :<C-U>call csv#MoveCol(-1, line("."))<CR>' )
@@ -2431,7 +2451,7 @@ fu! csv#NewDelimiter(newdelimiter, firstl, lastl) "{{{3
2431
2451
let line = a: firstl
2432
2452
while line <= a: lastl
2433
2453
" Don't change delimiter for comments
2434
- if getline (line ) = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2454
+ if csv#ValidComment () && getline (line ) = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2435
2455
let line += 1
2436
2456
continue
2437
2457
endif
@@ -2476,7 +2496,7 @@ fu! csv#DuplicateRows(columnlist) "{{{3
2476
2496
let i = 1
2477
2497
let content = getline (line )
2478
2498
" Skip comments
2479
- if content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2499
+ if csv#ValidComment () && content = ~ ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2480
2500
continue
2481
2501
endif
2482
2502
let cols = split (content, b: col . ' \zs' )
@@ -2532,7 +2552,11 @@ fu! csv#Transpose(line1, line2) "{{{3
2532
2552
let TrailingDelim = getline (1 ) = ~ b: delimiter .' $'
2533
2553
endif
2534
2554
2535
- let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2555
+ if b: csv_cmt != [' ' ,' ' ]
2556
+ let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
2557
+ else
2558
+ let pat = ' '
2559
+ endif
2536
2560
2537
2561
try
2538
2562
let columns = csv#MaxColumns (a: line1 )
@@ -2544,7 +2568,7 @@ fu! csv#Transpose(line1, line2) "{{{3
2544
2568
let matrix = []
2545
2569
for line in range (a: line1 , a: line2 )
2546
2570
" Filter comments out
2547
- if getline (line ) = ~ pat
2571
+ if ! empty (pat) && getline (line ) = ~ pat
2548
2572
continue
2549
2573
endif
2550
2574
let r = []
@@ -3033,10 +3057,12 @@ fu! csv#SumCSVRow(line, nr) "{{{3
3033
3057
endif
3034
3058
let line = getline (ln )
3035
3059
" Filter comments out
3036
- let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
3037
- if line = ~ pat
3038
- call csv#Warn (" Invalid count specified" )
3039
- return
3060
+ if csv#ValidComment ()
3061
+ let pat = ' ^\s*\V' . escape (b: csv_cmt [0 ], ' \\' )
3062
+ if line = ~ pat
3063
+ call csv#Warn (" Invalid count specified" )
3064
+ return
3065
+ endif
3040
3066
endif
3041
3067
let func = ' csv#SumColumn'
3042
3068
let cells= split (line , b: col .' \zs' )
0 commit comments