3

I have encountered some situations where I need to check if a value matches a regex in a list of regexes. For instance, say I have a list of regexes which match filetypes:

['gundo', 'nerdtree', 'git*']

I need to find out if the filetype of the current file matches any of these regexes. The way I would do it currently would look like this:

fun! IsIgnored()
    for ignored_ft in ignored_filetypes
        if &filetype =~ ignored_ft
            return 1
        endif
    endfor
    return 0
endfun

However, it would be nice if there was a shorter way of doing this. Does vim have a function to do this, or do I just have to stick with the for loop?

  • 2
    There's a flaw in what you're trying to do. You're using globs, but treating them as regular expressions. As a regular expression, git* matches gi, git, gitt, etc. This is easily fixed by using git.* instead. Be careful not to use glob syntax, as is common when looking at file names and file types. – tommcdo Apr 27 '15 at 12:36
5

I did define lh#list#match_re() (based on a loop for the purpose of finding which regex from a list is matched by a text).

However, in you case, why don't you just test &ft =~ join(ignored_filetypes, '\|') ?

  • Would this be faster than @Carpetsmoker's answer? – EvergreenTree Apr 26 '15 at 23:52
  • @EvergreenTree Probably, yes. But I suspect the difference will be minimal (probably unmeasurable) in most circumstances. Go for the solution you find the most readable. – Martin Tournoij Apr 27 '15 at 0:00
  • I've no idea. carpetsmoker's trick with index+map would probably be faster than the loop (that I use on my library). However, the join() trick has good chances to be the faster one. Moreover, you can precompute the regex if the list of filetypes doesn't change. – Luc Hermitte Apr 27 '15 at 0:17
5

This should do the same:

fun! IsIgnored()
    return index(map(['gundo', 'nerdtree', 'git*'], '&filetype =~ v:val'), 1) > -1
endfun

We first map the expression &filetype =~ v:val to every entry in our array, this will return either [0, 0, 0] if there are no matches, or [0, 1, 0] if (for example) nerdtree matches.
We then use index() to check if the array that map() returns has an entry with a value of 1 (index() returns -1 on no matches).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.