123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- import {
- JupyterLab, JupyterLabPlugin
- } from '@jupyterlab/application';
- /**
- * 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: 'main-jupyterlab:activate-next-tab',
- selector: 'body',
- keys: ['Ctrl Shift ]']
- },
- {
- command: 'main-jupyterlab:activate-previous-tab',
- selector: 'body',
- keys: ['Ctrl Shift [']
- },
- {
- command: 'main-jupyterlab:toggle-mode',
- selector: 'body',
- keys: ['Accel Shift Enter']
- },
- {
- command: 'chatbox:post',
- selector: '.jp-Chatbox-prompt',
- keys: ['Enter']
- },
- {
- command: 'chatbox:linebreak',
- selector: '.jp-Chatbox-prompt',
- keys: ['Ctrl Enter']
- },
- {
- command: 'command-palette:activate',
- selector: 'body',
- keys: ['Accel Shift C']
- },
- {
- command: 'completer:invoke-console',
- selector: '.jp-CodeConsole-promptCell .jp-mod-completer-enabled',
- keys: ['Tab']
- },
- {
- command: 'completer:invoke-notebook',
- selector: '.jp-Notebook.jp-mod-editMode .jp-mod-completer-enabled',
- keys: ['Tab']
- },
- {
- command: 'console:linebreak',
- selector: '.jp-CodeConsole-promptCell',
- keys: ['Ctrl Enter']
- },
- {
- command: 'console:run',
- selector: '.jp-CodeConsole-promptCell',
- keys: ['Enter']
- },
- {
- command: 'editor:run-code',
- selector: '.jp-FileEditor',
- keys: ['Shift Enter']
- },
- {
- command: 'console:run-forced',
- selector: '.jp-CodeConsole-promptCell',
- keys: ['Shift Enter']
- },
- {
- command: 'filebrowser-main:toggle',
- selector: 'body',
- keys: ['Accel Shift F']
- },
- {
- command: 'file-operations:create-launcher',
- selector: 'body',
- keys: ['Accel Shift L']
- },
- {
- command: 'file-operations:save',
- selector: 'body',
- keys: ['Accel S']
- },
- {
- command: 'file-operations:close',
- selector: '.jp-Activity',
- keys: ['Ctrl Q']
- },
- {
- command: 'help-jupyterlab:toggle',
- selector: 'body',
- keys: ['Ctrl Shift H']
- },
- {
- command: 'imageviewer:reset-zoom',
- selector: '.jp-ImageViewer',
- keys: ['0']
- },
- {
- command: 'imageviewer:zoom-in',
- selector: '.jp-ImageViewer',
- keys: ['=']
- },
- {
- command: 'imageviewer:zoom-out',
- selector: '.jp-ImageViewer',
- keys: ['-']
- },
- {
- command: 'inspector:open',
- selector: 'body',
- keys: ['Accel I']
- },
- {
- command: 'notebook-cells:run-and-advance',
- selector: '.jp-Notebook:focus',
- keys: ['Shift Enter']
- },
- {
- command: 'notebook-cells:run-and-insert',
- selector: '.jp-Notebook:focus',
- keys: ['Alt Enter']
- },
- {
- command: 'notebook-cells:run',
- selector: '.jp-Notebook:focus',
- keys: ['Ctrl Enter']
- },
- {
- command: 'notebook-cells:run-and-advance',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Shift Enter']
- },
- {
- command: 'notebook-cells:run-and-insert',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Alt Enter']
- },
- {
- command: 'notebook-cells:run',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Ctrl Enter']
- },
- {
- command: 'notebook:interrupt-kernel',
- selector: '.jp-Notebook:focus',
- keys: ['I', 'I']
- },
- {
- command: 'notebook:restart-kernel',
- selector: '.jp-Notebook:focus',
- keys: ['0', '0']
- },
- {
- command: 'notebook-cells:to-code',
- selector: '.jp-Notebook:focus',
- keys: ['Y']
- },
- {
- command: 'notebook-cells:to-markdown',
- selector: '.jp-Notebook:focus',
- keys: ['M']
- },
- {
- command: 'notebook-cells:to-raw',
- selector: '.jp-Notebook:focus',
- keys: ['R']
- },
- {
- command: 'notebook-cells:delete',
- selector: '.jp-Notebook:focus',
- keys: ['D', 'D'],
- },
- {
- command: 'notebook-cells:split',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Ctrl Shift -'],
- },
- {
- command: 'notebook-cells:merge',
- selector: '.jp-Notebook:focus',
- keys: ['Shift M'],
- },
- {
- command: 'notebook-cells:select-above',
- selector: '.jp-Notebook:focus',
- keys: ['ArrowUp'],
- },
- {
- command: 'notebook-cells:select-above',
- selector: '.jp-Notebook:focus',
- keys: ['K'],
- },
- {
- command: 'notebook-cells:select-below',
- selector: '.jp-Notebook:focus',
- keys: ['ArrowDown'],
- },
- {
- command: 'notebook-cells:select-below',
- selector: '.jp-Notebook:focus',
- keys: ['J'],
- },
- {
- command: 'notebook-cells:extend-above',
- selector: '.jp-Notebook:focus',
- keys: ['Shift ArrowUp'],
- },
- {
- command: 'notebook-cells:extend-above',
- selector: '.jp-Notebook:focus',
- keys: ['Shift K'],
- },
- {
- command: 'notebook-cells:extend-below',
- selector: '.jp-Notebook:focus',
- keys: ['Shift ArrowDown'],
- },
- {
- command: 'notebook-cells:extend-below',
- selector: '.jp-Notebook:focus',
- keys: ['Shift J'],
- },
- {
- command: 'notebook-cells:undo',
- selector: '.jp-Notebook:focus',
- keys: ['Z'],
- },
- {
- command: 'notebook-cells:redo',
- selector: '.jp-Notebook:focus',
- keys: ['Shift Z'],
- },
- {
- command: 'notebook-cells:cut',
- selector: '.jp-Notebook:focus',
- keys: ['X']
- },
- {
- command: 'notebook-cells:copy',
- selector: '.jp-Notebook:focus',
- keys: ['C']
- },
- {
- command: 'notebook-cells:paste',
- selector: '.jp-Notebook:focus',
- keys: ['V']
- },
- {
- command: 'notebook-cells:insert-above',
- selector: '.jp-Notebook:focus',
- keys: ['A']
- },
- {
- command: 'notebook-cells:insert-below',
- selector: '.jp-Notebook:focus',
- keys: ['B']
- },
- {
- command: 'notebook-cells:toggle-line-numbers',
- selector: '.jp-Notebook:focus',
- keys: ['L']
- },
- {
- command: 'notebook-cells:toggle-all-line-numbers',
- selector: '.jp-Notebook:focus',
- keys: ['Shift L']
- },
- {
- command: 'notebook-cells:markdown-header1',
- selector: '.jp-Notebook:focus',
- keys: ['1']
- },
- {
- command: 'notebook-cells:markdown-header2',
- selector: '.jp-Notebook:focus',
- keys: ['2']
- },
- {
- command: 'notebook-cells:markdown-header3',
- selector: '.jp-Notebook:focus',
- keys: ['3']
- },
- {
- command: 'notebook-cells:markdown-header4',
- selector: '.jp-Notebook:focus',
- keys: ['4']
- },
- {
- command: 'notebook-cells:markdown-header5',
- selector: '.jp-Notebook:focus',
- keys: ['5']
- },
- {
- command: 'notebook-cells:markdown-header6',
- selector: '.jp-Notebook:focus',
- keys: ['6']
- },
- {
- command: 'notebook:edit-mode',
- selector: '.jp-Notebook:focus',
- keys: ['Enter']
- },
- {
- command: 'notebook:command-mode',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Escape']
- },
- {
- command: 'notebook:command-mode',
- selector: '.jp-Notebook.jp-mod-editMode',
- keys: ['Ctrl M']
- },
- {
- command: 'setting-editor:open',
- selector: 'body',
- keys: ['Accel ,']
- },
- {
- command: 'tooltip:launch-notebook',
- selector: '.jp-Notebook.jp-mod-editMode .jp-InputArea-editor:not(.jp-mod-has-primary-selection)',
- keys: ['Shift Tab']
- },
- {
- command: 'tooltip:launch-console',
- selector: '.jp-CodeConsole-promptCell .jp-InputArea-editor:not(.jp-mod-has-primary-selection)',
- keys: ['Shift Tab']
- }
- ];
- /**
- * The default shortcuts extension.
- */
- const plugin: JupyterLabPlugin<void> = {
- id: 'jupyter.extensions.shortcuts',
- activate: (app: JupyterLab): void => {
- SHORTCUTS.forEach(shortcut => { app.commands.addKeyBinding(shortcut); });
- },
- autoStart: true
- };
- /**
- * Export the plugin as default.
- */
- export default plugin;
|