summaryrefslogtreecommitdiff
path: root/.config/vis/plugins/ru-langmap.lua
blob: 0a81e35b4d8314df7ba8c067499e40c29e98a90f (plain)
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
-- ru-langmap: use QWERTY motions while Russian layout is active,
-- and stop Ctrl/Alt+arrows / Shift+Enter from leaking into the buffer.
-- No upstream plugin exists for this, so this is a local one.

local M = {}

local function modes(...)
	return { ... }
end

-- terminal keys the editor has no bindings for
function M.stray_keys()
	local nop = function() end
	for _, mode in ipairs(modes(vis.modes.NORMAL, vis.modes.VISUAL, vis.modes.OPERATOR_PENDING)) do
		vis:map(mode, "<C-Left>", "b")
		vis:map(mode, "<C-Right>", "w")
		vis:map(mode, "<M-Left>", "b")
		vis:map(mode, "<M-Right>", "w")
		vis:map(mode, "<M-Up>", "<vis-nop>")
		vis:map(mode, "<M-Down>", "<vis-nop>")
		vis:map(mode, "<S-Enter>", "<Enter>")
	end
	for _, mode in ipairs(modes(vis.modes.INSERT, vis.modes.REPLACE, vis.modes.PROMPT)) do
		vis:map(mode, "<C-Left>", nop)
		vis:map(mode, "<C-Right>", nop)
		vis:map(mode, "<M-Left>", nop)
		vis:map(mode, "<M-Right>", nop)
		vis:map(mode, "<M-Up>", nop)
		vis:map(mode, "<M-Down>", nop)
		vis:map(mode, "<S-Enter>", "<Enter>")
	end
end

-- ЙЦУКЕН -> QWERTY for modal editing (insert mode stays untouched)
function M.langmap()
	local ru_en = {
		q="й", w="ц", e="у", r="к", t="е", y="н", u="г", i="ш", o="щ", p="з",
		["["]="х", ["]"]="ъ",
		a="ф", s="ы", d="в", f="а", g="п", h="р", j="о", k="л", l="д",
		[";"]="ж", ["'"]="э",
		z="я", x="ч", c="с", v="м", b="и", n="т", m="ь",
		[","]="б", ["."]="ю",
	}
	local upper_ru = {
		Й="Q", Ц="W", У="E", К="R", Е="T", Н="Y", Г="U", Ш="I", Щ="O", З="P",
		Х="[", Ъ="]",
		Ф="A", Ы="S", В="D", А="F", П="G", Р="H", О="J", Л="K", Д="L",
		Ж=";", Э="'",
		Я="Z", Ч="X", С="C", М="V", И="B", Т="N", Ь="M",
		Б=",", Ю=".",
	}
	for _, mode in ipairs(modes(vis.modes.NORMAL, vis.modes.VISUAL, vis.modes.OPERATOR_PENDING)) do
		for en, ru in pairs(ru_en) do
			vis:map(mode, ru, en)
		end
		for ru, en in pairs(upper_ru) do
			vis:map(mode, ru, en)
		end
	end
end

vis.events.subscribe(vis.events.INIT, function()
	M.stray_keys()
	M.langmap()
end)

return M