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 172" vim: shiftwidth=2 sts=2 expandtab 173