Wyłącz automatyczne zamykanie nawiasów w ipythonie


81

Jestem na bieżąco z gałęzią deweloperów ipython (ponieważ ipython jest najbardziej niesamowitą rzeczą w historii). Dość niedawno (przed wczorajszym niesamowitym wydaniem ipythona 2.0) zauważyłem, że zaczął on automatycznie zamykać nawiasy, nawiasy, cudzysłowy itp., Gdy je wpisuję. Dzieje się tak zarówno w terminalu [nic innego, czego używam w terminalu tego nie robi], jak iw sesjach notebooka, więc zakładam, że był to celowy wybór ze strony programistów. Szanuję, że innym osobom ta funkcja może się podobać, ale doprowadza mnie to do szału .

Nie mogę znaleźć dla tego żadnej opcji w plikach konfiguracyjnych. Nie mogę go nawet wygooglować, ponieważ nie wiem, jak to się nazywa. Jedyne, co się pojawia, to inna funkcja automatycznych nawiasów . Właściwie to znalazłem to pytanie , ale jest stare i sugeruje, że zachowanie, które widzę, nie może się wydarzyć.

Jak mogę wyłączyć tę funkcję?

[I tak głównie używam interfejsu notebooka, więc samo wyłączenie go będzie w porządku, ale wolałbym go wyłączyć zarówno w notebookach, jak i sesjach ipython na terminalu.]

Odpowiedzi:


32

Odpowiedzią @ minrk jest mięso i kości poprawki, ale musisz ją opakować w wywołanie zwrotne inicjalizacji, przynajmniej z IPython-3.1.0. W twoim 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;
  });
});

Dzięki @Mike za komentarz na temat RequireJSładowania zależności IPythona i wskaźnika do lepszego sformułowania w IPython / Jupyter Installing Extensions .

Edytuj dla Jupyter 4.0.x:

Obecna implementacja notatnika IPython, Jupyter 4.0.0, ulepszyła dostosowania JS. Teraz używa ~/.jupyter/custom/custom.jsdomyślnie i musisz zastąpić ten cały require(... events.on(...))fragment tylko następującym w zakresie globalnym:

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

Podobnie, jeśli chcesz używać jQuery do manipulowania czymkolwiek, po prostu użyj jQuerybezpośrednio global. Na przykład lubię domyślnie ukrywać stały nagłówek, co daje mi kolejne 40px miejsca na mój kod, co uważam za nieco bardziej wartościowe niż patrzenie na logo Jupyter przez cały czas:

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

Edytuj dlaJupyter ≥ 4.0.6 (ale <Jupyter Lab):

Jeśli custom.jspowyższe rozwiązanie nie działa, spróbuj dodać następujące elementy do ~/.jupyter/nbconfig/notebook.json:

{
  "CodeCell": {
    "cm_config": {
      "autoCloseBrackets": false
    }
  }
}

1
Zauważ, że $obecnie definiuje się tylko około 2/3 czasu, ponieważ zmienił się proces uruchamiania. Jak wskazałem w tej odpowiedzi i jak widać z tego, custom.jsktóry ipython tworzy obecnie, musisz użyć require.
Mike

3
W Ipython / Jupyter 4.0 to już nie działa. Czy ktoś napotkał ten sam problem?
bjonen

Ukrywanie # nagłówka-kontenera powoduje również ukrycie nazwy pliku (nic wielkiego, po prostu użyj opcji Plik> Zmień nazwę, aby zobaczyć / edytować nazwę) i małą wiadomość, która mówi, kiedy został zapisany automatycznie (myślę, że to nie jest takie ważne ... ).
MD004

1
Twoje instrukcje dla Jupyter 4.0 wydają się działać również dla Jupyter 5.0, cieszę się, że to widzę.
nealmcb

Nie otrzymałem wersji 4.0 do pracy z 6.0.3, ale jest tutaj zaktualizowana odpowiedź, która działała dla mnie: stackoverflow.com/questions/44216326/ ...
doublefelix

24

Zachowanie notatnika jest wynikiem działania wtyczki CodeMirror autoCloseBrackets . Możesz to wyłączyć, edytując ( ipython profile createjeśli jeszcze tego nie zrobiłeś) ~/.ipython/profile_default/static/custom/custom.jsi dodając:

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

