vim-patch:9.1.0354: runtime(uci): No support for uci file types (#28409)

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

closes: vim/vim#14575

4b3fab14db

Co-authored-by: Colin Caine <complaints@cmcaine.co.uk>
Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>
This commit is contained in:
zeertzjq 2024-04-19 14:50:12 +08:00 committed by GitHub
parent 3e6a9fb599
commit 8d77061051
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 99 additions and 1 deletions

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<"

View File

@ -14,7 +14,8 @@ local M = {}
local function starsetf(ft, opts)
return {
function(path, bufnr)
local f = type(ft) == 'function' and ft(path, bufnr) or ft
-- Note: when `ft` is a function its return value may be nil.
local f = type(ft) ~= 'function' and ft or ft(path, bufnr)
if not vim.g.ft_ignore_pat then
return f
end
@ -2138,6 +2139,7 @@ local pattern = {
['.*/%.init/.*%.conf'] = 'upstart',
['.*/usr/share/upstart/.*%.override'] = 'upstart',
['.*%.[Ll][Oo][Gg]'] = detect.log,
['.*/etc/config/.*'] = starsetf(detect.uci),
['.*%.vhdl_[0-9].*'] = starsetf('vhdl'),
['.*%.ws[fc]'] = 'wsh',
['.*/Xresources/.*'] = starsetf('xdefaults'),

View File

@ -1584,6 +1584,26 @@ function M.typ(_, bufnr)
return 'typst'
end
--- @type vim.filetype.mapfn
function M.uci(_, bufnr)
-- Return "uci" iff the file has a config or package statement near the
-- top of the file and all preceding lines were comments or blank.
for _, line in ipairs(getlines(bufnr, 1, 3)) do
-- Match a config or package statement at the start of the line.
if
line:find('^%s*[cp]%s+%S')
or line:find('^%s*config%s+%S')
or line:find('^%s*package%s+%S')
then
return 'uci'
end
-- Match a line that is either all blank or blank followed by a comment
if not (line:find('^%s*$') or line:find('^%s*#')) then
break
end
end
end
-- Determine if a .v file is Verilog, V, or Coq
--- @type vim.filetype.mapfn
function M.v(_, bufnr)

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

@ -2439,4 +2439,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