" The line count limit for looking for the pattern; no sense churning through " the whole document every time it's changed. " let s:lines = get(g:, 'html_spelllang_lines', 128) " Crude regular expression to match an , , or
tag on one " line with a lang= attribute set. This isn't exact, by any means, but " I don't want to write an actual HTML parser for a mere 'spelllang' hook " nicety that fails silently anyway. " " The first submatch is the language code, e.g. "en", "es". The second " submatch is optional and follows a hyphen and is for the regional code, " e.g. "US", "GB", "AR". " let s:pattern = get(g:, 'html_spelllang_pattern', \ '\m\c<\%(html\|body\|main\)\>[^>]*\ tag, or skip it let matches = matchlist(line, s:pattern) if empty(matches) continue endif " The line seems to match our pattern, and so we have a language code in " matches[1], and possibly a region code in matches[2]. " " Next we need to check whether we'll attempt to use this to set " a spelling language. Build the expected path for a spellfile; looks " like `$VIMRUNTIME/spell/en.utf-8.spl`. Note that this path doesn't " include any language region, per documentation. " let spellfile = 'spell/' . join([ \ tolower(matches[1]), \ &encoding, \ 'spl', \], '.') " If a spelling list file of the expected name exists in &runtimepath, try " setting the local value of 'spelllang' to reflect what was in the lang= " attribute; force it to lowercase and separate the region with an " underscore rather than a hyphen (if there is a region). " if strlen(globpath(&runtimepath, spellfile)) let &l:spelllang = tolower(join(matches[1:2], '_')) endif endfor endfunction