Jeśli chodzi o terminal, nie widzę opisanego przez ciebie zachowania w nawiasach. Czy może masz zdefiniowany PYTHONSTARTUP? IPython domyślnie wykonuje ten plik, który można wyłączyć, dodając do ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.exec_PYTHONSTARTUP = False

Czy to w ogóle zadziała w terminalu? Czy readline obsługuje pisanie )na istniejącym )?
asmeurer

2
Polecenie $ ipython profile createpowie, że utworzyło .pyplik. Nie edytuj tego pliku. Zamiast tego edytuj plik ~/.ipython/profile_default/static/custom/custom.js, tak jak mówi odpowiedź. Jak ktokolwiek może wpisać kod za pomocą tych irytujących, automatycznie zamykających się nawiasów?
7stud

5
Wygląda na to, że nie działa w IPython 3.1.0 / Jupyter (próbowałem usunąć mój ~/.ipythoni zacząć od zera). Masz pomysł, jak to zrobić w nowszych wersjach? A co powiesz na zniszczenie jeszcze bardziej irytującego zachowania automatycznego zamykania cytatów?
naught101

Odpowiedź chbrowna powyżej daje nowy sposób zrobienia tego.
Mike,

1
Bez powodzenia wypróbowałem również metodę chbrown w IPython 4.0 / Jupyter; nadal moje oferty są automatycznie zamykane. Jakieś aktualizacje?
horatio1701d

12

Jeśli chcesz to zrobić tylko z Pythona:

from notebook.services.config import ConfigManager
c = ConfigManager()
c.update('notebook', {"CodeCell": {"cm_config": {"autoCloseBrackets": False}}})

2
wydaje się być rozwiązaniem, które powinno nadal działać w wersjach
jupyter

2
Po uruchomieniu tego w komórce dowolnego notatnika jupyter odśwież stronę (naciśnij cmd+Rlub F5), aby była skuteczna.
Louis Yang

11

Oto, co działa dla mnie w Jupyter 4.0.6:

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

w ~/.jupyter/custom/custom.js.

BTW, jeśli dodatkowo chcesz wyłączyć podświetlenie składni pasujących nawiasów:

codecell.CodeCell.options_default.cm_config.matchBrackets = false;

5

Powyższe sugestie nie działały dla mnie w Jupyter 4.3.0 z Jupyter Notebook 5.0.0

Okazało się, że muszę utworzyć plik o nazwie ~/.jupyter/custom/custom.jso następującej zawartości:

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

Zauważ, że katalog ~/.juypter/customnie istniał, zanim to zrobiłem.

Zostało to zhakowane razem z sugestiami w dokumentach wersji 5.0 , a dla przyszłych czytelników są to najnowsze


8
Jezu, dlaczego odpowiedzi na to pytanie zrywają się z każdą nową wersją Jupytera. Chcę tylko, żeby to było wyłączone na zawsze.
asmeurer

To jedyne rozwiązanie, które zadziałało dla mnie w Jupyter 5.0
primer_cuervo

To nie zadziałało dla mnie z jupyter-core (4.3.0), notebookiem (5.0.0), ale odpowiedź Siergieja tak!
Heath Raftery

4

W przypadku Jupyter Notebook 5.1 użyj tego samego, co w wersji 4.2, tj. Umieść następujący fragment kodu w ~ / .jupyter / custom / custom.js:

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

To zadziałało dla mnie w wersji 5.0.0, kiedy rozwiązanie Sama nic nie dało. O jej.
Heath Raftery

1
Żadne z tych rozwiązań już dla mnie nie działa, ale to rozwiązanie działa: stackoverflow.com/questions/44216326/…
Jim Garrison,

4

W Jupyter Lab Notebook możesz wyłączyć autoClosingBracketswtyczkę w menu ustawień. Przejdź do Settings --> Advanced Settings Editori dodaj następujące informacje w User Overridessekcji:

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

Zrzut ekranu wizerunek

To działało z JupyterLab 0.32.1 i jupyter_core 4.4.0


3

Zauważyłem, że nie było to wymienione w innych odpowiedziach. W moim przypadku (OS X, Jupyter 4.2.0) custom.js znajduje się w ~ / anaconda / lib / python3.5 / site-packages / notebook / static / custom / custom.js

Myślę, że może to pomóc komuś takiemu jak ja.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.