runtime(csv): include a simple csv filetype and syntax plugin

fixes: #15038

Signed-off-by: Maxim Kim <habamax@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Maxim Kim
2024-06-18 19:43:00 +02:00
committed by Christian Brabandt
parent 26de90c631
commit 1ce65e35ac
3 changed files with 64 additions and 0 deletions

2
.github/MAINTAINERS vendored
View File

@ -119,6 +119,7 @@ runtime/ftplugin/clojure.vim @axvr
runtime/ftplugin/cs.vim @nickspoons
runtime/ftplugin/csh.vim @dkearns
runtime/ftplugin/css.vim @dkearns
runtime/ftplugin/csv.vim @habamax
runtime/ftplugin/cucumber.vim @tpope
runtime/ftplugin/dart.vim @ribru17
runtime/ftplugin/deb822sources.vim @jamessan
@ -369,6 +370,7 @@ runtime/syntax/chatito.vim @ObserverOfTime
runtime/syntax/chuck.vim @gacallea
runtime/syntax/clojure.vim @axvr
runtime/syntax/cs.vim @nickspoons
runtime/syntax/csv.vim @habamax
runtime/syntax/cucumber.vim @tpope
runtime/syntax/d.vim @JesseKPhillips
runtime/syntax/dart.vim @pr3d4t0r

23
runtime/ftplugin/csv.vim Normal file
View File

@ -0,0 +1,23 @@
vim9script
# Maintainer: Maxim Kim <habamax@gmail.com>
# Last Update: 2024-06-18
if !exists("b:csv_delimiter")
# detect delimiter
var delimiters = ",;\t|"
var max = 0
for d in delimiters
var count = getline(1)->split(d)->len() + getline(2)->split(d)->len()
if count > max
max = count
b:csv_delimiter = d
endif
endfor
endif
if exists("b:did_ftplugin")
finish
endif
b:did_ftplugin = 1

39
runtime/syntax/csv.vim Normal file
View File

@ -0,0 +1,39 @@
vim9script
# Maintainer: Maxim Kim <habamax@gmail.com>
# Last Update: 2024-06-18
if exists("b:current_syntax")
finish
endif
var delimiter = get(b:, "csv_delimiter", ",")
# generate bunch of following syntaxes:
# syntax match csvCol8 /.\{-}\(,\|$\)/ nextgroup=escCsvCol0,csvCol0
# syntax region escCsvCol8 start=/ *"\([^"]*""\)*[^"]*/ end=/" *\(,\|$\)/ nextgroup=escCsvCol0,csvCol0
for col in range(8, 0, -1)
var ncol = (col == 8 ? 0 : col + 1)
exe $'syntax match csvCol{col}' .. ' /.\{-}\(' .. delimiter .. '\|$\)/ nextgroup=escCsvCol' .. ncol .. ',csvCol' .. ncol
exe $'syntax region escCsvCol{col}' .. ' start=/ *"\([^"]*""\)*[^"]*/ end=/" *\(' .. delimiter .. '\|$\)/ nextgroup=escCsvCol' .. ncol .. ',csvCol' .. ncol
endfor
hi def link csvCol1 Statement
hi def link csvCol2 Constant
hi def link csvCol3 Type
hi def link csvCol4 PreProc
hi def link csvCol5 Identifier
hi def link csvCol6 Special
hi def link csvCol7 String
hi def link csvCol8 Comment
hi def link escCsvCol1 csvCol1
hi def link escCsvCol2 csvCol2
hi def link escCsvCol3 csvCol3
hi def link escCsvCol4 csvCol4
hi def link escCsvCol5 csvCol5
hi def link escCsvCol6 csvCol6
hi def link escCsvCol7 csvCol7
hi def link escCsvCol8 csvCol8
b:current_syntax = "csv"