Tlgrok/Automatic per-language settings based on first letter in document
Talk0this wiki
< User:Tlgrok
This is a draft, quarantined as a subpage of my own userpage until (and if) it is ready to face the world. Feel free to edit it.
This tip assumes you're using UTF8. If you aren't, you should.
If you use vim to write documents in several languages, it is not unlikely that you'd like to do certain things whenever a foreign language document is loaded. Unfortunately, there is no one way to determine a document's "language". This tip suggests determening a document's language based on the very first letter in it.
First, you will need to add to your .vimrc the Unicode code-to-script-name function.
Second, add the following function to your .vimrc:
" Gets code of first multibyte letter
" Returns -1 if no letter found
function s:GetFirstMultibyteLetterCode()
let l:save_cursor = getpos(".")
0
let l:first_line = search("\\K", 'c')
if (l:first_line!=0)
let l:temp_a = @a
normal! "ayl
let l:first_letter = char2nr(@a)
let @a = l:temp_a
else
let l:first_letter = -1
endif
call setpos('.', l:save_cursor)
return l:first_letter
endfunction
Third, add something like the following to your .vimrc (replace "Hebrew" with your script of choice):
" Automatically detect language
function s:DetectLanguage ()
let l:first_letter_code = s:GetFirstMultibyteLetterCode()
if (l:first_letter_code==-1) | return | endif
if (UnicodeCodeToScriptName(l:first_letter_code)=="Hebrew")
" do your Hebrew stuff
" ...
endif
endfunction
autocmd BufRead *.txt call s:DetectLanguage()
And that's that.
Notes
Edit
What Hebrew stuff might you be inclined to do? Well, if you edit Hebrew or Arabic documents (or any other RTL language), you might like:
setlocal rightleft
Note that another way to achieve this, without bothering with any of the above, is using modelines. You can add the following line, for instance, to any given file:
vim: set rightleft:
Comments
Edit
There's got to be a better way to implement s:GetFirstMultibyteLetterCode(). I'll look into this. tlgrok 23:39, 26 January 2009 (UTC)