Automatische Transliteration in Vim (2) — mittels Lua

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
"===============================================================================

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Log Out / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Log Out / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Log Out / Ändern )

Verbinde mit %s

Follow

Get every new post delivered to your Inbox.