autocmd check filename in vim?

Tag: vim , if-statement , autocmd Author: loveagogo Date: 2011-04-29

I want to write some autocmd's that check if the filename is this or that..

I've been trying:

autocmd VimEnter * if % is "preamble" | Explore | endif
autocmd VimEnter * if %=="preamble" | Explore | endif
autocmd VimEnter * if &filename == "preamble" | Explore | endif

but none of this works?

WHat should I do?

(this example is over-simplified, note that I'd also like to have an else statement).

I doubt whether VimEnter is the best event to trigger this autocmd. VimEnter happens once when you start a Vim instance and not after that. BufRead happens each time a buffer is opened, regardless of whether Vim was open already or not (and likewise with BufNewFile).
Yeah I'm actually using BufNew to make it work
Thank you all for your swift responses!
This is what I'm using to change the color scheme except if the current buffer is a MiniBufExpl bufer and it seems to be working: autocmd BufEnter * if bufname("%") !=? '-MiniBufExplorer-' | colorscheme default | endif

Best Answer

You should get the current file name as @%. For e.g., echo @% will give you the filename, whereas echo % will not. However, for actions on the file, use %, e.g. source %.

This should probably work for what you want to do:

autocmd VimEnter * if @% == 'preamble' | echo 'hello' | else | echo 'world' | endif

Other Answer1

autocmd BufRead,BufNewFile preamble Explore


Ok this works.. I would also like to have an else statement. Is this possible?
@romeoevs: For effect of an else one way is to just create another autocmd that matches everything except 'preamble'. I think this would do it: autocmd BufRead, BufNewFile [^\(preamble\)] function_here (See my separate Answer for info on what you were doing wrong and how the file-slot in autocmd works.)

Other Answer2

There are two problems with the examples in original post:

  1. Neither the percent character nor &filename will return the filename as you've used them. Look at the expand() function to see how to get the filename: :h expand()

  2. You're ignoring the slot in autocmd where a file-matching-pattern would ordinarily be specified. The third slot in the autocmd ('*' in your versions) is actually a pattern to match filenames. See :h autocmd-patterns. It should work okay if you want to ignore the pattern slot, but if so you've got to fix the problem in par. 1 above. E.g.,

    autocmd BufRead, BufNewFile * if expand('%') =~ "preamble" | Explore | endif