xref: /vim-8.2.3635/src/testdir/mouse.vim (revision ceb56ddb)
1" Helper functions for generating mouse events
2
3" xterm2 and sgr always work, urxvt is optional.
4let g:Ttymouse_values = ['xterm2', 'sgr']
5if has('mouse_urxvt')
6  call add(g:Ttymouse_values, 'urxvt')
7endif
8
9" dec doesn't support all the functionality
10if has('mouse_dec')
11  let g:Ttymouse_dec = ['dec']
12else
13  let g:Ttymouse_dec = []
14endif
15
16" netterm only supports left click
17if has('mouse_netterm')
18  let g:Ttymouse_netterm = ['netterm']
19else
20  let g:Ttymouse_netterm = []
21endif
22
23" Helper function to emit a terminal escape code.
24func TerminalEscapeCode(code, row, col, m)
25  if &ttymouse ==# 'xterm2'
26    " need to use byte encoding here.
27    let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
28    if has('iconv')
29      let bytes = str->iconv('utf-8', 'latin1')
30    else
31      " Hopefully the numbers are not too big.
32      let bytes = str
33    endif
34    return "\<Esc>[M" .. bytes
35  elseif &ttymouse ==# 'sgr'
36    return printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m)
37  elseif &ttymouse ==# 'urxvt'
38    return printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row)
39  endif
40endfunc
41
42func DecEscapeCode(code, down, row, col)
43    return printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col)
44endfunc
45
46func NettermEscapeCode(row, col)
47    return printf("\<Esc>}%d,%d\r", a:row, a:col)
48endfunc
49
50func MouseLeftClickCode(row, col)
51  if &ttymouse ==# 'dec'
52    return DecEscapeCode(2, 4, a:row, a:col)
53  elseif &ttymouse ==# 'netterm'
54    return NettermEscapeCode(a:row, a:col)
55  else
56    return TerminalEscapeCode(0, a:row, a:col, 'M')
57  endif
58endfunc
59
60func MouseLeftClick(row, col)
61  call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!')
62endfunc
63
64func MouseMiddleClickCode(row, col)
65  if &ttymouse ==# 'dec'
66    return DecEscapeCode(4, 2, a:row, a:col)
67  else
68    return TerminalEscapeCode(1, a:row, a:col, 'M')
69  endif
70endfunc
71
72func MouseMiddleClick(row, col)
73  call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!')
74endfunc
75
76func MouseRightClickCode(row, col)
77  if &ttymouse ==# 'dec'
78    return DecEscapeCode(6, 1, a:row, a:col)
79  else
80    return TerminalEscapeCode(2, a:row, a:col, 'M')
81  endif
82endfunc
83
84func MouseRightClick(row, col)
85  call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!')
86endfunc
87
88func MouseCtrlLeftClickCode(row, col)
89  let ctrl = 0x10
90  return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
91endfunc
92
93func MouseCtrlLeftClick(row, col)
94  call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!')
95endfunc
96
97func MouseCtrlRightClickCode(row, col)
98  let ctrl = 0x10
99  return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
100endfunc
101
102func MouseCtrlRightClick(row, col)
103  call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!')
104endfunc
105
106func MouseLeftReleaseCode(row, col)
107  if &ttymouse ==# 'dec'
108    return DecEscapeCode(3, 0, a:row, a:col)
109  elseif &ttymouse ==# 'netterm'
110    return ''
111  else
112    return TerminalEscapeCode(3, a:row, a:col, 'm')
113  endif
114endfunc
115
116func MouseLeftRelease(row, col)
117  call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!')
118endfunc
119
120func MouseMiddleReleaseCode(row, col)
121  if &ttymouse ==# 'dec'
122    return DecEscapeCode(5, 0, a:row, a:col)
123  else
124    return TerminalEscapeCode(3, a:row, a:col, 'm')
125  endif
126endfunc
127
128func MouseMiddleRelease(row, col)
129  call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!')
130endfunc
131
132func MouseRightReleaseCode(row, col)
133  if &ttymouse ==# 'dec'
134    return DecEscapeCode(7, 0, a:row, a:col)
135  else
136    return TerminalEscapeCode(3, a:row, a:col, 'm')
137  endif
138endfunc
139
140func MouseRightRelease(row, col)
141  call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!')
142endfunc
143
144func MouseLeftDragCode(row, col)
145  if &ttymouse ==# 'dec'
146    return DecEscapeCode(1, 4, a:row, a:col)
147  else
148    return TerminalEscapeCode(0x20, a:row, a:col, 'M')
149  endif
150endfunc
151
152func MouseLeftDrag(row, col)
153  call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!')
154endfunc
155
156func MouseWheelUpCode(row, col)
157  return TerminalEscapeCode(0x40, a:row, a:col, 'M')
158endfunc
159
160func MouseWheelUp(row, col)
161  call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!')
162endfunc
163
164func MouseWheelDownCode(row, col)
165  return TerminalEscapeCode(0x41, a:row, a:col, 'M')
166endfunc
167
168func MouseWheelDown(row, col)
169  call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!')
170endfunc
171
172func MouseWheelLeftCode(row, col)
173  return TerminalEscapeCode(0x42, a:row, a:col, 'M')
174endfunc
175
176func MouseWheelLeft(row, col)
177  call feedkeys(MouseWheelLeftCode(a:row, a:col), 'Lx!')
178endfunc
179
180func MouseWheelRightCode(row, col)
181  return TerminalEscapeCode(0x43, a:row, a:col, 'M')
182endfunc
183
184func MouseWheelRight(row, col)
185  call feedkeys(MouseWheelRightCode(a:row, a:col), 'Lx!')
186endfunc
187
188" vim: shiftwidth=2 sts=2 expandtab
189