" Vim syntax file
" Language: lf file manager configuration file (lfrc)
" Maintainer: Andis Sprinkis <andis@sprinkis.com>
" Former Maintainer: Cameron Wright
" Former URL: https://github.com/andis-sprinkis/lf-vim
" Last Change: 13 October 2024
"
" The shell syntax highlighting is configurable. See $VIMRUNTIME/doc/syntax.txt
" lf version: 32

if exists("b:current_syntax")
    finish
endif

let b:current_syntax = "lf"

"{{{ Comment Matching
syn match    lfComment        '#.*$'
"}}}

"{{{ String Matching
syn match    lfString         "'.*'"
syn match    lfString         '".*"' contains=lfVar,lfSpecial
"}}}

"{{{ Match lf Variables
syn match    lfVar            '\$f\|\$fx\|\$fs\|\$id'
"}}}

"{{{ Keywords
syn keyword  lfKeyword        set setlocal cmd map cmap skipwhite
"}}}

"{{{ Options Keywords
syn keyword  lfOptions
    \ quit
    \ up
    \ half-up
    \ page-up
    \ scroll-up
    \ down
    \ half-down
    \ page-down
    \ scroll-down
    \ updir
    \ open
    \ jump-next
    \ jump-prev
    \ top
    \ bottom
    \ high
    \ middle
    \ low
    \ toggle
    \ invert
    \ invert-below
    \ unselect
    \ glob-select
    \ glob-unselect
    \ calcdirsize
    \ clearmaps
    \ copy
    \ cut
    \ paste
    \ clear
    \ sync
    \ draw
    \ redraw
    \ load
    \ reload
    \ echo
    \ echomsg
    \ echoerr
    \ cd
    \ select
    \ delete
    \ rename
    \ source
    \ push
    \ read
    \ shell
    \ shell-pipe
    \ shell-wait
    \ shell-async
    \ find
    \ find-back
    \ find-next
    \ find-prev
    \ search
    \ search-back
    \ search-next
    \ search-prev
    \ filter
    \ setfilter
    \ mark-save
    \ mark-load
    \ mark-remove
    \ tag
    \ tag-toggle
    \ cmd-escape
    \ cmd-complete
    \ cmd-menu-complete
    \ cmd-menu-complete-back
    \ cmd-menu-accept
    \ cmd-enter
    \ cmd-interrupt
    \ cmd-history-next
    \ cmd-history-prev
    \ cmd-left
    \ cmd-right
    \ cmd-home
    \ cmd-end
    \ cmd-delete
    \ cmd-delete-back
    \ cmd-delete-home
    \ cmd-delete-end
    \ cmd-delete-unix-word
    \ cmd-yank
    \ cmd-transpose
    \ cmd-transpose-word
    \ cmd-word
    \ cmd-word-back
    \ cmd-delete-word
    \ cmd-delete-word-back
    \ cmd-capitalize-word
    \ cmd-uppercase-word
    \ cmd-lowercase-word
    \ anchorfind
    \ autoquit
    \ borderfmt
    \ cleaner
    \ copyfmt
    \ cursoractivefmt
    \ cursorparentfmt
    \ cursorpreviewfmt
    \ cutfmt
    \ dircache
    \ dircounts
    \ dirfirst
    \ dironly
    \ dirpreviews
    \ drawbox
    \ dupfilefmt
    \ errorfmt
    \ filesep
    \ findlen
    \ globfilter
    \ globsearch
    \ hidden
    \ hiddenfiles
    \ hidecursorinactive
    \ history
    \ icons
    \ ifs
    \ ignorecase
    \ ignoredia
    \ incfilter
    \ incsearch
    \ info
    \ infotimefmtnew
    \ infotimefmtold
    \ mouse
    \ number
    \ numberfmt
    \ period
    \ preserve
    \ preview
    \ previewer
    \ promptfmt
    \ ratios
    \ relativenumber
    \ reverse
    \ roundbox
    \ ruler
    \ rulerfmt
    \ scrolloff
    \ selectfmt
    \ selmode
    \ shell
    \ shellflag
    \ shellopts
    \ sixel
    \ smartcase
    \ smartdia
    \ sortby
    \ statfmt
    \ tabstop
    \ tagfmt
    \ tempmarks
    \ timefmt
    \ truncatechar
    \ truncatepct
    \ waitmsg
    \ wrapscan
    \ wrapscroll
    \ pre-cd
    \ on-cd
    \ on-select
    \ on-redraw
    \ on-quit
"}}}

"{{{ Special Matching
syn match    lfSpecial        '<.*>\|\\.'
"}}}

"{{{ Shell Script Matching for cmd
let s:shell_syntax = get(g:, 'lf_shell_syntax', "syntax/sh.vim")
let s:shell_syntax = get(b:, 'lf_shell_syntax', s:shell_syntax)
unlet b:current_syntax
exe 'syn include @Shell '.s:shell_syntax
let b:current_syntax = "lf"
syn region   lfIgnore         start=".{{\n" end="^}}"
    \ keepend contains=lfExternalShell,lfExternalPatch
syn match    lfShell          '\$[a-zA-Z].*$
    \\|:[a-zA-Z].*$
    \\|%[a-zA-Z].*$
    \\|![a-zA-Z].*$
    \\|&[a-zA-Z].*$'
    \ transparent contains=@Shell,lfExternalPatch
syn match    lfExternalShell  "^.*$" transparent contained contains=@Shell
syn match    lfExternalPatch  "^\s*cmd\ .*\ .{{$\|^}}$" contained
"}}}

"{{{ Link Highlighting
hi def link  lfComment        Comment
hi def link  lfVar            Type
hi def link  lfSpecial        Special
hi def link  lfString         String
hi def link  lfKeyword        Statement
hi def link  lfOptions        Constant
hi def link  lfConstant       Constant
hi def link  lfExternalShell  Normal
hi def link  lfExternalPatch  Special
hi def link  lfIgnore         Special
"}}}