Im letzten Post wurde ein knappes Script vorgestellt, das die Funktionalität des Transliterator-Moduls für ConTeXt in Vim zugänglich macht. Dasselbe Ziel läßt sich mittlerweile dank Lua-Scripting Unterstützung auch in Lua selbst erreichen. Zwar stehen einige essentielle Internals des Editors – wie z. B. Register – (noch?) nicht direkt im Lua-Interface zur Verfügung, doch läßt sich vieles durch Aufruf von vim.command() oder vim.eval() improvisieren. (NB: Vim muß mit dem Flag --enable-luainterp kompiliert worden sein!)
" TRANSLITERATOR PLUGIN FOR LUA
"===============================================================================
lua << EOF
local fmt, iopopen, print = string.format, io.popen, print
local vimcommand, vimeval, vimline, vimwindow = vim.command, vim.eval, vim.line, vim.window
trl = trl or { }
trl.mode = "all"
trl.mode_list = {
"all", "ru_old",
"ru", "ru_transcript_de",
"ru_transcript_de_exp", "ru_transcript_en",
"ru_transcript_en_exp", "ru_cz",
"ocs_cz", "iso9_ocs",
"iso9_ocs_hack", "ocs",
"ocs_gla", "sr_tocy",
"sr_tolt", "bg_de",
"gr", "gr_n",
}
trl.mode_dict = { }
do
for modecnt, mode in next, trl.mode_list do
trl.mode_dict[mode] = modecnt
end
end
trl.transliterate = function (mode, str)
local p = iopopen(fmt([[/usr/bin/env mtxrun --script transliterate --mode=%s --s="%s" --silent 2> /dev/null]], mode, str))
local result = p:read("*a")
p:close()
if result:find("\n$") then
result = result:sub(1,#result-1)
end
return result
end
trl.do_line = function ()
local current = vimline()
local trled = trl.transliterate(trl.mode, current)
local buffer = vim.buffer()
buffer[vimwindow().line] = trled
end
trl.do_selection = function ()
vimcommand[[normal gv"ty]]
local trled = trl.transliterate(trl.mode, vimeval[[@t]])
vimcommand(fmt([[let @t = "%s"]], trled))
vimcommand[[normal gvd"tP]]
end
trl.set_mode = function (mode)
if trl.mode_dict[mode] then
trl.mode = mode
end
print(fmt([[Set transliteration mode to â~@~\%sâ~@~].]], mode))
end
trl.cycle_modes = function ()
local next_mode = trl.mode_dict[trl.mode]
next_mode = next_mode % #trl.mode_list + 1
trl.mode = trl.mode_list[next_mode]
print(fmt([[Set transliteration mode to â~@~\%sâ~@~].]], trl.mode))
end
EOF
nmap <Leader>t :lua trl.do_line()<CR>
imap <F9> :<ESC>:lua trl.do_line()<CR>a
vmap <Leader>t :lua trl.do_selection()<CR>
nmap <F10> :lua trl.cycle_modes()<CR>
imap <F10> <ESC>:lua trl.cycle_modes()<CR>a
nmap <F11> :lua trl.set_mode("all")<CR>
imap <F11> <ESC>:lua trl.set_mode("all")<CR>a
"===============================================================================
" END TRANSLITERATOR PLUGIN FOR LUA
"===============================================================================