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.]

Mikrofon
źródło

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
    }
  }
}
brązowy
źródło
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
minrk
źródło
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}}})
Sean D.
źródło
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;
kkumer
źródło
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

Sam Mason
źródło
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;
})
Siergiej
źródło
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

joelostblom
źródło
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.

wuliang8910
źródło