autocmd check filename in vim?
Asked Answered
W

4

10

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).

Whip answered 15/5, 2011 at 16:31 Comment(4)
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).Manysided
Yeah I'm actually using BufNew to make it workWhip
Thank you all for your swift responses!Whip
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 | endifPrairie
S
14

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
Stammel answered 15/5, 2011 at 17:29 Comment(1)
Is it possible to do more than one thing in 'if' part or 'else' part? e.g. autocmd VimEnter * if @% == 'preamble' | echo 'hello1'; echo 'hello2' | else | echo 'world1'; echo 'world2' | endif Standpipe
M
7
autocmd BufRead,BufNewFile preamble Explore
Mitch answered 15/5, 2011 at 16:36 Comment(2)
Ok this works.. I would also like to have an else statement. Is this possible?Whip
@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.)Manysided
M
5

There are two problems with the examples in the original post:

  1. Neither the % nor &filename will return the filename as you've used them.
    Look at the help for 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 paragraph 1 above. E.g.,

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

Manysided answered 15/5, 2011 at 17:28 Comment(0)
S
4

Additional Info Using '@%' with autocmd

Some autocmd events do not support the @% named register to read the current file name. In these cases it is better to use <afile>:

expand('<afile>')
Skyrocket answered 21/1, 2016 at 11:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.