You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

287 lines
8.5 KiB

// add custom shortcuts
define([
'base/js/namespace',
'jquery'
], function(Jupyter, $) {
"use strict";
// define default values for config parameters
var params = {
toggle_enable_edit_shortcuts : true,
toggle_enable_command_shortcuts : true,
toggle_enable_esc_shortcut : true,
toggle_enable_enter_shortcuts : true,
};
// updates default params with any specified in the server's config
var update_params = function() {
var config = Jupyter.notebook.config;
for (var key in params){
if (config.data.hasOwnProperty(key) ){
params[key] = config.data[key];
}
}
};
var add_command_shortcuts = {
'home' : {
help : 'Go to top',
help_index : 'ga',
handler : function() {
Jupyter.notebook.select(0);
Jupyter.notebook.scroll_to_top();
return false;
}
},
'end' : {
help : 'Go to bottom',
help_index : 'ga',
handler : function() {
var ncells = Jupyter.notebook.ncells();
Jupyter.notebook.select(ncells-1);
Jupyter.notebook.scroll_to_bottom();
return false;
}
},
'pageup' : {
help : 'Move cells page up',
help_index : 'gu',
handler : function() {
var wh = 0.6 * $(window).height();
var cell = Jupyter.notebook.get_selected_cell();
var h = 0;
/* loop until we have enough cells to span the size of the notebook window (= one page) */
do {
h += cell.element.height();
Jupyter.notebook.select_prev();
cell = Jupyter.notebook.get_selected_cell();
} while ( h < wh );
var cp = cell.element.position();
var sp = $('body').scrollTop();
if ( cp.top < sp) {
Jupyter.notebook.scroll_to_cell(Jupyter.notebook.get_selected_index(), 0);
}
cell.focus_cell();
return false;
}
},
'pagedown' : {
help : 'Move cells page down',
help_index : 'gd',
handler : function() {
/* jump to bottom if we are already in the last cell */
var ncells = Jupyter.notebook.ncells();
if ( Jupyter.notebook.get_selected_index()+1 == ncells) {
Jupyter.notebook.scroll_to_bottom();
return false;
}
var wh = 0.6*$(window).height();
var cell = Jupyter.notebook.get_selected_cell();
var h = 0;
/* loop until we have enough cells to span the size of the notebook window (= one page) */
do {
h += cell.element.height();
Jupyter.notebook.select_next();
cell = Jupyter.notebook.get_selected_cell();
} while ( h < wh );
cell.focus_cell();
return false;
}
}
};
var add_edit_shortcuts = {
'alt-subtract' : {
help : 'Merge cell with previous cell',
help_index : 'eb',
handler : function() {
var i = Jupyter.notebook.get_selected_index();
if (i > 0) {
var l = Jupyter.notebook.get_cell(i-1).code_mirror.lineCount();
Jupyter.notebook.merge_cell_above();
Jupyter.notebook.get_selected_cell().code_mirror.setCursor(l,0);
}
}
},
'alt-n' : {
help : 'Toggle line numbers',
help_index : 'xy',
handler : function() {
var cell = Jupyter.notebook.get_selected_cell();
cell.toggle_line_numbers();
return false;
}
},
'pagedown' : {
help : 'Page down',
help_index : 'xy',
handler : function() {
var ic = Jupyter.notebook.get_selected_index();
var cells = Jupyter.notebook.get_cells();
var i, h=0;
for (i=0; i < ic; i ++) {
h += cells[i].element.height();
}
var cur = cells[ic].code_mirror.getCursor();
h += cells[ic].code_mirror.defaultTextHeight() * cur.line;
Jupyter.notebook.element.animate({scrollTop:h}, 0);
return false;
}
},
'pageup' : {
help : 'Page up',
help_index : 'xy',
handler : function() {
var ic = Jupyter.notebook.get_selected_index();
var cells = Jupyter.notebook.get_cells();
var i, h=0;
for (i=0; i < ic; i ++) {
h += cells[i].element.height();
}
var cur =cells[ic].code_mirror.getCursor();
h += cells[ic].code_mirror.defaultTextHeight() * cur.line;
Jupyter.notebook.element.animate({scrollTop:h}, 0);
return false;
}
},
'ctrl-y' : {
help : 'Toggle markdown/code',
handler : function() {
var cell = Jupyter.notebook.get_selected_cell();
var cur = cell.code_mirror.getCursor();
if (cell.cell_type == 'code') {
Jupyter.notebook.command_mode();
Jupyter.notebook.to_markdown();
Jupyter.notebook.edit_mode();
cell = Jupyter.notebook.get_selected_cell();
cell.code_mirror.setCursor(cur);
} else if (cell.cell_type == 'markdown') {
Jupyter.notebook.command_mode();
Jupyter.notebook.to_code();
Jupyter.notebook.edit_mode();
cell = Jupyter.notebook.get_selected_cell();
cell.code_mirror.setCursor(cur);
}
return false;
}
}
};
var add_edit_enter_shortcuts = {
'shift-enter' : {
help : 'Run cell and select next in edit mode',
help_index : 'bb',
handler : function() {
Jupyter.notebook.execute_cell_and_select_below();
var rendered = Jupyter.notebook.get_selected_cell().rendered;
var ccell = Jupyter.notebook.get_selected_cell().cell_type;
if (rendered === false || ccell === 'code') Jupyter.notebook.edit_mode();
return false;
}
},
'ctrl-enter' : {
help : 'Run selected cell stay in edit mode',
help_index : 'bb',
handler : function() {
var cell = Jupyter.notebook.get_selected_cell();
var mode = cell.mode;
cell.execute();
if (mode === "edit") Jupyter.notebook.edit_mode();
return false;
}
}
};
var initialize = function() {
// Update default parameters
update_params();
var action;
var prefix = 'navigation_hotkeys';
var action_name;
var action_name_spaces;
var action_full_name;
var all_commands_combined = [add_command_shortcuts, add_edit_enter_shortcuts, add_edit_shortcuts];
// register all commands if one of the keybindings is not loaded so commands still available
for (let i = 0; i < all_commands_combined.length; i++){
for (var key in all_commands_combined[i]){
// check if the property/key is defined in the object itself, not in parent
if (all_commands_combined[i].hasOwnProperty(key)) {
action = all_commands_combined[i][key];
action_name_spaces = all_commands_combined[i][key]['help'];
action_name = action_name_spaces.replace(/ /g,"-").toLowerCase();
action_full_name = Jupyter.keyboard_manager.actions.register(action, action_name, prefix);
};
};
};
if (params.toggle_enable_command_shortcuts) {
for (var key in add_command_shortcuts) {
// check if the property/key is defined in the object itself, not in parent
if (add_command_shortcuts.hasOwnProperty(key)) {
action = add_command_shortcuts[key];
action_name_spaces = add_command_shortcuts[key]['help'];
action_name = action_name_spaces.replace(/ /g,"-").toLowerCase();
action_full_name = prefix + ":" + action_name;
Jupyter.keyboard_manager.command_shortcuts.add_shortcut(
key, action_full_name);
}
};
if (params.toggle_enable_esc_shortcut) {
Jupyter.keyboard_manager.command_shortcuts.add_shortcut(
'Esc','jupyter-notebook:enter-edit-mode');
}
};
if (params.toggle_enable_edit_shortcuts) {
for (var key in add_edit_shortcuts) {
// check if the property/key is defined in the object itself, not in parent
if (add_edit_shortcuts.hasOwnProperty(key)) {
action = add_edit_shortcuts[key];
action_name_spaces = add_edit_shortcuts[key]['help'];
action_name = action_name_spaces.replace(/ /g,"-").toLowerCase();
action_full_name = prefix + ":" + action_name;
Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(key, action_full_name);
}
};
if (params.toggle_enable_enter_shortcuts) {
for (var key in add_edit_enter_shortcuts) {
// check if the property/key is defined in the object itself, not in parent
if (add_edit_enter_shortcuts.hasOwnProperty(key)) {
action = add_edit_enter_shortcuts[key];
action_name_spaces = add_edit_enter_shortcuts[key]['help'];
action_name = action_name_spaces.replace(/ /g,"-").toLowerCase();
action_full_name = prefix + ":" + action_name;
Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(
key, action_full_name);
}
};
};
Jupyter.keyboard_manager.edit_shortcuts.add_shortcut(
'alt-add','jupyter-notebook:split-cell-at-cursor');
};
};
var load_ipython_extension = function() {
return Jupyter.notebook.config.loaded.then(initialize);
};
var extension = {
load_ipython_extension : load_ipython_extension
};
return extension;
});