Created
January 30, 2024 22:12
-
-
Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.
mkvimvim.ksh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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 <[email protected]>' >> ~/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