" Override system filetype.vim if exists('g:did_load_filetypes') finish endif let g:did_load_filetypes = 1 " If we don't have +autocmd or are 'compatible', do nothing, and don't try " again later if !has('autocmd') || &compatible finish endif " Helper function to run the 'filetypedetect' group on a file with its " extension stripped off function! s:StripRepeat() " Check we have the fnameescape() function if !exists('*fnameescape') return endif " Expand the match result let l:fn = expand('') " Strip leading and trailing #hashes# if l:fn =~# '\m^#\+.*#\+$' let l:fn = substitute(l:fn, '\m^#\+\(.\+\)#\+$', '\1', '') " Strip trailing tilde~ elseif l:fn =~# '\m\~$' let l:fn = substitute(l:fn, '\~$', '', '') " Strip generic .extension else let l:fn = expand(':r') endif " Re-run the group if there's anything left if strlen(l:fn) execute 'doautocmd filetypedetect BufRead ' . fnameescape(l:fn) endif endfunction " Check whether the first line was changed and looks like a shebang, and if " so, re-run filetype detection function! s:CheckShebang() if line('''[') == 1 && stridx(getline(1), '#!') == 0 doautocmd filetypedetect BufRead endif endfunction " Use our own filetype detection rules augroup filetypedetect autocmd! " Unwrap hashes, tildes, generic extensions, and Debian packaging working " extensions (if we can do so safely), and repeat the filetype detection to " see if there's a match beneath them autocmd BufNewFile,BufRead \ #?*# \,?*~ \,?*.{bak,example,in,new,old,orig,sample,test} \,?*.dpkg-{bak,dist,new,old} \ call s:StripRepeat() " Stuff Tom cares about enough and edits often enough to type based on " filename patterns follows. " Apache config autocmd BufNewFile,BufRead \ .htaccess \,*/apache*/?*.conf \ setfiletype apache " AWK files autocmd BufNewFile,BufRead \ ?*.awk \ setfiletype awk " BIND zone file autocmd BufNewFile,BufRead \ */bind/db.?* \,*/namedb/db.?* \,named.root \ setfiletype bindzone " C files autocmd BufNewFile,BufRead \ ?*.c \,?*.h \ setfiletype c " C++ files autocmd BufNewFile,BufRead \ ?*.cpp \,?*.cxx \,?*.c++ \,?*.hh \ setfiletype cpp " crontab(5) files autocmd BufNewFile,BufRead \ crontab \,crontab.* \,cron.d/* \ setfiletype crontab " CSS files autocmd BufNewFile,BufRead \ ?*.css \ setfiletype css " CSV files autocmd BufNewFile,BufRead \ ?*.csv \ setfiletype csv " Diff and patch files autocmd BufNewFile,BufRead \ ?*.diff \,?*.patch \,?*.rej \ setfiletype diff " INI files autocmd BufNewFile,BufRead \ ?*.ini \ setfiletype dosini " DOT graphs autocmd BufNewFile,BufRead \ ?*.dot \ setfiletype dot " Forth autocmd BufNewFile,BufRead \ ?*.fs,?*.ft \ setfiletype forth " fstab(5) files autocmd BufNewFile,BufRead \ fstab \ setfiletype fstab " GDB init files autocmd BufNewFile,BufRead \ .gdbinit \ setfiletype gdb " Git commit messages autocmd BufNewFile,BufRead \ COMMIT_EDITMSG \,MERGE_MSG \,TAG_EDITMSG \ setfiletype gitcommit " Git config files autocmd BufNewFile,BufRead \ *.git/config \,.gitconfig \,.gitmodules \,gitconfig \ setfiletype gitconfig " Git rebase manifests autocmd BufNewFile,BufRead \ git-rebase-todo \ setfiletype gitrebase " GnuPG configuration files autocmd BufNewFile,BufRead \ *gnupg/options \,*gnupg/gpg.conf \ setfiletype gpg " UNIX group file autocmd BufNewFile,BufRead \ /etc/group \,/etc/group- \,/etc/group.edit \,/etc/gshadow \,/etc/gshadow- \,/etc/gshadow.edit \ setfiletype group " GTK settings files autocmd BufNewFile,BufRead \ .gktrc*, \,gktrc* \ setfiletype gtkrc " Vim help files autocmd BufNewFile,BufRead \ ~/.vim/doc/?*.txt \,*/vim-*/doc/?*.txt \,*/*.vim/doc/?*.txt \,$VIMRUNTIME/doc/?*.txt \ setfiletype help " HTML files autocmd BufNewFile,BufRead \ ?*.html \,?*.htm \ setfiletype html " inittab(5) files autocmd BufNewFile,BufRead \ inittab \ setfiletype inittab " Java files autocmd BufNewFile,BufRead \ ?*.java \,?*.jav \ setfiletype java " JSON files autocmd BufNewFile,BufRead \ ?*.js \ setfiletype javascript " JSON files autocmd BufNewFile,BufRead \ ?*.json \ setfiletype json " Lex files autocmd BufNewFile,BufRead \ ?*.l \,?*.lex \ setfiletype lex " Lua files autocmd BufNewFile,BufRead \ ?*.lua \ setfiletype lua " m4 files autocmd BufNewFile,BufRead \ ?*.m4 \ setfiletype m4 " Mail messages autocmd BufNewFile,BufRead \ ?*.msg \,mutt-*-[0-9]\+-[0-9]\+-[0-9]\+ \ setfiletype mail " Mail messages autocmd BufNewFile,BufRead \ aliases \ setfiletype mailaliases " Makefiles autocmd BufNewFile,BufRead \ Makefile \,makefile \ setfiletype make " Markdown files autocmd BufNewFile,BufRead \ ?*.markdown \,?*.md \ setfiletype markdown " Add automatic commands to detect .muttrc files autocmd BufNewFile,BufRead \ Muttrc \,*/muttrc.d/*.rc \,.muttrc \,/etc/Muttrc.d/* \ setfiletype muttrc " BIND configuration file autocmd BufNewFile,BufRead \ named.conf \,rndc.conf \,rndc.key \ setfiletype named " Nano configuration file autocmd BufNewFile,BufRead \ *.nanorc \,*/etc/nanorc \ setfiletype nanorc " netrc file autocmd BufNewFile,BufRead \ .netrc \,netrc \ setfiletype netrc " roff files autocmd BufNewFile,BufRead \ ?*.roff \,?*.[1-9] \,*/man[1-9]*/?*.[1-9]* \ setfiletype nroff " UNIX password and shadow files autocmd BufNewFile,BufRead \ /etc/passwd \,/etc/passwd- \,/etc/passwd.edit \,/etc/shadow \,/etc/shadow- \,/etc/shadow.edit \ setfiletype passwd " pass(1) password files autocmd BufNewFile,BufRead \ /dev/shm/pass.?*/?*.txt \,$TMPDIR/pass.?*/?*.txt \,/tmp/pass.?*/?*.txt \ setfiletype password " Perl 5 files autocmd BufNewFile,BufRead \ ?*.pl \,?*.pm \,*/t/?*.t \,*/xt/?*.t \,Makefile.PL \ setfiletype perl " Perl 6 files autocmd BufNewFile,BufRead \ ?*.p6 \,?*.pl6 \,?*.pm6 \ setfiletype perl6 " PHP files autocmd BufNewFile,BufRead \ ?*.php \ setfiletype php " Perl 5 POD files autocmd BufNewFile,BufRead \ ?*.pod \ setfiletype pod " Perl 6 POD files autocmd BufNewFile,BufRead \ ?*.pod6 \ setfiletype pod6 " Python files autocmd BufNewFile,BufRead \ ?*.py \ setfiletype python " Readline configuration file autocmd BufNewFile,BufRead \ .inputrc \,inputrc \ setfiletype readline " Remind files autocmd BufNewFile,BufRead \ .reminders \,?*.rem \,?*.remind \ setfiletype remind " robots.txt files autocmd BufNewFile,BufRead \ robots.txt \ setfiletype robots " Ruby autocmd BufNewFile,BufRead \ ?*.rb \ setfiletype ruby " sed files autocmd BufNewFile,BufRead \ ?*.sed \ setfiletype sed " Services files autocmd BufNewFile,BufRead \ /etc/services \ setfiletype services " Bash shell autocmd BufNewFile,BufRead \ ?*.bash \,.bash_aliases \,.bash_completion \,.bash_logout \,.bash_profile \,.bashrc \,bash-fc.?* \,bash_aliases \,bash_completion \,bash_logout \,bash_profile \,bashrc \ let b:is_bash = 1 \|setfiletype sh " Korn shell autocmd BufNewFile,BufRead \ ?*.ksh \,.kshrc \,kshrc \ let b:is_kornshell = 1 \|setfiletype sh " POSIX/Bourne shell autocmd BufNewFile,BufRead \ ?*.sh \,$ENV \,.profile \,.shinit \,.shrc \,.xinitrc \,/etc/default/* \,configure \,profile \,shinit \,shrc \,xinitrc \ let b:is_posix = 1 \|setfiletype sh " SQL autocmd BufNewFile,BufRead \ ?*.sql \ setfiletype sql " OpenSSH configuration autocmd BufNewFile,BufRead \ ssh_config,*/.ssh/config \ setfiletype sshconfig " sudoers(5) autocmd BufNewFile,BufRead \ sudoers \,sudoers.tmp \ setfiletype sshdconfig " OpenSSH server configuration autocmd BufNewFile,BufRead \ sshd_config \ setfiletype sudoers " Subversion commit autocmd BufNewFile,BufRead \ svn-commit*.tmp \ setfiletype svn " Systemd unit files autocmd BufNewFile,BufRead \ */systemd/*.* \ setfiletype systemd " TCL autocmd BufNewFile,BufRead \ ?*.tcl \ setfiletype tcl " Terminfo autocmd BufNewFile,BufRead \ ?*.ti \ setf terminfo " Tidy config autocmd BufNewFile,BufRead \ .tidyrc \,tidyrc \ setfiletype tidy " tmux configuration files autocmd BufNewFile,BufRead \ .tmux.conf \,tmux.conf \ setfiletype tmux " Tab-separated (TSV) files autocmd BufNewFile,BufRead \ ?*.tsv \ setfiletype tsv " VimL files autocmd BufNewFile,BufRead \ ?*.vim \,*.exrc \,*.gvimrc \,*.vimrc \,_exrc \,_gvimrc \,_vimrc \,exrc \,gvimrc \,vimrc \ setfiletype vim " .viminfo files autocmd BufNewFile,BufRead \ .viminfo \ setfiletype viminfo " .wgetrc files autocmd BufNewFile,BufRead \ .wgetrc \,wgetrc \ setfiletype wget " Add automatic commands to find Xresources subfiles autocmd BufNewFile,BufRead \ .Xresources \,*/.Xresources.d/* \,Xresources \,*/Xresources.d/* \ setfiletype xdefaults " XHTML files autocmd BufNewFile,BufRead \ ?*.xhtml \,?*.xht \ setfiletype xhtml " XML files autocmd BufNewFile,BufRead \ ?*.xml \ setfiletype xml " Perl XS autocmd BufNewFile,BufRead \ ?*.xs \ setfiletype xs " Yacc files autocmd BufNewFile,BufRead \ ?*.y \,?*.yy \ setfiletype yacc " YAML files autocmd BufNewFile,BufRead \ ?*.yaml \ setfiletype yaml " Z shell files autocmd BufNewFile,BufRead \ ?*.zsh \,.zprofile \,.zshrc \,zprofile \,zshrc \ setfiletype zsh " Load any extra rules in ftdetect directories runtime! ftdetect/*.vim " Generic text, config, and log files, if no type assigned yet autocmd BufNewFile,BufRead \ ?*.text \,?*.txt \,INSTALL \,README \,/etc/issue \,/etc/motd \ setfiletype text autocmd BufNewFile,BufRead \ ?*.cfg \,?*.conf \,?*.config \,/etc/* \ setfiletype config autocmd BufNewFile,BufRead \ */log/* \,?*.log \ setfiletype messages " Clumsy attempt at typing files in `sudo -e` if a filename hasn't already " been found; strip temporary extension and re-run autocmd BufNewFile,BufRead \ /var/tmp/?*.???????? \ if !did_filetype() \| call s:StripRepeat() \|endif " If we still don't have a filetype, run the scripts.vim file that performs " cleverer checks including looking at actual file contents--but only my " custom one; don't load the system one at all. autocmd BufNewFile,BufRead,StdinReadPost \ * \ if !did_filetype() \| runtime scripts.vim \|endif " If supported, on leaving insert mode, check whether the first line was " changed and looks like a shebang format, and if so, re-run filetype " detection if v:version > 700 autocmd InsertLeave * call s:CheckShebang() endif augroup END