(
doc: CodeMirror.Doc,
event: KeyboardEvent,
alsoHandle: { tab: boolean; escape: boolean }
)
| 309 | // If true, consume the event. |
| 310 | // Otherwise, keep going with other logic. |
| 311 | beforeMainKeyHandler( |
| 312 | doc: CodeMirror.Doc, |
| 313 | event: KeyboardEvent, |
| 314 | alsoHandle: { tab: boolean; escape: boolean } |
| 315 | ): { consumeEvent: boolean | undefined; forceTriggerCompletion: boolean } { |
| 316 | let forceTriggerCompletion = false; |
| 317 | if (event.ctrlKey) { |
| 318 | if (event.key === ' ') { |
| 319 | forceTriggerCompletion = true; |
| 320 | } else { |
| 321 | return { consumeEvent: false, forceTriggerCompletion }; |
| 322 | } |
| 323 | } |
| 324 | // Classic notebook may autocomplete these. |
| 325 | if ('"\')}]'.includes(event.key)) { |
| 326 | forceTriggerCompletion = true; |
| 327 | } |
| 328 | if (event.isComposing) { |
| 329 | this.clearCompletion('composing'); |
| 330 | return { consumeEvent: false, forceTriggerCompletion }; |
| 331 | } |
| 332 | switch (event.key) { |
| 333 | case 'Delete': |
| 334 | case 'ArrowDown': |
| 335 | case 'ArrowUp': |
| 336 | case 'ArrowLeft': |
| 337 | case 'ArrowRight': |
| 338 | case 'Home': |
| 339 | case 'End': |
| 340 | case 'PageDown': |
| 341 | case 'PageUp': |
| 342 | this.clearCompletion(`key: ${event.key}`); |
| 343 | return { consumeEvent: false, forceTriggerCompletion }; |
| 344 | } |
| 345 | if (!event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey) { |
| 346 | if (alsoHandle.tab && event.key === 'Tab' && this.acceptCompletion()) { |
| 347 | return { consumeEvent: true, forceTriggerCompletion }; |
| 348 | } |
| 349 | if (alsoHandle.escape && event.key === 'Escape' && this.clearCompletion('user dismissed')) { |
| 350 | return { consumeEvent: true, forceTriggerCompletion }; |
| 351 | } |
| 352 | } |
| 353 | const cursor = doc.getCursor(); |
| 354 | const characterBeforeCursor = |
| 355 | cursor.ch === 0 ? '' : doc.getRange({ line: cursor.line, ch: cursor.ch - 1 }, cursor); |
| 356 | const anyTextMarkerUpdated = this.anyTextMarkerUpdated( |
| 357 | event.key, |
| 358 | cursor, |
| 359 | characterBeforeCursor |
| 360 | ); |
| 361 | // We don't want caps lock to trigger a clearing of the completion, for example. |
| 362 | if (!anyTextMarkerUpdated && event.key.length === 1) { |
| 363 | this.clearCompletion("didn't update text marker and key is a single character"); |
| 364 | } |
| 365 | if (event.key === 'Enter') { |
| 366 | this.clearCompletion('enter'); |
| 367 | } |
| 368 | return { consumeEvent: undefined, forceTriggerCompletion }; |
no test coverage detected