1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class VimL < RegexLexer
title "VimL"
desc "VimL, the scripting language for the Vim editor (vim.org)"
tag 'viml'
aliases 'vim', 'vimscript', 'ex'
filenames '*.vim', '*.vba', '.vimrc', '.exrc', '.gvimrc',
'_vimrc', '_exrc', '_gvimrc' # _ names for windows
mimetypes 'text/x-vim'
def self.keywords
Kernel::load File.join(Lexers::BASE_DIR, 'viml/keywords.rb')
self.keywords
end
state :root do
rule %r/^(\s*)(".*?)$/ do
groups Text, Comment
end
rule %r/^\s*\\/, Str::Escape
rule %r/[ \t]+/, Text
# TODO: regexes can have other delimiters
rule %r(/(\\\\|\\/|[^\n/])*/), Str::Regex
rule %r("(\\\\|\\"|[^\n"])*"), Str::Double
rule %r('(\\\\|\\'|[^\n'])*'), Str::Single
# if it's not a string, it's a comment.
rule %r/(?<=\s)"[^-:.%#=*].*?$/, Comment
rule %r/-?\d+/, Num
rule %r/#[0-9a-f]{6}/i, Num::Hex
rule %r/^:/, Punctuation
rule %r/[():<>+=!\[\]{}\|,~.-]/, Punctuation
rule %r/\b(let|if|else|endif|elseif|fun|function|endfunction)\b/,
Keyword
rule %r/\b(NONE|bold|italic|underline|dark|light)\b/, Name::Builtin
rule %r/[absg]:\w+\b/, Name::Variable
rule %r/\b\w+\b/ do |m|
name = m[0]
keywords = self.class.keywords
if keywords[:command].include? name
token Keyword
elsif keywords[:function].include? name
token Name::Builtin
elsif keywords[:option].include? name
token Name::Builtin
elsif keywords[:auto].include? name
token Name::Builtin
else
token Text
end
end
# no errors in VimL!
rule %r/./m, Text
end
end
end
end
|