Avoiding Modelines with scripts.vim

Alex R. Young
usevim
Published in
1 min readDec 29, 2013

I don’t like .gitignore files very much. For general things I want Git to ignore, like .DS_Store and *.sw?, I prefer to use ~/.gitignore_global. Similarly, rather than using modelines to improve filetype detection I use .vim/scripts.vim.

Here’s an example: I have a Node project that has command-line scripts that I’ve written in JavaScript. The scripts are named without .js: bin/chpass, bin/run_migration, etc. These files start with #!/usr/bin/env node, but Vim doesn't know they're JavaScript so the syntax highlighting is off.

I could add a modeline, like this: // vim: set ft=javascript. The problem with that is I've now added an editor-specific line. What if other people on my team use Emacs or Sublime Text?

A better solution is to use .vim/scripts.vim:

if did_filetype()
finish
endif
if getline(1) =~# '^#!.*/bin/env\s\+node\>'
setfiletype javascript
endif

The getline function is used to compare the first line of the file against a regular expression that looks for scripts that use node (source: http://stackoverflow.com/a/8891619/306167).

For more about scripts.vim, take a look at :help new-filetype-scripts.

--

--