Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/prompt_toolkit/input/ansi_escape_sequences.py: 100%

12 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-04-20 06:09 +0000

1""" 

2Mappings from VT100 (ANSI) escape sequences to the corresponding prompt_toolkit 

3keys. 

4 

5We are not using the terminfo/termcap databases to detect the ANSI escape 

6sequences for the input. Instead, we recognize 99% of the most common 

7sequences. This works well, because in practice, every modern terminal is 

8mostly Xterm compatible. 

9 

10Some useful docs: 

11- Mintty: https://github.com/mintty/mintty/blob/master/wiki/Keycodes.md 

12""" 

13from __future__ import annotations 

14 

15from ..keys import Keys 

16 

17__all__ = [ 

18 "ANSI_SEQUENCES", 

19 "REVERSE_ANSI_SEQUENCES", 

20] 

21 

22# Mapping of vt100 escape codes to Keys. 

23ANSI_SEQUENCES: dict[str, Keys | tuple[Keys, ...]] = { 

24 # Control keys. 

25 "\x00": Keys.ControlAt, # Control-At (Also for Ctrl-Space) 

26 "\x01": Keys.ControlA, # Control-A (home) 

27 "\x02": Keys.ControlB, # Control-B (emacs cursor left) 

28 "\x03": Keys.ControlC, # Control-C (interrupt) 

29 "\x04": Keys.ControlD, # Control-D (exit) 

30 "\x05": Keys.ControlE, # Control-E (end) 

31 "\x06": Keys.ControlF, # Control-F (cursor forward) 

32 "\x07": Keys.ControlG, # Control-G 

33 "\x08": Keys.ControlH, # Control-H (8) (Identical to '\b') 

34 "\x09": Keys.ControlI, # Control-I (9) (Identical to '\t') 

35 "\x0a": Keys.ControlJ, # Control-J (10) (Identical to '\n') 

36 "\x0b": Keys.ControlK, # Control-K (delete until end of line; vertical tab) 

37 "\x0c": Keys.ControlL, # Control-L (clear; form feed) 

38 "\x0d": Keys.ControlM, # Control-M (13) (Identical to '\r') 

39 "\x0e": Keys.ControlN, # Control-N (14) (history forward) 

40 "\x0f": Keys.ControlO, # Control-O (15) 

41 "\x10": Keys.ControlP, # Control-P (16) (history back) 

42 "\x11": Keys.ControlQ, # Control-Q 

43 "\x12": Keys.ControlR, # Control-R (18) (reverse search) 

44 "\x13": Keys.ControlS, # Control-S (19) (forward search) 

45 "\x14": Keys.ControlT, # Control-T 

46 "\x15": Keys.ControlU, # Control-U 

47 "\x16": Keys.ControlV, # Control-V 

48 "\x17": Keys.ControlW, # Control-W 

49 "\x18": Keys.ControlX, # Control-X 

50 "\x19": Keys.ControlY, # Control-Y (25) 

51 "\x1a": Keys.ControlZ, # Control-Z 

52 "\x1b": Keys.Escape, # Also Control-[ 

53 "\x9b": Keys.ShiftEscape, 

54 "\x1c": Keys.ControlBackslash, # Both Control-\ (also Ctrl-| ) 

55 "\x1d": Keys.ControlSquareClose, # Control-] 

56 "\x1e": Keys.ControlCircumflex, # Control-^ 

57 "\x1f": Keys.ControlUnderscore, # Control-underscore (Also for Ctrl-hyphen.) 

58 # ASCII Delete (0x7f) 

59 # Vt220 (and Linux terminal) send this when pressing backspace. We map this 

60 # to ControlH, because that will make it easier to create key bindings that 

61 # work everywhere, with the trade-off that it's no longer possible to 

62 # handle backspace and control-h individually for the few terminals that 

63 # support it. (Most terminals send ControlH when backspace is pressed.) 

64 # See: http://www.ibb.net/~anne/keyboard.html 

65 "\x7f": Keys.ControlH, 

66 # -- 

67 # Various 

68 "\x1b[1~": Keys.Home, # tmux 

69 "\x1b[2~": Keys.Insert, 

70 "\x1b[3~": Keys.Delete, 

71 "\x1b[4~": Keys.End, # tmux 

72 "\x1b[5~": Keys.PageUp, 

73 "\x1b[6~": Keys.PageDown, 

74 "\x1b[7~": Keys.Home, # xrvt 

75 "\x1b[8~": Keys.End, # xrvt 

76 "\x1b[Z": Keys.BackTab, # shift + tab 

77 "\x1b\x09": Keys.BackTab, # Linux console 

78 "\x1b[~": Keys.BackTab, # Windows console 

79 # -- 

80 # Function keys. 

81 "\x1bOP": Keys.F1, 

82 "\x1bOQ": Keys.F2, 

83 "\x1bOR": Keys.F3, 

84 "\x1bOS": Keys.F4, 

85 "\x1b[[A": Keys.F1, # Linux console. 

86 "\x1b[[B": Keys.F2, # Linux console. 

87 "\x1b[[C": Keys.F3, # Linux console. 

88 "\x1b[[D": Keys.F4, # Linux console. 

89 "\x1b[[E": Keys.F5, # Linux console. 

90 "\x1b[11~": Keys.F1, # rxvt-unicode 

91 "\x1b[12~": Keys.F2, # rxvt-unicode 

92 "\x1b[13~": Keys.F3, # rxvt-unicode 

93 "\x1b[14~": Keys.F4, # rxvt-unicode 

94 "\x1b[15~": Keys.F5, 

95 "\x1b[17~": Keys.F6, 

96 "\x1b[18~": Keys.F7, 

97 "\x1b[19~": Keys.F8, 

98 "\x1b[20~": Keys.F9, 

99 "\x1b[21~": Keys.F10, 

100 "\x1b[23~": Keys.F11, 

101 "\x1b[24~": Keys.F12, 

102 "\x1b[25~": Keys.F13, 

103 "\x1b[26~": Keys.F14, 

104 "\x1b[28~": Keys.F15, 

105 "\x1b[29~": Keys.F16, 

106 "\x1b[31~": Keys.F17, 

107 "\x1b[32~": Keys.F18, 

108 "\x1b[33~": Keys.F19, 

109 "\x1b[34~": Keys.F20, 

110 # Xterm 

111 "\x1b[1;2P": Keys.F13, 

112 "\x1b[1;2Q": Keys.F14, 

113 # '\x1b[1;2R': Keys.F15, # Conflicts with CPR response. 

114 "\x1b[1;2S": Keys.F16, 

115 "\x1b[15;2~": Keys.F17, 

116 "\x1b[17;2~": Keys.F18, 

117 "\x1b[18;2~": Keys.F19, 

118 "\x1b[19;2~": Keys.F20, 

119 "\x1b[20;2~": Keys.F21, 

120 "\x1b[21;2~": Keys.F22, 

121 "\x1b[23;2~": Keys.F23, 

122 "\x1b[24;2~": Keys.F24, 

123 # -- 

124 # CSI 27 disambiguated modified "other" keys (xterm) 

125 # Ref: https://invisible-island.net/xterm/modified-keys.html 

126 # These are currently unsupported, so just re-map some common ones to the 

127 # unmodified versions 

128 "\x1b[27;2;13~": Keys.ControlM, # Shift + Enter 

129 "\x1b[27;5;13~": Keys.ControlM, # Ctrl + Enter 

130 "\x1b[27;6;13~": Keys.ControlM, # Ctrl + Shift + Enter 

131 # -- 

132 # Control + function keys. 

133 "\x1b[1;5P": Keys.ControlF1, 

134 "\x1b[1;5Q": Keys.ControlF2, 

135 # "\x1b[1;5R": Keys.ControlF3, # Conflicts with CPR response. 

136 "\x1b[1;5S": Keys.ControlF4, 

137 "\x1b[15;5~": Keys.ControlF5, 

138 "\x1b[17;5~": Keys.ControlF6, 

139 "\x1b[18;5~": Keys.ControlF7, 

140 "\x1b[19;5~": Keys.ControlF8, 

141 "\x1b[20;5~": Keys.ControlF9, 

142 "\x1b[21;5~": Keys.ControlF10, 

143 "\x1b[23;5~": Keys.ControlF11, 

144 "\x1b[24;5~": Keys.ControlF12, 

145 "\x1b[1;6P": Keys.ControlF13, 

146 "\x1b[1;6Q": Keys.ControlF14, 

147 # "\x1b[1;6R": Keys.ControlF15, # Conflicts with CPR response. 

148 "\x1b[1;6S": Keys.ControlF16, 

149 "\x1b[15;6~": Keys.ControlF17, 

150 "\x1b[17;6~": Keys.ControlF18, 

151 "\x1b[18;6~": Keys.ControlF19, 

152 "\x1b[19;6~": Keys.ControlF20, 

153 "\x1b[20;6~": Keys.ControlF21, 

154 "\x1b[21;6~": Keys.ControlF22, 

155 "\x1b[23;6~": Keys.ControlF23, 

156 "\x1b[24;6~": Keys.ControlF24, 

157 # -- 

158 # Tmux (Win32 subsystem) sends the following scroll events. 

159 "\x1b[62~": Keys.ScrollUp, 

160 "\x1b[63~": Keys.ScrollDown, 

161 "\x1b[200~": Keys.BracketedPaste, # Start of bracketed paste. 

162 # -- 

163 # Sequences generated by numpad 5. Not sure what it means. (It doesn't 

164 # appear in 'infocmp'. Just ignore. 

165 "\x1b[E": Keys.Ignore, # Xterm. 

166 "\x1b[G": Keys.Ignore, # Linux console. 

167 # -- 

168 # Meta/control/escape + pageup/pagedown/insert/delete. 

169 "\x1b[3;2~": Keys.ShiftDelete, # xterm, gnome-terminal. 

170 "\x1b[5;2~": Keys.ShiftPageUp, 

171 "\x1b[6;2~": Keys.ShiftPageDown, 

172 "\x1b[2;3~": (Keys.Escape, Keys.Insert), 

173 "\x1b[3;3~": (Keys.Escape, Keys.Delete), 

174 "\x1b[5;3~": (Keys.Escape, Keys.PageUp), 

175 "\x1b[6;3~": (Keys.Escape, Keys.PageDown), 

176 "\x1b[2;4~": (Keys.Escape, Keys.ShiftInsert), 

177 "\x1b[3;4~": (Keys.Escape, Keys.ShiftDelete), 

178 "\x1b[5;4~": (Keys.Escape, Keys.ShiftPageUp), 

179 "\x1b[6;4~": (Keys.Escape, Keys.ShiftPageDown), 

180 "\x1b[3;5~": Keys.ControlDelete, # xterm, gnome-terminal. 

181 "\x1b[5;5~": Keys.ControlPageUp, 

182 "\x1b[6;5~": Keys.ControlPageDown, 

183 "\x1b[3;6~": Keys.ControlShiftDelete, 

184 "\x1b[5;6~": Keys.ControlShiftPageUp, 

185 "\x1b[6;6~": Keys.ControlShiftPageDown, 

186 "\x1b[2;7~": (Keys.Escape, Keys.ControlInsert), 

187 "\x1b[5;7~": (Keys.Escape, Keys.ControlPageDown), 

188 "\x1b[6;7~": (Keys.Escape, Keys.ControlPageDown), 

189 "\x1b[2;8~": (Keys.Escape, Keys.ControlShiftInsert), 

190 "\x1b[5;8~": (Keys.Escape, Keys.ControlShiftPageDown), 

191 "\x1b[6;8~": (Keys.Escape, Keys.ControlShiftPageDown), 

192 # -- 

193 # Arrows. 

194 # (Normal cursor mode). 

195 "\x1b[A": Keys.Up, 

196 "\x1b[B": Keys.Down, 

197 "\x1b[C": Keys.Right, 

198 "\x1b[D": Keys.Left, 

199 "\x1b[H": Keys.Home, 

200 "\x1b[F": Keys.End, 

201 # Tmux sends following keystrokes when control+arrow is pressed, but for 

202 # Emacs ansi-term sends the same sequences for normal arrow keys. Consider 

203 # it a normal arrow press, because that's more important. 

204 # (Application cursor mode). 

205 "\x1bOA": Keys.Up, 

206 "\x1bOB": Keys.Down, 

207 "\x1bOC": Keys.Right, 

208 "\x1bOD": Keys.Left, 

209 "\x1bOF": Keys.End, 

210 "\x1bOH": Keys.Home, 

211 # Shift + arrows. 

212 "\x1b[1;2A": Keys.ShiftUp, 

213 "\x1b[1;2B": Keys.ShiftDown, 

214 "\x1b[1;2C": Keys.ShiftRight, 

215 "\x1b[1;2D": Keys.ShiftLeft, 

216 "\x1b[1;2F": Keys.ShiftEnd, 

217 "\x1b[1;2H": Keys.ShiftHome, 

218 # Meta + arrow keys. Several terminals handle this differently. 

219 # The following sequences are for xterm and gnome-terminal. 

220 # (Iterm sends ESC followed by the normal arrow_up/down/left/right 

221 # sequences, and the OSX Terminal sends ESCb and ESCf for "alt 

222 # arrow_left" and "alt arrow_right." We don't handle these 

223 # explicitly, in here, because would could not distinguish between 

224 # pressing ESC (to go to Vi navigation mode), followed by just the 

225 # 'b' or 'f' key. These combinations are handled in 

226 # the input processor.) 

227 "\x1b[1;3A": (Keys.Escape, Keys.Up), 

228 "\x1b[1;3B": (Keys.Escape, Keys.Down), 

229 "\x1b[1;3C": (Keys.Escape, Keys.Right), 

230 "\x1b[1;3D": (Keys.Escape, Keys.Left), 

231 "\x1b[1;3F": (Keys.Escape, Keys.End), 

232 "\x1b[1;3H": (Keys.Escape, Keys.Home), 

233 # Alt+shift+number. 

234 "\x1b[1;4A": (Keys.Escape, Keys.ShiftDown), 

235 "\x1b[1;4B": (Keys.Escape, Keys.ShiftUp), 

236 "\x1b[1;4C": (Keys.Escape, Keys.ShiftRight), 

237 "\x1b[1;4D": (Keys.Escape, Keys.ShiftLeft), 

238 "\x1b[1;4F": (Keys.Escape, Keys.ShiftEnd), 

239 "\x1b[1;4H": (Keys.Escape, Keys.ShiftHome), 

240 # Control + arrows. 

241 "\x1b[1;5A": Keys.ControlUp, # Cursor Mode 

242 "\x1b[1;5B": Keys.ControlDown, # Cursor Mode 

243 "\x1b[1;5C": Keys.ControlRight, # Cursor Mode 

244 "\x1b[1;5D": Keys.ControlLeft, # Cursor Mode 

245 "\x1b[1;5F": Keys.ControlEnd, 

246 "\x1b[1;5H": Keys.ControlHome, 

247 # Tmux sends following keystrokes when control+arrow is pressed, but for 

248 # Emacs ansi-term sends the same sequences for normal arrow keys. Consider 

249 # it a normal arrow press, because that's more important. 

250 "\x1b[5A": Keys.ControlUp, 

251 "\x1b[5B": Keys.ControlDown, 

252 "\x1b[5C": Keys.ControlRight, 

253 "\x1b[5D": Keys.ControlLeft, 

254 "\x1bOc": Keys.ControlRight, # rxvt 

255 "\x1bOd": Keys.ControlLeft, # rxvt 

256 # Control + shift + arrows. 

257 "\x1b[1;6A": Keys.ControlShiftDown, 

258 "\x1b[1;6B": Keys.ControlShiftUp, 

259 "\x1b[1;6C": Keys.ControlShiftRight, 

260 "\x1b[1;6D": Keys.ControlShiftLeft, 

261 "\x1b[1;6F": Keys.ControlShiftEnd, 

262 "\x1b[1;6H": Keys.ControlShiftHome, 

263 # Control + Meta + arrows. 

264 "\x1b[1;7A": (Keys.Escape, Keys.ControlDown), 

265 "\x1b[1;7B": (Keys.Escape, Keys.ControlUp), 

266 "\x1b[1;7C": (Keys.Escape, Keys.ControlRight), 

267 "\x1b[1;7D": (Keys.Escape, Keys.ControlLeft), 

268 "\x1b[1;7F": (Keys.Escape, Keys.ControlEnd), 

269 "\x1b[1;7H": (Keys.Escape, Keys.ControlHome), 

270 # Meta + Shift + arrows. 

271 "\x1b[1;8A": (Keys.Escape, Keys.ControlShiftDown), 

272 "\x1b[1;8B": (Keys.Escape, Keys.ControlShiftUp), 

273 "\x1b[1;8C": (Keys.Escape, Keys.ControlShiftRight), 

274 "\x1b[1;8D": (Keys.Escape, Keys.ControlShiftLeft), 

275 "\x1b[1;8F": (Keys.Escape, Keys.ControlShiftEnd), 

276 "\x1b[1;8H": (Keys.Escape, Keys.ControlShiftHome), 

277 # Meta + arrow on (some?) Macs when using iTerm defaults (see issue #483). 

278 "\x1b[1;9A": (Keys.Escape, Keys.Up), 

279 "\x1b[1;9B": (Keys.Escape, Keys.Down), 

280 "\x1b[1;9C": (Keys.Escape, Keys.Right), 

281 "\x1b[1;9D": (Keys.Escape, Keys.Left), 

282 # -- 

283 # Control/shift/meta + number in mintty. 

284 # (c-2 will actually send c-@ and c-6 will send c-^.) 

285 "\x1b[1;5p": Keys.Control0, 

286 "\x1b[1;5q": Keys.Control1, 

287 "\x1b[1;5r": Keys.Control2, 

288 "\x1b[1;5s": Keys.Control3, 

289 "\x1b[1;5t": Keys.Control4, 

290 "\x1b[1;5u": Keys.Control5, 

291 "\x1b[1;5v": Keys.Control6, 

292 "\x1b[1;5w": Keys.Control7, 

293 "\x1b[1;5x": Keys.Control8, 

294 "\x1b[1;5y": Keys.Control9, 

295 "\x1b[1;6p": Keys.ControlShift0, 

296 "\x1b[1;6q": Keys.ControlShift1, 

297 "\x1b[1;6r": Keys.ControlShift2, 

298 "\x1b[1;6s": Keys.ControlShift3, 

299 "\x1b[1;6t": Keys.ControlShift4, 

300 "\x1b[1;6u": Keys.ControlShift5, 

301 "\x1b[1;6v": Keys.ControlShift6, 

302 "\x1b[1;6w": Keys.ControlShift7, 

303 "\x1b[1;6x": Keys.ControlShift8, 

304 "\x1b[1;6y": Keys.ControlShift9, 

305 "\x1b[1;7p": (Keys.Escape, Keys.Control0), 

306 "\x1b[1;7q": (Keys.Escape, Keys.Control1), 

307 "\x1b[1;7r": (Keys.Escape, Keys.Control2), 

308 "\x1b[1;7s": (Keys.Escape, Keys.Control3), 

309 "\x1b[1;7t": (Keys.Escape, Keys.Control4), 

310 "\x1b[1;7u": (Keys.Escape, Keys.Control5), 

311 "\x1b[1;7v": (Keys.Escape, Keys.Control6), 

312 "\x1b[1;7w": (Keys.Escape, Keys.Control7), 

313 "\x1b[1;7x": (Keys.Escape, Keys.Control8), 

314 "\x1b[1;7y": (Keys.Escape, Keys.Control9), 

315 "\x1b[1;8p": (Keys.Escape, Keys.ControlShift0), 

316 "\x1b[1;8q": (Keys.Escape, Keys.ControlShift1), 

317 "\x1b[1;8r": (Keys.Escape, Keys.ControlShift2), 

318 "\x1b[1;8s": (Keys.Escape, Keys.ControlShift3), 

319 "\x1b[1;8t": (Keys.Escape, Keys.ControlShift4), 

320 "\x1b[1;8u": (Keys.Escape, Keys.ControlShift5), 

321 "\x1b[1;8v": (Keys.Escape, Keys.ControlShift6), 

322 "\x1b[1;8w": (Keys.Escape, Keys.ControlShift7), 

323 "\x1b[1;8x": (Keys.Escape, Keys.ControlShift8), 

324 "\x1b[1;8y": (Keys.Escape, Keys.ControlShift9), 

325} 

326 

327 

328def _get_reverse_ansi_sequences() -> dict[Keys, str]: 

329 """ 

330 Create a dictionary that maps prompt_toolkit keys back to the VT100 escape 

331 sequences. 

332 """ 

333 result: dict[Keys, str] = {} 

334 

335 for sequence, key in ANSI_SEQUENCES.items(): 

336 if not isinstance(key, tuple): 

337 if key not in result: 

338 result[key] = sequence 

339 

340 return result 

341 

342 

343REVERSE_ANSI_SEQUENCES = _get_reverse_ansi_sequences()