patch 9.1.0354: runtime(uci): No support for uci file types

Problem:  runtime(uci): No support for uci file types
          (Wu, Zhenyu)
Solution: include basic uci ftplugin and syntax plugins
          (Colin Caine)

closes: #14575

Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
Signed-off-by: Colin Caine <complaints@cmcaine.co.uk>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Colin Caine 2024-04-18 23:53:02 +02:00 committed by Christian Brabandt
parent 36e667ab83
commit 4b3fab14db
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
6 changed files with 100 additions and 0 deletions

View File

@ -1298,5 +1298,21 @@ export def FTvba()
endif
enddef
export def Detect_UCI_statements(): bool
# Match a config or package statement at the start of the line.
const config_or_package_statement = '^\s*\(\(c\|config\)\|\(p\|package\)\)\s\+\S'
# Match a line that is either all blank or blank followed by a comment
const comment_or_blank = '^\s*\(#.*\)\?$'
# Return true iff the file has a config or package statement near the
# top of the file and all preceding lines were comments or blank.
return getline(1) =~# config_or_package_statement
\ || getline(1) =~# comment_or_blank
\ && ( getline(2) =~# config_or_package_statement
\ || getline(2) =~# comment_or_blank
\ && getline(3) =~# config_or_package_statement
\ )
enddef
# Uncomment this line to check for compilation errors early
# defcompile

View File

@ -3030,6 +3030,12 @@ au BufNewFile,BufRead {.,}tmux*.conf* setf tmux
" Universal Scene Description
au BufNewFile,BufRead *.usda,*.usd setf usd
" UCI
" UCI files are normally in /etc/config, but that might be mounted over sshfs or similar, so we match more loosely.
" There was some concern[1] that this pattern would match too much, so now we check the file content as well.
" [1]: https://github.com/vim/vim/pull/14385#discussion_r1558878741
au BufNewFile,BufRead */etc/config/* if dist#ft#Detect_UCI_statements() | call s:StarSetf('uci') | endif
" VHDL
au BufNewFile,BufRead *.vhdl_[0-9]* call s:StarSetf('vhdl')

21
runtime/ftplugin/uci.vim Normal file
View File

@ -0,0 +1,21 @@
" Vim ftplugin file
" Language: OpenWrt Unified Configuration Interface
" Maintainer: Colin Caine <complaints@cmcaine.co.uk>
" Upstream: https://github.com/cmcaine/vim-uci
" Last Change: 2024 Apr 17
"
" For more information on uci, see https://openwrt.org/docs/guide-user/base-system/uci
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
" UCI files are indented with tabs.
setl noexpandtab
setl shiftwidth=0
setl softtabstop=0
setl commentstring=#\ %s
let b:undo_ftplugin = "setlocal et< cms< sts< sw<"

33
runtime/syntax/uci.vim Normal file
View File

@ -0,0 +1,33 @@
" Vim syntax file
" Language: OpenWrt Unified Configuration Interface
" Maintainer: Colin Caine <complaints@cmcaine.co.uk>
" Upstream: https://github.com/cmcaine/vim-uci
" Last Change: 2021 Sep 19
"
" For more information on uci, see https://openwrt.org/docs/guide-user/base-system/uci
if exists("b:current_syntax")
finish
endif
" Fancy zero-width non-capturing look-behind to see what the last word was.
" Would be really nice if there was some less obscure or more efficient way to
" do this.
syntax match uciOptionName '\%(\%(option\|list\)\s\+\)\@<=\S*'
syntax match uciConfigName '\%(\%(package\|config\)\s\+\)\@<=\S*'
syntax keyword uciConfigDec package config nextgroup=uciConfigName skipwhite
syntax keyword uciOptionType option list nextgroup=uciOptionName skipwhite
" Standard matches.
syntax match uciComment "#.*$"
syntax region uciString start=+"+ end=+"+ skip=+\\"+
syntax region uciString start=+'+ end=+'+ skip=+\\'+
highlight default link uciConfigName Identifier
highlight default link uciOptionName Constant
highlight default link uciConfigDec Statement
highlight default link uciOptionType Type
highlight default link uciComment Comment
highlight default link uciString Normal
let b:current_syntax = "uci"

View File

@ -2441,4 +2441,26 @@ func Test_def_file()
filetype off
endfunc
func Test_uci_file()
filetype on
call mkdir('any/etc/config', 'pR')
call writefile(['config firewall'], 'any/etc/config/firewall', 'D')
split any/etc/config/firewall
call assert_equal('uci', &filetype)
bwipe!
call writefile(['# config for nginx here'], 'any/etc/config/firewall', 'D')
split any/etc/config/firewall
call assert_notequal('uci', &filetype)
bwipe!
call writefile(['# Copyright Cool Cats 1997', 'config firewall'], 'any/etc/config/firewall', 'D')
split any/etc/config/firewall
call assert_equal('uci', &filetype)
bwipe!
filetype off
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
354,
/**/
353,
/**/