aboutsummaryrefslogtreecommitdiffstats
path: root/bundle/insert-layout/autoload/insert_layout.vim
blob: 8d7263c2c882e6b5582367c2febd6a600206c008 (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
68
69
70
71
72
73
74
75
76
77
78
79
vim9script

# Friendly names for the ones used by 'xkbswitch'. The keys are used as
# arguments to the `:InsertLayout` command.
const layout_names = {
	us: 'US',
	qwazerty: 'QWAZERTY2',
	fr: 'French-numerical',
	dvorak: 'Dvorak',
}

# Used to store the current layout prior to insertion so it can be restored
# when leaving insert mode.
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

export def InsertLayoutOff(): void
	autocmd_delete([
		{
			group: 'insert_layout',
			event: 'InsertEnter',
			bufnr: bufnr(),
		},
		{
			group: 'insert_layout',
			event: 'InsertLeave',
			bufnr: bufnr(),
		},
	])
enddef

export 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

export def Complete(arg_lead: string, cmd_line: string, cursor_pos: number): string
	return join(keys(layout_names), "\n")
enddef