Deaktivieren Sie in ipython automatisch schließende Klammern

80

Ich halte mich über den Entwicklungszweig von ipython auf dem Laufenden (weil ipython so ziemlich das tollste überhaupt ist). Vor kurzem (vor der gestrigen großartigen Version von ipython 2.0) habe ich festgestellt, dass Klammern, Klammern, Anführungszeichen usw. beim Tippen automatisch geschlossen werden. Es passiert sowohl im Terminal [nichts anderes, was ich im Terminal verwende] als auch in Notebook-Sitzungen, daher gehe ich davon aus, dass es eine absichtliche Entscheidung der Entwickler war. Ich kann respektieren, dass andere Leute diese Funktion mögen, aber sie macht mich total verrückt .

Ich kann keine Option dafür in den Konfigurationsdateien finden. Ich kann nicht einmal danach googeln, weil ich nicht weiß, wie es heißt. Das einzige, was auftaucht, ist die unterschiedliche Funktion der automatischen Klammern . Ich habe diese Frage tatsächlich gefunden , aber das ist alt und legt nahe, dass das Verhalten, das ich sehe, nicht passieren kann.

Wie kann ich diese Funktion deaktivieren?

[Ich benutze meistens sowieso nur die Notebook-Oberfläche, also wäre es in Ordnung, sie nur auszuschalten, aber ich würde es vorziehen, sie sowohl in Notebooks als auch in Ipython-Sitzungen am Terminal auszuschalten.]

Mike
quelle
7
Ja! Was für ein schreckliches Feature und was für eine schreckliche Verschwendung von ein paar Stunden, um es auszuschalten ...
Heath Raftery

Antworten:

32

Die Antwort von @ minrk ist das Fleisch und die Knochen des Fixes, aber Sie müssen es zumindest mit in einen Initialisierungsrückruf einwickeln IPython-3.1.0. In Ihrem custom.js:

require(['base/js/namespace', 'base/js/events'], function(IPython, events) {
  events.on('app_initialized.NotebookApp', function() {
    IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
  });
});

Vielen Dank an @Mike für Ihren Kommentar zum RequireJSLaden von IPython- Abhängigkeiten und den Zeiger auf eine bessere Formulierung bei IPython / Jupyter Installing Extensions .

Bearbeiten für Jupyter 4.0.x:

Die aktuelle IPython-Notebook-Implementierung Jupyter 4.0.0 hat die JS-Anpassungen überarbeitet. Es wird jetzt ~/.jupyter/custom/custom.jsstandardmäßig verwendet, und Sie müssen das gesamte require(... events.on(...))Snippet im globalen Bereich durch Folgendes ersetzen :

IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;

Wenn Sie mit jQuery etwas manipulieren möchten, verwenden Sie einfach das jQueryGlobal direkt. Zum Beispiel möchte ich den festen Header standardmäßig ausblenden, wodurch ich weitere 40 Pixel Platz für meinen Code habe, was ich etwas wertvoller finde, als ständig auf das Jupyter-Logo zu schauen:

jQuery('#header-container').hide();

Bearbeiten fürJupyter ≥ 4.0.6 (aber <Jupyter Lab):

Wenn die custom.jsobige Lösung nicht funktioniert, fügen Sie Folgendes hinzu ~/.jupyter/nbconfig/notebook.json:

{
  "CodeCell": {
    "cm_config": {
      "autoCloseBrackets": false
    }
  }
}
chbrown
quelle
1
Beachten Sie, dass dies $heutzutage nur etwa 2/3 der Zeit definiert ist, da sich der Startvorgang geändert hat. Wie ich in dieser Antwort ausgeführt habe und wie Sie aus der heutigen custom.jsErstellung von ipython ersehen können, müssen Sie verwenden require.
Mike
3
In Ipython / Jupyter 4.0 funktioniert das bei mir nicht mehr. Ist jemand auf das gleiche Problem gestoßen?
Bjonen
Durch das Ausblenden des # -Header-Containers wird auch der Name der Datei ausgeblendet (keine große Sache, verwenden Sie einfach Datei> Umbenennen, um den Namen anzuzeigen / zu bearbeiten) und die kleine Meldung, die besagt, wann sie automatisch gespeichert wurde (ich denke, es ist nicht so wichtig ... ).
MD004
1
Ihre Anweisungen für Jupyter 4.0 scheinen auch für Jupyter 5.0 zu funktionieren, ich bin froh zu sehen.
Nealmcb
Ich habe nicht die Version für 4.0 Arbeit auf 6.0.3, aber es gibt eine aktualisierte Antwort hier , die für mich gearbeitet: stackoverflow.com/questions/44216326/...
doublefelix
24

Das Notebook-Verhalten ist das Ergebnis des CodeMirror autoCloseBrackets- Plugins. Sie können dies deaktivieren, indem Sie Folgendes bearbeiten (erstellen, ipython profile createfalls noch nicht geschehen) ~/.ipython/profile_default/static/custom/custom.jsund Folgendes hinzufügen:

if (IPython.CodeCell) {
  IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
}

