Skip to content

Instantly share code, notes, and snippets.

@chrisbra
Created January 30, 2024 22:12
Show Gist options
  • Select an option

  • Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.

Select an option

Save chrisbra/58a5e36a8ab4fd41cf973b934a487c9b to your computer and use it in GitHub Desktop.

Revisions

  1. chrisbra created this gist Jan 30, 2024.
    282 changes: 282 additions & 0 deletions gistfile1.txt
    Original 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>"