Skip to content

Instantly share code, notes, and snippets.

@chrisbra
Created January 30, 2024 22:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.
Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.
mkvimvim.ksh
#! /bin/ksh
# Usage: mkvimvim VimVersion [sub-version] (ex. mkvimvim 54d)
# mkvimvim: does some semi-standardized stuff to generate a <vim.vim> file
# It actually generates a <nvim.vim> file for inspection first.
#VIMHOME=/usr/local/share/vim
#VIMHOME="${HOME}/.SW/VIM/Git"
VIMHOME=${HOME}/.SW/VIM
if [[ "$1" = "?" ]]; then
echo "Usage: mkvimvim VimVersion [sub-version] (ex. mkvimvim 54d)"
exit
fi
# get version and minor version numbers
if [[ "$1" = "" ]]; then
cd "${VIMHOME}"
vim --version > /tmp/tmp
version=$(change -c "/^VIM/c/^?*IMproved {[0-9.]+} ?*$/&1/" /tmp/tmp)
major=${version%[0-9a-z]}
minor=${version#[0-9a-z]}
major=${major%.}
minor=${minor#.}
# echo "DBG: (preliminary) version<${version}> major<${major}> minor<${minor}>"
else
version=$1
major=${version%[0-9a-z]}
minor=${version#[0-9a-z]}
major=${major%.}
minor=${minor#.}
fi
# Form the version and version number
vernum="${major}.${minor}"
version="${major}${minor}"
# report
echo "version<${version}> major<${major}> minor<${minor}> subver<${subver}> vernum<${vernum}>"
# sanity check
#echo "DBG: is ${VIMRUNTIME}/syntax a directory?"
if [[ ! -d "${VIMRUNTIME}/syntax" ]]; then
echo "${COLORRED}***error***${COLORNRML} ${VIMRUNTIME}/syntax is not a directory!"
exit 1
fi
cd ${VIMRUNTIME}/syntax
if [[ -r vim.vim ]]; then
verline=$(fgrep Version: vim.vim)
verline=${verline#*-}
verline=${verline%%[ ]*}
integer ver
ver=verline
ver=ver+1
if (( ${ver} <= 9 )) ; then
vimsubversion="0"${ver}
else
vimsubversion=${ver}
fi
else
vimsubversion="01"
fi
# sanity check
if [[ ! -d "${VIMRUNTIME}/doc" ]]; then
echo "${COLORRED}***error***${COLORNRML} ${VIMRUNTIME}/doc is not a directory!"
# echo "(DEBUG) VIMRUNTIME<${VIMRUNTIME}>"
# echo "(DEBUG) version<${version}>"
# echo "(DEBUG) subver <${subver}>"
exit 1
fi
cd ${VIMRUNTIME}/doc
# Do standard leader
echo "doing leader for version" ${vernum} '-' ${vimsubversion}
echo '" Vim syntax file' > ~/nvim.vim
echo '" Language: Vim' ${vernum} 'script' >> ~/nvim.vim
echo '" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>' >> ~/nvim.vim
echo '" Last Change: '$(date "+%B %d, %Y") >> ~/nvim.vim
echo '" Version: '${vernum}'-'"${vimsubversion} NOT RELEASED" >> ~/nvim.vim
echo '" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM' >> ~/nvim.vim
echo '" Automatically generated keyword lists: {{{1' >> ~/nvim.vim
cat >>~/nvim.vim << ENDOFCAT
" Quit when a syntax file was already loaded {{{2
if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
set cpo&vim
" vimTodo: contains common special-notices for comments {{{2
" Use the vimCommentGroup cluster to add your own.
syn keyword vimTodo contained COMBAK FIXME TODO XXX
syn cluster vimCommentGroup contains=vimTodo,@Spell
" regular vim commands {{{2
ENDOFCAT
# these are the help files that will be scanned for commands, functions, etc
VimHelpFiles="autocmd.txt change.txt cmdline.txt debugger.txt debug.txt diff.txt digraph.txt editing.txt eval.txt filetype.txt fold.txt gui*.txt help.txt helphelp.txt if*.txt indent.txt index.txt insert.txt intro.txt map.txt mbyte.txt mlang.txt message.txt motion.txt netbeans.txt options.txt pattern.txt print.txt quickfix.txt quickref.txt quotes.txt recover.txt remote.txt repeat.txt scroll.txt sign.txt spell.txt starting.txt syntax.txt tabpage.txt tagsrch.txt term.txt terminal.txt undo.txt userfunc.txt various.txt vi_diff.txt vim9.txt vim9class.txt visual.txt windows.txt workshop.txt"
# Generate vimCommands
echo "generating vimCommands"
xgrep '{^\_*:|\*:[a-zA-Z][a-zA-Z0-9]*\*}' ${VimHelpFiles} | xgrep '!^>>&!z\[~[a-zA-Z]+\]' | sort > tmp
change -r '-/c/\*\s+\*:/\n:/g' tmp
change -r '-/c/\*:/:/g' '-/c/\*\s*$//' tmp
change -r '-/c/^[ \t]+//' '-/c/[ \t]+$//' tmp
change -r "-/c/\[N\]//" "-/c/\[addr\]//" "-/c/\[count\]//" "-/c/[\[{]range[}\]]//" "-/c/!//" "-/cZ/?*$ZZ" "-/c/N,M//" "-/c/<?%>//" tmp
change -r "-/c/[\{<]?*$//" "-/c/\[\]//" "-/c/...//g" "-/c/[!-\\/]+" '-/c/|?*$//' tmp
change -r '-/c/^?%:/:/' '-/c/\*E\d+\*//' '-/c/\*E\d+\_*$//' tmp
change -r '-/c/[ \t]?*$//' '-/c/\[\]//' tmp
change '-/c/^:\[line\]/:/' tmp > tmp2
sort -d tmp2 | Uniq -b | xgrep '^:@' > tmp
/bin/rm tmp2
change -r "c/://" tmp
xgrep "^\t+\*:" gui.txt | change "-/c/[*\t ]*:/ /g" "-/c/\*$//" "-/c/\t+/ /" "-/c/ +/\n/g" >> tmp
xgrep "!{^ec\[ho\]$|^let$|^var$|^unl\[et\]$|^com\[mand\]$|^hi\[ghlight\]$|^sy\[ntax\]$|^norm\[al\]$|^g\[lobal\]|^v\[global]}" tmp | sort -d | Uniq -b | xgrep -e "?" > tmp2
xgrep "!{^cm\[ap\]|^cno\[remap\]|^im\[ap\]|^ino\[remap\]|^lm\[ap\]|^ln\[oremap\]|^map|^nm\[ap\]|^nn\[oremap\]|^no\[remap\]|^om\[ap\]|^ono\[remap\]|^smap|^snor\[emap\]|^vm\[ap\]|^vn\[oremap\]|^xm\[ap\]|^xn\[oremap\]}" tmp2 > tmp3
xgrep "!{^cu\[nmap\]|iu\[nmap\]|lu\[nmap\]|nun\[map\]|ou\[nmap\]|sunm\[ap\]|unm\[ap\]|unm\[ap\]|vu\[nmap\]|xu\[nmap\]}" tmp3 > tmp2
xgrep "!{^ab\[breviate\]$|^ca\[bbrev\]$|^inorea\[bbrev\]$|^cnorea\[bbrev\]$|^norea\[bbrev\]$|^ia\[bbrev\]$}" tmp2 > tmp3
xgrep "!{^s$|^aug\[roup\]$|^s\[ubstitute\]$|^:$|^autocmd$|^au\[tocmd\]$|^do\[autocmd\]$|^doautoa\[ll\]$|^be\[have\]$|^exe\[cute\]$|^syntax$|^echoh\[l\]$}" tmp3 > tmp2
xgrep "!{^a\[ppend\]|^i\[nsert\]$|E#+}" tmp2 > tmp3
xgrep "!{^anoremenu$|^cnoremenu$|^be$|^inoremenu$|^nnoremenu$|^onoremenu$|^vnoremenu$|^noremenu$|^cnoreme$|^inoreme$|^nnoreme$|^onoreme$|^vnoreme$|^noreme$|^amenu$|^cmenu$|^imenu$|^nmenu$|^omenu$|^vmenu$|^menu$|^cme$|^ime$|^nme$|^ome$|^vme$|^am$|^an$|^me$}" tmp3 > tmp2
xgrep "!{^aun$|^aunmenu$|^cunme$|^cunmenu$|^iunme$|^iunmenu$|^nunme$|^nunmenu$|^ounme$|^ounmenu$|^unme$|^unmenu$|^vunme$|^vunmenu$|^winpos\*}" tmp2 > tmp3
xgrep "!{^unm\[ap\]|nun\[map\]|vu\[nmap\]|xu\[nmap\]|sunm\[ap\]|ou\[nmap\]|iu\[nmap\]|lu\[nmap\]|cu\[nmap\]|vmapc\[lear]}" tmp3 > tmp2
xgrep "!{-}" tmp2 > tmp3
xgrep "!{^[a-z]:[a-z]:[a-z]|^[a-z]:[a-z]|\?|p:[~.]|p:|Allargs|\<X\>|\<Error\>|\<Rena\>|\<Mycmd\>|\<MyCommand\>|\<Ntabmove\>|\<Renu\>|\<Ren\>|\<bar\>}" tmp3 > tmp2
xgrep '!{browseset|cmdname|\<quote\>|comment|\<count\>|dwim|filename|\<get\>|\<index\>|locale|mkdir|\<mv\>|nkf|synlist|xterm|\<emenu\*|^s\@|^let\@|^g$}' tmp2 > tmp3
echo "py3f[ile]" >> tmp3
xgrep '^[A-Z]+' tmp3 > tmp4
xgrep '!{^N$|^P$}' tmp4 > tmp5
xgrep '!{^[A-Z]}' tmp3 > tmp2
vim -u NONE -S ${SCRIPTS}/mkvimvim.vim tmp2
mcol -n100 tmp2 > tmp
mcol -n100 tmp5 > tmp4
change -r '1,$c/^/syn keyword vimCommand contained /' tmp
echo 'syn match vimCommand contained "\<z[-+^.=]\=\>"' >> tmp
change -r '1,$c/^/syn keyword vimStdPlugin contained /' tmp4
# Append vimCommands to <~/nvim.vim>
cat tmp tmp4 >> ~/nvim.vim
/bin/rm tmp tmp[2345]
cat >>~/nvim.vim << ENDOFCAT
" vimOptions are caught only when contained in a vimSet {{{2
ENDOFCAT
# Generate vimOptions
echo "generating vimOptions"
xgrep "^'&!^':'" options.txt | change "-/c/\t?*$//" "-/c/' and '/' '/" > tmp
change -r "-/c/{?*}'?%$/&1'/" "-/c/,//g" "-/c/' +'/\n/g" "-/c/'{@*}'?*.?*$/'&1'/" "-/c/'//g" "-/c/\s?*$" tmp
cat tmp | xgrep '!{bioskey|biosk|conskey|consk}' | sort | Uniq -b > tmp2
/bin/mv tmp2 tmp
/bin/rm *.bak
#mcol -n5 tmp | change "-/c/ +/\t/g" "-/c/\t+$//" > tmp2
mcol -n100 tmp > tmp2
/bin/mv tmp2 tmp
change -r '1,$c/^/syn keyword vimOption contained\t/' tmp
/bin/rm *.bak
# Append vimOptions to <~/nvim.vim>
cat tmp >> ~/nvim.vim
cat >>~/nvim.vim << ENDOFCAT
" vimOptions: These are the turn-off setting variants {{{2
ENDOFCAT
xgrep "\*'no" options.txt | change "-/c/^?%\*'no/no/" "-/c/'\* +\*'/\n/g" "-/c/\'\* *$//" "-/c/'?*$//" | xgrep "^no" > tmp
cat tmp | xgrep '!{nobioskey|nobiosk|noconskey|noconsk}' | sort | Uniq -b > tmp2
mcol -n100 tmp2 > tmp
change -r '1,$c/^/syn keyword vimOption contained\t/' tmp
cat tmp >> ~/nvim.vim
# note: I'm keeping tmp2 so its a simple change from noOption to invOption style
/bin/rm -f tmp *.bak
cat >>~/nvim.vim << ENDOFCAT
" vimOptions: These are the invertible variants {{{2
ENDOFCAT
change -r "c/^no/inv/" tmp2
mcol -n100 tmp2 > tmp
change -r '1,$c/^/syn keyword vimOption contained\t/' tmp
cat tmp >> ~/nvim.vim
/bin/rm -f tmp* *.bak
# Generating TermCap codes
echo "generating termcap codes"
cat >>~/nvim.vim << ENDOFCAT
" termcap codes (which can also be set) {{{2
ENDOFCAT
xgrep "^\tt_" term.txt | change "c/\t{t_??}\t?*$/&1/" | sort | Uniq -b > tmp
xgrep "t_[@#][@#]" tmp > tmp1
xgrep "!t_[@#][@#]" tmp > tmp2
/bin/rm tmp
#mcol -n6 tmp1 | change "-/c/ +/\t/g" "-/c/\t+$//" "-/c/^/syn keyword vimOption contained\t/" >> ~/nvim.vim
mcol -n100 tmp1 | change 'c/^/syn keyword vimOption contained\t/' >> ~/nvim.vim
change '1,$c/^?*$/syn match vimOption contained\t"&"/' tmp2 >> ~/nvim.vim
/bin/rm tmp1 tmp2
# Generating non-functional options (vi supports, vim doesn't)
echo "generating vimErrSettings"
cat >>~/nvim.vim << ENDOFCAT
" unsupported settings: some were supported by vi but don't do anything in vim {{{2
" others have been dropped along with msdos support
ENDOFCAT
xgrep "{\t\ttoggle|\t\tnumber}" vi_diff.txt | change "-/c/?%\*'{?%}'\*/&1 /g" "-/c/ /\n/g" | xgrep -e "?" > tmp
echo "bioskey biosk conskey consk autoprint beautify flash graphic hardtabs mesg novice open op optimize redraw slow slowopen sourceany w300 w1200 w9600" >> tmp
echo "nobioskey nobiosk noconskey noconsk noautoprint nobeautify noflash nographic nohardtabs nomesg nonovice noopen noop nooptimize noredraw noslow noslowopen nosourceany now300 now1200 now9600" >> tmp
sort tmp | Uniq -b > tmp2
mcol -n100 tmp2 | change '1,$c/^/syn keyword vimErrSetting contained\t' > tmp
cat tmp >> ~/nvim.vim
/bin/rm -f tmp tmp2
# Generating Autocmd stuff
echo "generating vimAutoEvents"
cat >>~/nvim.vim << ENDOFCAT
" AutoCmd Events {{{2
syn case ignore
ENDOFCAT
xgrep '\t\*[A-Z]?*\*$' autocmd.txt | change "-/c/^?%\*//" "-/c/ /\n/g" "-/c/\*//g" | sort | xgrep '!{^E\d+|UserGettingBored|Cmd-event}' | Uniq -b > tmp
#mcol -n5 tmp | change "-/c/ +/\t/g" "-/c/\t+$//" "-/c/^/syn keyword vimAutoEvent contained\t/" >> ~/nvim.vim
mcol -n100 tmp | change '1,$c/^/syn keyword vimAutoEvent contained\t/' >> ~/nvim.vim
/bin/rm -f tmp*
# Generating vimGroup stuff
echo "generating vimGroup"
cat >>~/nvim.vim << ENDOFCAT
" Highlight commonly used Groupnames {{{2
ENDOFCAT
xgrep '^\t[* ][A-Z]' syntax.txt | change "-/c/^\t[* ]//" "-/c/\t?*$//" > tmp
#mcol -n5 tmp | change "-/c/ +/\t/g" "-/c/\t+$//" "-/c/^/syn keyword vimGroup contained\t/" >> ~/nvim.vim
mcol -n100 tmp | change '1,$c/^/syn keyword vimGroup contained\t/' >> ~/nvim.vim
/bin/rm -f tmp* *.bak
# Generating vimHLGroup stuff
echo "generating vimHLGroup"
cat >>~/nvim.vim << ENDOFCAT
" Default highlighting groups {{{2
ENDOFCAT
xgrep '{^\_+\*highlight-groups\*,^======}^ *[A-Z]@* *\t' syntax.txt | change '-/c/^ *//' '-/c/\t?*$//' | sort | xgrep '!Conceal' | Uniq -b > tmp
#mcol -n5 tmp | change "-/c/ +/\t/g" "-/c/\t+$//" "-/c/^/syn keyword vimHLGroup contained\t/" >> ~/nvim.vim
mcol -n100 tmp | change '1,$c/^/syn keyword vimHLGroup contained\t/' >> ~/nvim.vim
cat >>~/nvim.vim << ENDOFCAT
syn match vimHLGroup contained "Conceal"
ENDOFCAT
/bin/rm -f tmp* *.bak
# Include vim functions
echo "generating vimFunc"
cat >>~/nvim.vim << ENDOFCAT
syn case match
" Function Names {{{2
ENDOFCAT
change -c '/^\I\i*(/c/(?*//' eval.txt builtin.txt | sort | Uniq -b | xgrep '!{^scanf|expr[89]}' > tmp
#mcol -n5 tmp | change "-/c/\_+$//" "-/c/ +/\t/g" "-/c/^/syn keyword vimFuncName contained\t/" >> ~/nvim.vim
mcol -n100 tmp | change '1,$c/^/syn keyword vimFuncName contained\t/' >> ~/nvim.vim
cat >>~/nvim.vim << ENDOFCAT
ENDOFCAT
/bin/rm tmp
# Done
cat >>~/nvim.vim << ENDOFCAT
"--- syntax here and above generated by mkvimvim ---
ENDOFCAT
# remove any trailing whitespace
# move nvim.vim from $HOME to $VIMRUNTIME
change -r 'c/\s+$//' ~/nvim.vim
echo "/bin/mv ~/nvim.vim ${VIMRUNTIME}/syntax"
/bin/mv ~/nvim.vim ${VIMRUNTIME}/syntax
echo "Now done creating <${VIMRUNTIME}/syntax/nvim.vim>, you will need to merge it with <vim.vim>"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment