2015-03-24 16 views
10

Nell'ambiente Notebook IPython, è possibile definire scorciatoie da tastiera personalizzate utilizzando l'API Javascript IPython. Usando la magia %%javascript, si può scrivere un javascript all'interno di console interattiva di IPython come segue (nell'esempio descritto here):Scorciatoia da tastiera personalizzata per Notebook IPython per duplicare la linea corrente in modalità di modifica

%%javascript 

IPython.keyboard_manager.command_shortcuts.add_shortcut('r', { 
    help : 'run cell', 
    help_index : 'zz', 
    handler : function (event) { 
     IPython.notebook.execute_cell(); 
     return false; 
    }} 
); 

mi piacerebbe scrivere un javascript che crea un collegamento in modalità di modifica che si lega Ctrl-Alt Giù all'azione di 'duplica linea corrente' --- cioè, sposta il cursore all'inizio della linea corrente, seleziona la linea, copia la linea, ritorna, incolla. In sostanza, voglio emulare la scorciatoia da tastiera di Eclipse, o Ctrl-d in Notepad ++, o C-a C-SPACE C-n M-w C-y in Emacs. Il file javascript assumerà la forma di quanto segue:

%%javascript 

IPython.keyboard_manager.edit_shortcuts.add_shortcut('ctrl-alt-down', { 
    help : 'run cell', 
    help_index : 'zz', 
    handler : function (event) { 
     [Code that duplicates the line]; 
     return false; 
    }} 
); 

se i miei tentativi suggeriscono 'ctrl-alt-down' è il modo sbagliato per rappresentare la sequenza di scelta rapida, e non riesco a trovare alcuna documentazione per il keyboard_manager .

Preferirei non andare con una soluzione AutoHotKey (ad es.) Poiché voglio limitare questo collegamento alla modalità di modifica di IPython Notebook.

risposta

6

Aggiungere al ~/.jupyter/custom/Custom.js codice successivo

/** 
* 
* Duplicate a current line in the Jupyter Notebook 
* Used only CodeMirror API - https://codemirror.net 
* 
**/ 
CodeMirror.keyMap.pcDefault["Ctrl-Down"] = function(cm){ 

    // get a position of a current cursor in a current cell 
    var current_cursor = cm.doc.getCursor(); 

    // read a content from a line where is the current cursor 
    var line_content = cm.doc.getLine(current_cursor.line); 

    // go to the end the current line 
    CodeMirror.commands.goLineEnd(cm); 

    // make a break for a new line 
    CodeMirror.commands.newlineAndIndent(cm); 

    // filled a content of the new line content from line above it 
    cm.doc.replaceSelection(line_content); 

    // restore position cursor on the new line 
    cm.doc.setCursor(current_cursor.line + 1, current_cursor.ch); 
}; 

Risultato

enter image description here

testato in un ambiente prossimo

[email protected] ~ $ google-chrome --version 
Google Chrome 53.0.2785.116 
[email protected] ~ $ jupyter --version 
4.1.0 
[email protected] ~ $ uname -a 
Linux wlysenko-Aspire 3.13.0-37-generiC#64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 
Problemi correlati