Was das Terminal betrifft, sehe ich das von Ihnen beschriebene Verhalten in Klammern nicht. Haben Sie vielleicht ein PYTHONSTARTUP definiert? IPython führt diese Datei standardmäßig aus. Sie können sie deaktivieren, indem Sie Folgendes hinzufügen ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.exec_PYTHONSTARTUP = False
minrk
quelle
Würde es überhaupt im Terminal funktionieren? Unterstützt readline das Tippen )über ein vorhandenes )?
Asmeurer
2
Der Befehl $ ipython profile creategibt an, dass eine .pyDatei erstellt wurde. Bearbeiten Sie diese Datei nicht. Bearbeiten Sie stattdessen die Datei ~/.ipython/profile_default/static/custom/custom.jswie in der Antwort angegeben. Wie kann jemand Code mit diesen nervigen Klammern zum automatischen Schließen eingeben?
7stud
5
Dies scheint in IPython 3.1.0 / Jupyter nicht zu funktionieren (ich habe versucht, meine zu löschen ~/.ipythonund von vorne zu beginnen). Irgendeine Idee, wie es in neueren Versionen geht? Wie wäre es auch damit, das noch nervigere Verhalten beim automatischen Schließen von Zitaten zu zerstören?
naught101
Die obige Antwort von chbrown gibt den neuen Weg, dies zu tun.
Mike
1
Ich habe auch die Methode von chbrown in IPython 4.0 / Jupyter ohne Glück ausprobiert. Ich bekomme immer noch meine Angebote automatisch geschlossen. Irgendein Update dazu?
horatio1701d
11

Das funktioniert bei mir in Jupyter 4.0.6:

require(['notebook/js/codecell'], function (codecell) {
  codecell.CodeCell.options_default.cm_config.autoCloseBrackets = false;
})

in ~/.jupyter/custom/custom.js.

Übrigens, wenn Sie zusätzlich die Syntax-Hervorhebung übereinstimmender Klammern ausschalten möchten:

codecell.CodeCell.options_default.cm_config.matchBrackets = false;
kkumer
quelle
11

Wenn Sie es nur aus Python machen wollen:

from notebook.services.config import ConfigManager
c = ConfigManager()
c.update('notebook', {"CodeCell": {"cm_config": {"autoCloseBrackets": False}}})
Sean D.
quelle
1
scheint die Lösung zu sein, die über jupyter Versionen hinweg weiter funktionieren sollte
ansonw
1
Nachdem Sie dies in einer Zelle in einem Jupiter-Notizbuch ausgeführt haben, aktualisieren Sie die Seite (drücken Sie cmd+Roder F5), um sie wirksam zu machen.
Louis Yang
5

Die obigen Vorschläge haben in Jupyter 4.3.0 mit Jupyter Notebook 5.0.0 bei mir nicht funktioniert

Ich stellte fest, dass ich eine Datei ~/.jupyter/custom/custom.jsmit dem folgenden Inhalt erstellen musste :

var cell = Jupyter.notebook.get_selected_cell();
var patch = {
  CodeCell: {
    cm_config: {
      autoCloseBrackets: false,
    }
  }
}
cell.config.update(patch);

Beachten Sie, dass das Verzeichnis ~/.juypter/customvorher nicht vorhanden war.

Dies wurde zusammen aus Vorschlägen in v5.0- Dokumenten gehackt , und für zukünftige Leser sind dies die neuesten

Sam Mason
quelle
8
Meine Güte, warum brechen die Antworten auf diese Frage mit jeder neuen Version von Jupyter. Ich möchte nur, dass dies für immer deaktiviert wird.
Asmeurer
Dies ist die einzige Lösung, die für mich in Jupyter 5.0
primer_cuervo
Dies funktionierte bei mir mit Jupyter-Core (4.3.0), Notebook (5.0.0) nicht, aber Sergeys Antwort!
Heath Raftery
4

Verwenden Sie für Jupyter Notebook 5.1 dasselbe wie für 4.2, dh fügen Sie das folgende Snippet in ~ / .jupyter / custom / custom.js ein:

require(['notebook/js/codecell'], function (codecell) {
  codecell.CodeCell.options_default.cm_config.autoCloseBrackets = false;
})
Sergey
quelle
Dies funktionierte für mich unter 5.0.0, als Sams Lösung nichts tat. Ach je.
Heath Raftery
1
Beides
Jim Garrison
4

Im Jupyter Lab Notebook können Sie das autoClosingBracketsPlugin im Einstellungsmenü deaktivieren. Gehen Sie zu Settings --> Advanced Settings Editorund fügen Sie im User OverridesAbschnitt Folgendes hinzu :

{
  "codeCellConfig": {
    "autoClosingBrackets": false
  }
}

Bildschirmfoto Bild

Dies funktionierte mit JupyterLab 0.32.1 und jupyter_core 4.4.0

joelostblom
quelle
3

Ich fand es wurde in anderen Antworten nicht erwähnt. In meinem Fall (OS X, Jupyter 4.2.0) befindet sich custom.js in ~ / anaconda / lib / python3.5 / site-packages / notebook / static / custom / custom.js

Ich denke, es könnte jemandem wie mir helfen.

wuliang8910
quelle