On 08:33 Sun 06 May , Alessio 'mOLOk' Bolognino wrote:
Hi Guys, I spent an insane amount of time (last night) writing this (I hope so) useful thing: it's a vim syntax file for PKGBUILDs, to use it you should put it in ~/.vim/syntax/ and add this line at the bottom of your ~/.vimrc:
autocmd BufReadPost PKGBUILD set filetype=PKGBUILD
The colors are more or less random, but it does (cool?) things like check for wrong pkgname, pkgver, pkgrel, it complains if the pkgdesc is too long, and other stuff. This is my first syntax file (and I hope it'll be the last :) I'm not a regex guru so many things could be buggy, but well, feel free to improve it and add your name in the headers. Cheers,
Here is the patch: [...]
Well, I improved it a bit, the new patch is based on the current repo (not on the old patch), so, if you want to try it, apply this one only. Here is a little feature list: it marks: invalid pkgname (strange or >32 chars); pkgrel (containing hyphens or other shit); pkgrel (everything but digits); pkgdesc too long (>80 chars) and pkgdesc containing "foobar is a" that is a common error (800+ packages in the AUR begins with this description...); wrong url (without http:// and others); wrong licenses (everything but the common ones and custom:foobar) wrong arch (not i686 || x86_64 || ppc) non standard .install file (i.e. without the .install suffix ) specific sourceforge mirror in the source array (very common error too) md5sums != 32 chars sha1sums != 40 chars wrong options (and marks "no" in nooption in yellow because it is deprecated); In the build() it is used the sh.vim syntax-file. I think this syntax file is very useful while checking users' packages and avoids some common errors. Enjoy it VIMmers :) --- contrib/PKGBUILD.vim | 287 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 287 insertions(+), 0 deletions(-) create mode 100644 contrib/PKGBUILD.vim diff --git a/contrib/PKGBUILD.vim b/contrib/PKGBUILD.vim new file mode 100644 index 0000000..f82eb5a --- /dev/null +++ b/contrib/PKGBUILD.vim @@ -0,0 +1,287 @@ +" Vim syntax file +" Language: PKGBUILD +" Maintainer: Alessio 'mOLOk' Bolognino <themolok@gmail.com> +" Last Change: 2007/05/08 +" Version Info: PKGBUILD-0.1 + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + + +" case on +syn case match + +" pkgname +" FIXME if '=' is in the pkgname/pkgver, it highlight all the pkgname, not only the '=' +syn keyword pb_k_pkgname pkgname contained +syn match pbValidPkgname /\([[:alnum:]]\|+\|-\|_\){,32}/ contained contains=pbIllegalPkgname +syn match pbIllegalPkgname /[[:upper:]]\|[^[:alnum:]-+_=]\|=.*=\|=['"]\?.\{33,\}['"]\?/ contained +"syn match pbIllegalPkgname /=.\{33,\}/ contains=pbValidPkgname contained +"syn match pbIllegalPkgname /[^=]/ contains=pbValidPkgname contained +"syn match pbValidPkgname /=\([[:lower:][:digit:]-_+]\)\{,32\}/ contained +"syn match pbIllegalPkgname /[^=]/ contains=pbValidPkgname contained +"syn match pbValidPkgname /=\([[:digit:][:lower:]]\|+\|-\|_\)\{,32\}/ contained +syn match pbPkgnameGroup /^pkgname=.*/ contains=pbIllegalPkgname,pb_k_pkgname ",pbValidPkgname + +" pkgver +syn keyword pb_k_pkgver pkgver contained +syn match pbValidPkgver /\([[:alnum:]]\|\.\|+\|_\)/ contained contains=pbIllegalPkgver +syn match pbIllegalPkgver /[^[:alnum:]+=\.\_]\|=.*=/ contained +syn match pbPkgverGroup /^pkgver=.*/ contains=pbIllegalPkgver,pbValidPkgver,pb_k_pkgver + +" pkgrel +syn keyword pb_k_pkgrel pkgrel contained +syn match pbValidPkgrel /[[:digit:]]*/ contained contains=pbIllegalPkgver +"syn match pbIllegalPkgrel /[^[:alnum:]=]\|[[:alpha:]]/ contained +syn match pbIllegalPkgrel /[^[:digit:]=]\|=.*=/ contained +syn match pbPkgrelGroup /^pkgrel=.*/ contains=pbIllegalPkgrel,pbValidPkgrel,pb_k_pkgrel + +" pkgdesc +syn keyword pb_k_desc pkgdesc contained +" 90 chars: 80 for description, 8 for pkgdesc and 2 for '' +syn match pbIllegalPkgdesc /.\{90,}\|=['"]\?.*['" ]\+[iI][sS] [aA]/ contained contains=pbPkgdescSign +syn match pbValidPkgdesc /[^='"]\.\{,80}/ contained contains=pbIllegalPkgdesc +syn match pbPkgdescGroup /^pkgdesc=.*/ contains=pbIllegalPkgdesc,pb_k_desc,pbValidPkgdesc +syn match pbPkgdescSign /[='"]/ contained + + +" url +syn keyword pb_k_url url contained +syn match pbValidUrl /['"]*\(https\|http\|ftp\)\:\/.*\.\+.*/ contained + +syn match pbIllegalUrl /[^=]/ contained contains=pbValidUrl +"syn match pbIllegalUrl /\(https\|http\|ftp\)\:\/\/.*/ contained +syn match pbUrlGroup /^url=.*/ contains=pbValidUrl,pb_k_url,pbIllegalUrl +"syn match pbEq /=/ contained + +" license +syn keyword pb_k_license license contained +syn keyword pbLicense APACHE CDDL EPL FDL GPL LGPL MPL PHP RUBY ZLIB ISC MIT BSD contained +syn match pbLicenseCustom /custom\(:[[:alnum:]]*\)*/ contained +"syn match pbValidLicense /[^=][('")]*/ contained +"syn match pbLicenseGroup /^license=.*/ contains=pb_k_license,pbLicense,pbValidLicense,pbLicenseCustom +syn match pbIllegalLicense /[^='"() ]/ contained contains=pbLicenseCustom,pbLicense +syn match pbLicenseGroup /^license=.*/ contains=pb_k_license,pbLicenseCustom,pbLicense,pbIllegalLicense + +" backup +syn keyword pb_k_backup backup contained +syn match pbValidBackup /\.\?[[:alpha:]]*\/[[:alnum:]\{\}+._$-]*]*/ contained +syn match pbBackupGroup /^backup=.*/ contains=pb_k_backup,pbValidBackup + +" arch +syn keyword pb_k_arch arch contained +syn keyword pbArch i686 x86_64 ppc contained +syn match pbIllegalArch /[^='() ]/ contained contains=pbArch +syn match pbArchGroup /^arch=.*/ contains=pb_k_arch,pbArch,pbIllegalArch + +" makedepends +syn keyword pb_k_makedepends makedepends contained +syn match pbValidMakedepends /\([[:alnum:]]\|+\|-\|_\)*/ contained +"syn match pbMakedependsGroup /^makedepends=.*/ contains=pb_k_makedepends,pbValidMakedepends +syn region pbMakedependsGroup start=/^makedepends=(/ end=/)/ contains=pb_k_makedepends,pbValidMakedepends + +" depends +syn keyword pb_k_depends depends contained +syn match pbValidDepends /\([[:alnum:]]\|+\|-\|_\)*/ contained +"syn match pbDependsGroup /^depends=.*/ contains=pb_k_depends,pbValidDepends +syn region pbDependsGroup start=/^depends=(/ end=/)/ contains=pb_k_depends,pbValidDepends + +" XXX little hack to color conflicts/provides/replaces keyword even without =() +syn match pbkw /^\(conflicts\|provides\|replaces\)/ contains=pb_k_conflicts,pb_k_provides,pb_k_replaces +hi link pbkw keyword + +" conflicts +"syn keyword pb_k_conflicts conflicts +syn keyword pb_k_conflicts conflicts contained +syn match pbValidConflicts /\([[:alnum:]]\|+\|-\|_\)*/ contained +"syn match pbConflictsGroup /^conflicts=.*/ contains=pb_k_conflicts,pbValidConflicts +syn region pbConflictsGroup start=/^conflicts=(/ end=/)/ contains=pb_k_conflicts,pbValidConflicts +"syn region pbConflictsGroup start=/^conflicts=(/ end=/)/ contains=pbValidConflicts + +" provides +"syn keyword pb_k_provides provides +syn keyword pb_k_provides provides contained +syn match pbValidProvides /\([[:alnum:]]\|+\|-\|_\)*/ contained +"syn match pbProvidesGroup /^provides=.*/ contains=pb_k_provides,pbValidProvides +syn region pbProvidesGroup start=/^provides=(/ end=/)/ contains=pb_k_provides,pbValidProvides +"syn region pbProvidesGroup start=/^provides=(/ end=/)/ contains=pbValidProvides + +" replaces +"syn keyword pb_k_replaces replaces +syn keyword pb_k_replaces replaces contained +syn match pbValidReplaces /\([[:alnum:]]\|+\|-\|_\)*/ contained +"syn match pbReplacesGroup /^replaces=.*/ contains=pb_k_replaces,pbValidReplaces +syn region pbReplacesGroup start=/^replaces=(/ end=/)/ contains=pb_k_replaces,pbValidReplaces +"syn region pbReplacesGroup start=/^replaces=(/ end=/)/ contains=pbValidReplaces + +" install +syn keyword pb_k_install install contained +syn match pbValidInstall /\([[:alnum:]]\|\$\|+\|-\|_\)*\.install/ contained +syn match pbIllegalInstall /[^=]/ contained contains=pbValidInstall +"syn match pbInstall /\([a-z]\|+\|-\)*\.install/ contained +syn match pbInstallGroup /^install=.*/ contains=pb_k_install,pbValidInstall,pbIllegalInstall + +" source +syn keyword pb_k_source source contained + +" search for specific sf.net mirrors +syn match pbIllegalSource /\(http\|ftp\|https\).*\.\+\(dl\|download.\?\)\.\(sourceforge\|sf\).net/ contained +syn match pbSourceRemote /['"]*\(https\|http\|ftp\)\:\/\/.*[[:alnum:]"']/ contained contains=pbIllegalSource +"syn match pbSourceLocal /[[:alnum:]+._${}\/-]\+/ contained +"syn match pbSourceLocal /[[:alnum:]+._${}-]\+/ contained +syn region pbSourceGroup start=/^source=(/ end=/)/ contains=pb_k_source,pbSourceRemote +",pbSourceLocal +"syn match pbSourceGroup /^source=.*/ contains=pb_k_source,pbSourceRemote,pbSourceLocal + + +" md5sums +syn keyword pb_k_md5sums md5sums contained +syn match pbValidMd5sums /[[:alnum:]]\{32\}/ contained +syn match pbIllegalMd5sums /[^='"()\/ ]/ contained contains=pbValidMd5sums +syn region pbMd5sumsGroup start=/^md5sums/ end=/)/ contains=pb_k_md5sums,pbValidMd5sums,pbIllegalMd5sums + +" sha1sums +syn keyword pb_k_sha1sums sha1sums contained +syn match pbValidSha1sums /[[:alnum:]]\{40\}/ contained +syn match pbIllegalSha1sums /[^='"()\/ ]/ contained contains=pbValidSha1sums +syn region pbSha1sumsGroup start=/^sha1sums/ end=/)/ contains=pb_k_sha1sums,pbValidSha1sums,pbIllegalSha1sums + +" options +syn keyword pb_k_options options contained +"syn keyword pbOptions strip docs libtool emptydirs ccache distcc makeflags force contained +syn match pbOptions /\(no\)\?\(strip\|docs\|libtool\|emptydirs\|ccache\|distcc\|makeflags\|force\)/ contained +" syn match pbOptionsNeg /\(\!\|no\)/ contained +syn match pbOptionsNeg /\!/ contained +syn match pbOptionsDeprec /no/ contained +syn region pbOptionsGroup start=/^options=(/ end=/)/ contains=pb_k_options,pbOptions,pbOptionsNeg,pbOptionsDeprec,pbIllegalOption +syn match pbIllegalOption /[^!"'()= ]/ contained contains=pbOptionsDeprec,pbOptions + +" noextract +syn match pbNoextract /[[:alnum:]+._${}-]\+/ contained +syn keyword pb_k_noextract noextract contained +syn region pbNoextractGroup start=/^noextract=(/ end=/)/ contains=pb_k_noextract,pbNoextract + +" comments +syn keyword pb_k_maintainer Maintainer Contributor contained +"syn match pbMaintainer /:.*/ contained +syn match pbMaintainerGroup /Maintainer.*/ contains=pbMaintainer contained + +syn match pbDate /[0-9]\{4}\/[0-9]\{2}\/[0-9]\{2}/ contained + +syn cluster pbCommentGroup contains=pbTodo,pb_k_maintainer,pbMaintainerGroup,pbDate +syn keyword pbTodo contained COMBAK FIXME TODO XXX +syn match pbComment "^#.*$" contains=@pbCommentGroup +syn match pbComment "[^0-9]#.*$" contains=@pbCommentGroup + +hi link pbComment Comment +hi link pbTodo Todo + +hi link pbValidPkgname Special +hi link pbPkgnameGroup Normal +hi link pbIllegalPkgname Error +hi link pb_k_pkgname Keyword + +hi link pbValidPkgver StorageClass +hi link pbPkgverGroup Normal +hi link pbIllegalPkgver Error +hi link pb_k_pkgver Keyword + +hi link pbValidPkgrel Number +hi link pbPkgrelGroup Normal +hi link pbIllegalPkgrel Error +hi link pb_k_pkgrel Keyword + +hi link pbValidPkgdesc Special +hi link pbPkgdescGroup Normal +hi link pbIllegalPkgdesc Error +hi link pb_k_desc Keyword +hi link pbPkgdescSign Normal + +hi link pbIllegalUrl Error +hi link pbValidUrl Comment +hi link pbUrlGroup Normal +hi link pbEq Normal +hi link pb_k_url Keyword + +hi link pb_k_license Keyword +hi link pbLicense Number +hi link pbLicenseCustom Number +hi link pbLicenseGroup Normal +hi link pbValidLicense Normal +hi link pbIllegalLicense Error + +hi link pbBackupGroup Normal +hi link pbValidBackup Identifier +hi link pb_k_backup Keyword + +hi link pbArchGroup Normal +hi link pb_k_arch Keyword +hi link pbArch Number +hi link pbIllegalArch Error + +hi link pbMakedependsGroup Normal +hi link pb_k_makedepends Keyword +hi link pbValidMakedepends Comment + +hi link pbDependsGroup Normal +hi link pb_k_depends Keyword +hi link pbValidDepends StorageClass + +hi link pbReplacesGroup Normal +hi link pb_k_replaces Keyword +hi link pbValidReplaces Identifier + +hi link pbConflictsGroup Normal +hi link pb_k_conflicts Keyword +hi link pbValidConflicts Number + +hi link pbProvidesGroup Normal +hi link pb_k_provides Keyword +hi link pbValidProvides Special + +hi link pbValidInstall Normal +hi link pbIllegalInstall Error +hi link pb_k_install Keyword + +"hi link pbSourceLocal Identifier +hi link pb_k_source Keyword +hi link pbSourceRemote Number +hi link pbSourceGroup Normal +hi link pbIllegalSource Error + +hi link pb_k_md5sums Keyword +hi link pbMd5sumsGroup Normal +hi link pbValidMd5sums StorageClass +hi link pbIllegalMd5sums Error + +hi link pb_k_sha1sums Keyword +hi link pbSha1sumsGroup Normal +hi link pbValidSha1sums Number +hi link pbIllegalSha1sums Error + +hi link pb_k_options Keyword +hi link pbOptions StorageClass +hi link pbOptionsNeg StorageClass +hi link pbOptionsGroup Normal +hi link pbOptionsDeprec Todo +hi link pbIllegalOption Error + +hi link pb_k_noextract Keyword +hi link pbNoextract Identifier +hi link pbNoextractGroup Normal + +hi link pb_k_maintainer Keyword +"hi link pbMaintainer Normal + +hi link pbDate Special + +syntax include @SHELL syntax/sh.vim +syntax region BUILD start=/^build()/ end=/^}/ contains=@SHELL +let b:current_syntax = "PKGBUILD" + +" vim: ft=vim -- 1.5.1 -- Alessio 'mOLOk' Bolognino Arch Linux Trusted User Public Key @ http://themolok.netsons.org/uploads/themolok.asc Key ID = 1024D / FE0270FB 2007-04-11 Key Fingerprint = 9AF8 9011 F271 450D 59CF 2D7D 96C9 8F2A FE02 70FB