2016-07-29 37 views
20

Die neue Version von IPython hängt nicht mehr von readline ab, sondern verwendet die reine Python-Bibliothek prompt-toolkit, um Wartungsprobleme auf Apple- und Windows-Systemen zu lösen.IPython 5.0 und Tastenbelegung in Konsole

Ein neues Feature ist die Möglichkeit, einen mehrzeilige Codeblock, mit den Cursortasten zu bearbeiten frei im Codeblock bewegen - mit dieser Kraft kommt es, zumindest für mich, ein Problem: weil ein ret im Code fügt eine neue Linie, den ganzen Block an den Interpreter Sie die Verknüpfung alt + ret oder möglicherweise die weniger bequeme Tastenfolge esc von ret gefolgt verwenden müssen passieren.

ich sagen, dies ist ein Problem, weil mein Terminal-Emulator der Wahl der XTerm- ist und auf vielen Linux-Distributionen ist die Abkürzung alt + ret nicht an die Anwendung übergeben, sondern wird direkt durch die verwendete XTerm, in dem IPython ausgeführt wird, um die Bildschirmfülle des genannten Terminals umzuschalten (@ThomasDickey, xterm's Mantainer und Co-Autor wiesen darauf hin, dass xterm standardmäßig nicht daran interessiert ist, das Modifikations-Bit bei Enter even an die Anwendung zu senden wenn man die Fullscreen-Aktion aufhebt).

Aus diesem Grund möchte ich zumindest diese spezifische IPython-Schlüsselbindung ändern.

Ich habe Anweisungen (Art) für die vorherigen Versionen gefunden, die readline basierten, von IPython, die nicht auf die neue Version 5.0 zutreffen.

Was ich brauche sind Anweisungen, die dazu führen, dass ich in der Benutzerdokumentation von IPython die Namen der möglichen Aktionen, die ich binden kann, die Namen der Verknüpfungen zum Binden mit den Aktionen und die Vorgehensweise zum Konfigurieren finden neue Tastenbelegung

diese Art der kanonischen Antwort hat Falls, ich kann mit einem Rezepte glücklich sein, dieses spezifische Keybinding zu erreichen, mit der Bedingung, dass das Rezept funktioniert immer noch in IPython 6.0

+3

Ich habe dich hauptsächlich aufgestuft, weil du mir beigebracht hast, dass ich 'esc' drücken kann, um den Bearbeitungsmodus zu verlassen, um den Befehl auszuführen! :) –

+2

Nachdem ich 30 Punkte zu dieser Frage bekommen habe (mein bisher bestes), fühle ich mich verpflichtet, ein wenig Ansehen in diese Frage zu investieren – gboffi

+3

+1 für das Unterrichten dieses "alt + return" Tricks! – wim

Antwort

4

Sie könnten die Konfiguration von xterm ändern.

xterm ist konfigurierbar (und dokumentiert).Im xterm Handbuch zeigt die Default Key Bindings Abschnitt der Standardwert für diesen Schlüssel Bindung:

     Alt <Key>Return:fullscreen() \n\ 

können Sie unterdrücken, die in mehr als einer Weise verbindlich:

  • mit der omitTranslation Ressource zu unterdrücken das Merkmal
  • Einstellung der fullscreen Ressource never

jedoch unterdrückt nur wird es nicht es etwas interessantes (xterm ignoriert den Modifikator für Geben Sie) senden lassen. Einrichten einer translation Ressource Werke, zum Beispiel in Ihrer $HOME/.Xdefaults Datei:

*VT100*translations:  #override \n\ 
    Alt <Key>Return: string("\033[27;3;13~") 
+0

Thomas, deine Antwort ist nützlich, danke. Ich würde mich sehr freuen, wenn IPython halb so gut dokumentiert wäre wie xterm ... 1000 danke auch für xterm. Ciao – gboffi

2

Die ctrl + j oder ctrl + m Tastaturkürzel validieren den Eintrag.

+0

Vielen Dank für Ihre Antwort. Die Tastenkombinationen Strg + J oder Strg + M sind genau dieselben wie RET. Wenn Sie einen mehrzeiligen Codeblock bearbeiten, fügen Sie an der aktuellen Cursorposition einen Zeilenumbruch ein, während Alt + RET oder die Sequenz Esc RET die Ausführung des Codeblocks unabhängig von der Position des Cursors erzwingen. Wenn Sie denken, dass dieser Aspekt des Problems nicht klar genug ist, könnte ich versuchen, meine Frage zu bearbeiten. – gboffi

+0

Ich benutze Windows und in meiner Konsole Esc RET und Strg + j oder Strg + m machen das gleiche: Ausführung der Block.-, alt RET tut nichts, und RET fügt eine neue Zeile. Hast du eine andere Erfahrung? Welches Betriebssystem verwenden Sie (Windows, Linux, Mac OS)? –

0

Ändern von Tastenkombinationen in der Konfiguration, wenn prompt_toolkit verwendet, ist (noch) nicht möglich; obwohl es ziemlich einfach ist, wenn Sie IPython von der Quelle installieren. Wenn Sie sich die Datei IPython/terminal/shortcuts.py ansehen, werden Sie sehen, dass sie die verschiedenen Logik enthält; insbesondere finden Sie:

# Ctrl+J == Enter, seemingly 
registry.add_binding(Keys.ControlJ, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(newline_or_execute_outer(shell)) 

Diese binden CTRLJ (Enter), um die Funktion newline_or_execute_outer, die für das Hinzufügen neuer Linien verantwortlich ist; es wird später in der Datei definiert. Insbesondere wenn Sie am Ende eines Codeblocks zweimal die Eingabetaste drücken, sollte der Block ohne weitere Verknüpfungen ausgeführt werden.

Streifen die Logik, die neuen Linien ergänzt:

def execute_outer(shell): 
    def execute(event): 
     """When the user presses return, insert a newline or execute the code.""" 
     b = event.current_buffer 

     # some logic to also dismiss the completer 

     b.accept_action.validate_and_handle(event.cli, b) 
    return execute 

Bind es um die Linie 20 etwas:

registry.add_binding(Keys.ControlE, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(execute_outer(shell)) 

und genießen. Wenn Sie mit der Dokumentation nicht zufrieden sind, begrüßen wir die Hilfe. Nehmen wir zum Beispiel den Kern der Antworten und geben Sie sie zurück. Es ist ein bisschen verletzend harte Kommentare zu lesen, wenn wir in den Versionshinweisen sagen Sie:

New terminal interface 

The overhaul of the terminal interface will probably cause a range of minor 
issues for existing users. This is inevitable for such a significant 
change, and we’ve done our best to minimise these issues. Some changes that 
we’re aware of, with suggestions on how to handle them: 

IPython no longer uses readline configuration (~/.inputrc). We hope that 
the functionality you want (e.g. vi input mode) will be available by 
configuring IPython directly (see Terminal IPython options). If something’s 
missing, please file an issue. 

... 

IPython verbessern helfen tatsächlich konfigurierbare Tastenkombination mit Aktionen Namen zu haben ist auch zu erkennen, so ist, dann können Sie Ihre eigene Frage beantworten .