123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- import {
- JupyterLab, JupyterLabPlugin
- } from '../application';
- import {
- CommandIDs as CommandPaletteCommandIDs
- } from '../commandpalette';
- import {
- CommandIDs as ConsoleCommandIDs
- } from '../console';
- import {
- CommandIDs as EditorWidgetCommandIDs
- } from '../editorwidget';
- import {
- CommandIDs as FileBrowserCommandIDs
- } from '../filebrowser';
- import {
- CommandIDs as HelpCommandIDs
- } from '../help';
- import {
- CommandIDs as ImageWidgetCommandIDs
- } from '../imagewidget';
- import {
- CommandIDs as InspectorCommandIDs
- } from '../inspector';
- import {
- CommandIDs as NotebookCommandIDs
- } from '../notebook';
- import {
- CommandIDs as TooltipCommandIDs
- } from '../tooltip';
- /**
- * The list of default application shortcuts.
- *
- * #### Notes
- * When setting shortcut selectors, there are two concepts to consider:
- * specificity and matchability. These two interact in sometimes
- * counterintuitive ways. Keyboard events are triggered from an element and
- * they propagate up the DOM until they reach the `documentElement` (`<body>`).
- *
- * When a registered shortcut sequence is fired, the shortcut manager checks
- * the node that fired the event and each of its ancestors until a node matches
- * one or more registered selectors. The *first* matching selector in the
- * chain of ancestors will invoke the shortcut handler and the traversal will
- * end at that point. If a node matches more than one selector, the handler for
- * whichever selector is more *specific* fires.
- * @see https://www.w3.org/TR/css3-selectors/#specificity
- *
- * The practical consequence of this is that a very broadly matching selector,
- * e.g. `'*'` or `'div'` may match and therefore invoke a handler *before* a
- * more specific selector. The most common pitfall is to use the universal
- * (`'*'`) selector. For almost any use case where a global keyboard shortcut is
- * required, using the `'body'` selector is more appropriate.
- */
- const SHORTCUTS = [
- {
- command: CommandPaletteCommandIDs.activate,
- selector: 'body',
- keys: ['Accel Shift P']
- },
- {
- command: ConsoleCommandIDs.run,
- selector: '.jp-CodeConsole-prompt',
- keys: ['Enter']
- },
- {
- command: ConsoleCommandIDs.runForced,
- selector: '.jp-CodeConsole-prompt',
- keys: ['Shift Enter']
- },
- {
- command: ConsoleCommandIDs.linebreak,
- selector: '.jp-CodeConsole-prompt',
- keys: ['Ctrl Enter']
- },
- {
- command: EditorWidgetCommandIDs.runCode,
- selector: '.jp-EditorWidget',
- keys: ['Shift Enter']
- },
- {
- command: FileBrowserCommandIDs.toggleBrowser,
- selector: 'body',
- keys: ['Accel Shift F']
- },
- {
- command: FileBrowserCommandIDs.newTextFile,
- selector: 'body',
- keys: ['Ctrl O']
- },
- {
- command: FileBrowserCommandIDs.newNotebook,
- selector: 'body',
- keys: ['Ctrl Shift N']
- },
- {
- command: FileBrowserCommandIDs.save,
- selector: '.jp-Document',
- keys: ['Accel S']
- },
- {
- command: FileBrowserCommandIDs.close,
- selector: '.jp-Document',
- keys: ['Ctrl Q']
- },
- {
- command: FileBrowserCommandIDs.closeAllFiles,
- selector: '.jp-Document',
- keys: ['Ctrl Shift Q']
- },
- {
- command: HelpCommandIDs.toggle,
- selector: 'body',
- keys: ['Accel Shift H']
- },
- {
- command: ImageWidgetCommandIDs.zoomIn,
- selector: '.jp-ImageWidget',
- keys: ['=']
- },
- {
- command: ImageWidgetCommandIDs.zoomOut,
- selector: '.jp-ImageWidget',
- keys: ['-']
- },
- {
- command: ImageWidgetCommandIDs.resetZoom,
- selector: '.jp-ImageWidget',
- keys: ['0']
- },
- {
- command: InspectorCommandIDs.open,
- selector: '.jp-CodeConsole-prompt',
- keys: ['Accel I']
- },
- {
- command: NotebookCommandIDs.runAndAdvance,
- selector: '.jp-Notebook',
- keys: ['Shift Enter']
- },
- {
- command: NotebookCommandIDs.runAndInsert,
- selector: '.jp-Notebook',
- keys: ['Alt Enter']
- },
- {
- command: NotebookCommandIDs.run,
- selector: '.jp-Notebook',
- keys: ['Ctrl Enter']
- },
- {
- command: NotebookCommandIDs.interrupt,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['I', 'I']
- },
- {
- command: NotebookCommandIDs.restart,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['0', '0']
- },
- {
- command: NotebookCommandIDs.toCode,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Y']
- },
- {
- command: NotebookCommandIDs.toMarkdown,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['M']
- },
- {
- command: NotebookCommandIDs.toRaw,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['R']
- },
- {
- command: NotebookCommandIDs.deleteCell,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['D', 'D'],
- },
- {
- command: NotebookCommandIDs.split,
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Ctrl Shift -'],
- },
- {
- command: NotebookCommandIDs.merge,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift M'],
- },
- {
- command: NotebookCommandIDs.selectAbove,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['ArrowUp'],
- },
- {
- command: NotebookCommandIDs.selectAbove,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['K'],
- },
- {
- command: NotebookCommandIDs.selectBelow,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['ArrowDown'],
- },
- {
- command: NotebookCommandIDs.selectBelow,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['J'],
- },
- {
- command: NotebookCommandIDs.extendAbove,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift ArrowUp'],
- },
- {
- command: NotebookCommandIDs.extendAbove,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift K'],
- },
- {
- command: NotebookCommandIDs.extendBelow,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift ArrowDown'],
- },
- {
- command: NotebookCommandIDs.extendBelow,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift J'],
- },
- {
- command: NotebookCommandIDs.undo,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Z'],
- },
- {
- command: NotebookCommandIDs.redo,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Shift Z'],
- },
- {
- command: NotebookCommandIDs.cut,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['X']
- },
- {
- command: NotebookCommandIDs.copy,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['C']
- },
- {
- command: NotebookCommandIDs.paste,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['V']
- },
- {
- command: NotebookCommandIDs.insertAbove,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['A']
- },
- {
- command: NotebookCommandIDs.insertBelow,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['B']
- },
- {
- command: NotebookCommandIDs.toggleLines,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['L']
- },
- {
- command: NotebookCommandIDs.markdown1,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['1']
- },
- {
- command: NotebookCommandIDs.markdown2,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['2']
- },
- {
- command: NotebookCommandIDs.markdown3,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['3']
- },
- {
- command: NotebookCommandIDs.markdown4,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['4']
- },
- {
- command: NotebookCommandIDs.markdown5,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['5']
- },
- {
- command: NotebookCommandIDs.markdown6,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['6']
- },
- {
- command: NotebookCommandIDs.editMode,
- selector: '.jp-Notebook.jp-mod-commandMode',
- keys: ['Enter']
- },
- {
- command: NotebookCommandIDs.commandMode,
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Escape']
- },
- {
- command: NotebookCommandIDs.commandMode,
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Ctrl M']
- },
- {
- command: TooltipCommandIDs.launch,
- selector: '.jp-Notebook',
- keys: ['Shift Tab'],
- args: { notebook: true }
- },
- {
- command: TooltipCommandIDs.launch,
- selector: '.jp-ConsolePanel',
- keys: ['Shift Tab'],
- args: { notebook: false }
- },
- {
- command: TooltipCommandIDs.remove,
- selector: '.jp-Notebook.jp-Tooltip-anchor',
- keys: ['Escape']
- },
- {
- command: TooltipCommandIDs.remove,
- selector: '.jp-CodeConsole.jp-Tooltip-anchor',
- keys: ['Escape']
- }
- ];
- /**
- * The default shortcuts extension.
- */
- const plugin: JupyterLabPlugin<void> = {
- id: 'jupyter.extensions.shortcuts',
- activate: (app: JupyterLab): void => {
- SHORTCUTS.forEach(shortcut => { app.keymap.addBinding(shortcut); });
- },
- autoStart: true
- };
- /**
- * Export the plugin as default.
- */
- export default plugin;
|