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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
" Helper functions for generating mouse events
" xterm2 and sgr always work, urxvt is optional.
let g:Ttymouse_values = ['xterm2', 'sgr']
if has('mouse_urxvt')
call add(g:Ttymouse_values, 'urxvt')
endif
" dec doesn't support all the functionality
if has('mouse_dec')
let g:Ttymouse_dec = ['dec']
else
let g:Ttymouse_dec = []
endif
" netterm only supports left click
if has('mouse_netterm')
let g:Ttymouse_netterm = ['netterm']
else
let g:Ttymouse_netterm = []
endif
" Helper function to emit a terminal escape code.
func TerminalEscapeCode(code, row, col, m)
if &ttymouse ==# 'xterm2'
" need to use byte encoding here.
let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
if has('iconv')
let bytes = str->iconv('utf-8', 'latin1')
else
" Hopefully the numbers are not too big.
let bytes = str
endif
return "\<Esc>[M" .. bytes
elseif &ttymouse ==# 'sgr'
return printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m)
elseif &ttymouse ==# 'urxvt'
return printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row)
endif
endfunc
func DecEscapeCode(code, down, row, col)
return printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col)
endfunc
func NettermEscapeCode(row, col)
return printf("\<Esc>}%d,%d\r", a:row, a:col)
endfunc
func MouseLeftClickCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(2, 4, a:row, a:col)
elseif &ttymouse ==# 'netterm'
return NettermEscapeCode(a:row, a:col)
else
return TerminalEscapeCode(0, a:row, a:col, 'M')
endif
endfunc
func MouseLeftClick(row, col)
call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseMiddleClickCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(4, 2, a:row, a:col)
else
return TerminalEscapeCode(1, a:row, a:col, 'M')
endif
endfunc
func MouseMiddleClick(row, col)
call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseRightClickCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(6, 1, a:row, a:col)
else
return TerminalEscapeCode(2, a:row, a:col, 'M')
endif
endfunc
func MouseRightClick(row, col)
call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseCtrlLeftClickCode(row, col)
let ctrl = 0x10
return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
endfunc
func MouseCtrlLeftClick(row, col)
call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseCtrlRightClickCode(row, col)
let ctrl = 0x10
return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
endfunc
func MouseCtrlRightClick(row, col)
call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseAltLeftClickCode(row, col)
let alt = 0x8
return TerminalEscapeCode(0 + alt, a:row, a:col, 'M')
endfunc
func MouseAltLeftClick(row, col)
call feedkeys(MouseAltLeftClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseAltRightClickCode(row, col)
let alt = 0x8
return TerminalEscapeCode(2 + alt, a:row, a:col, 'M')
endfunc
func MouseAltRightClick(row, col)
call feedkeys(MouseAltRightClickCode(a:row, a:col), 'Lx!')
endfunc
func MouseLeftReleaseCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(3, 0, a:row, a:col)
elseif &ttymouse ==# 'netterm'
return ''
else
return TerminalEscapeCode(3, a:row, a:col, 'm')
endif
endfunc
func MouseLeftRelease(row, col)
call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!')
endfunc
func MouseMiddleReleaseCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(5, 0, a:row, a:col)
else
return TerminalEscapeCode(3, a:row, a:col, 'm')
endif
endfunc
func MouseMiddleRelease(row, col)
call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!')
endfunc
func MouseRightReleaseCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(7, 0, a:row, a:col)
else
return TerminalEscapeCode(3, a:row, a:col, 'm')
endif
endfunc
func MouseRightRelease(row, col)
call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!')
endfunc
func MouseLeftDragCode(row, col)
if &ttymouse ==# 'dec'
return DecEscapeCode(1, 4, a:row, a:col)
else
return TerminalEscapeCode(0x20, a:row, a:col, 'M')
endif
endfunc
func MouseLeftDrag(row, col)
call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!')
endfunc
func MouseWheelUpCode(row, col)
return TerminalEscapeCode(0x40, a:row, a:col, 'M')
endfunc
func MouseWheelUp(row, col)
call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!')
endfunc
func MouseWheelDownCode(row, col)
return TerminalEscapeCode(0x41, a:row, a:col, 'M')
endfunc
func MouseWheelDown(row, col)
call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!')
endfunc
func MouseWheelLeftCode(row, col)
return TerminalEscapeCode(0x42, a:row, a:col, 'M')
endfunc
func MouseWheelLeft(row, col)
call feedkeys(MouseWheelLeftCode(a:row, a:col), 'Lx!')
endfunc
func MouseWheelRightCode(row, col)
return TerminalEscapeCode(0x43, a:row, a:col, 'M')
endfunc
func MouseWheelRight(row, col)
call feedkeys(MouseWheelRightCode(a:row, a:col), 'Lx!')
endfunc
" vim: shiftwidth=2 sts=2 expandtab
|