2015-03-24 4 views
10

In der IPython Notebook-Umgebung können benutzerdefinierte Tastaturkurzbefehle mithilfe der IPython Javascript-API definiert werden. Mit Hilfe der %%javascript Magie kann man ein Javascript in IPython interaktive Konsole wie folgt schreiben (Beispiel here beschrieben):Benutzerdefiniertes Tastaturkürzel für IPython Notebook, um die aktuelle Zeile im Bearbeitungsmodus zu duplizieren

%%javascript 

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

Ich mag würde ein Javascript schreiben, die eine Verknüpfung während Bearbeitungsmodus erstellt, die Ctrl-Alt- bindet Bis zur Aktion 'Dupliziere aktuelle Zeile' --- das heißt, den Cursor zum Anfang der aktuellen Zeile bewegen, die Zeile auswählen, die Zeile kopieren, zurückgeben, einfügen. Im Wesentlichen möchte ich die Tastenkombination von Eclipse oder Strg-d in Notepad ++ oder C-a C-SPACE C-n M-w C-y in Emacs emulieren. Die JavaScript-Datei wird in Form der folgenden Möglichkeiten:

%%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; 
    }} 
); 

obwohl meine Versuche deuten darauf hin, ‚ctrl-alt-down‘ ist der falsche Weg, um die Abkürzung Sequenz darzustellen, und ich kann keine Dokumentation für die keyboard_manager finden .

Ich würde lieber nicht mit einer (z. B.) AutoHotKey-Lösung gehen, da ich diese Verknüpfung auf den Bearbeitungsmodus von IPython Notebook beschränken möchte.

Antwort

6

hinzufügen, um die ~/.jupyter/custom/custom.js nächsten Code

/** 
* 
* 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); 
}; 

Ergebnis

enter image description here

in einem nächsten Umgebung getestet

[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