Created
January 30, 2024 22:12
-
-
Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.
Revisions
-
chrisbra created this gist
Jan 30, 2024 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,282 @@ #! /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>"