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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
vim9script
if exists('g:loaded_insert_layout')
finish
endif
g:loaded_insert_layout = 1
const layout_names = {
us: 'US',
qwazerty: 'QWAZERTY2',
fr: 'French-numerical',
dvorak: 'Dvorak',
}
var normal_layout: string
def IsLayoutSwitcherAvailable(): number
return executable('xkbswitch')
enddef
def CurrentInputLayout(): string
return system('xkbswitch -ge')
enddef
def SetInputLayout(layout: string): void
system('xkbswitch -se ' .. layout)
enddef
def OnInsertEnter(layout: string): void
normal_layout = CurrentInputLayout()
SetInputLayout(layout)
enddef
def OnInsertLeave(): void
SetInputLayout(normal_layout)
enddef
def InsertLayoutOff(): void
autocmd_delete([
{
group: 'insert_layout',
event: 'InsertEnter',
bufnr: bufnr(),
},
{
group: 'insert_layout',
event: 'InsertLeave',
bufnr: bufnr(),
},
])
enddef
def InsertLayoutOn(layout: string): void
if !IsLayoutSwitcherAvailable()
echoerr "'xkbswitch' command not found"
return
endif
autocmd_add([
{
replace: true,
group: 'insert_layout',
event: 'InsertEnter',
bufnr: bufnr(),
cmd: 'OnInsertEnter("' .. layout_names[layout] .. '")',
},
{
replace: true,
group: 'insert_layout',
event: 'InsertLeave',
bufnr: bufnr(),
cmd: 'OnInsertLeave()',
},
])
enddef
def Complete(arg_lead: string, cmd_line: string, cursor_pos: number): string
return join(keys(layout_names), "\n")
enddef
command! -nargs=1 -complete=custom,Complete InsertLayout InsertLayoutOn(<q-args>)
command! InsertLayoutOff InsertLayoutOff()
|