Desactive los paréntesis de cierre automático en ipython


81

Me mantengo actualizado con la rama de desarrollo de ipython (porque ipython es prácticamente la cosa más asombrosa que existe). Hace bastante poco (antes del impresionante lanzamiento de ipython 2.0 de ayer) me di cuenta de que ha comenzado a cerrar automáticamente paréntesis, corchetes, comillas, etc., mientras los escribo. Sucede tanto en el terminal [nada más que uso en el terminal lo hace] como en las sesiones del portátil, así que supongo que fue una elección intencionada por parte de los desarrolladores. Puedo respetar que a otras personas les guste esta función, pero me vuelve completamente loco .

No encuentro ninguna opción en los archivos de configuración. Ni siquiera puedo buscarlo en Google, porque no sé cómo se llama. Lo único que surge es la característica diferente de los paréntesis automáticos . De hecho, encontré esta pregunta , pero es antigua y sugiere que el comportamiento que estoy viendo no puede suceder.

¿Cómo puedo desactivar esta función?

[La mayoría de las veces uso la interfaz de la computadora portátil de todos modos, así que apagarla estaría bien, pero preferiría apagarla tanto en las computadoras portátiles como en las sesiones de ipython en la terminal].

Respuestas:


32

La respuesta de @ minrk es la esencia de la solución, pero deberá envolverla en una devolución de llamada de inicialización, al menos con IPython-3.1.0. En tu 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;
  });
});

Gracias @Mike por su comentario sobre la RequireJScarga de dependencia de IPython y el puntero hacia una mejor formulación en IPython / Jupyter Installing Extensions .

Editar para Jupyter 4.0.x:

La implementación actual del cuaderno IPython, Jupyter 4.0.0, renovó las personalizaciones de JS. Ahora se usa ~/.jupyter/custom/custom.jsde forma predeterminada, y deberá reemplazar todo ese require(... events.on(...))fragmento con solo lo siguiente en el alcance global:

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

Del mismo modo, si desea usar jQuery para manipular cualquier cosa, simplemente use el jQueryglobal directamente. Por ejemplo, me gusta ocultar el encabezado fijo de forma predeterminada, lo que me da otros 40 píxeles de espacio para mi código, que encuentro un poco más valioso que mirar el logotipo de Jupyter todo el tiempo:

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

Editar paraJupyter ≥ 4.0.6 (pero <Jupyter Lab):

Si la custom.jssolución anterior no funciona, intente agregar lo siguiente a su ~/.jupyter/nbconfig/notebook.json:

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

1
Tenga en cuenta que $solo se define aproximadamente 2/3 del tiempo en la actualidad, porque el proceso de inicio ha cambiado. Como señalé en esta respuesta , y como puede ver en el custom.jsque ipython crea hoy en día, debe usar require.
Mike

3
En Ipython / Jupyter 4.0, esto ya no me funciona. ¿Alguien se encontró con el mismo problema?
bjonen

Ocultar el # header-container también oculta el nombre del archivo (no es gran cosa, solo use Archivo> Cambiar nombre para ver / editar el nombre) y el pequeño mensaje que dice cuándo se guardó automáticamente (supongo que no es tan importante ... ).
MD004

1
Sus instrucciones para Jupyter 4.0 parecen funcionar también para Jupyter 5.0, me alegra verlo.
nealmcb

No obtuve la versión 4.0 para que funcione en 6.0.3, pero hay una respuesta actualizada aquí que funcionó para mí: stackoverflow.com/questions/44216326/…
doublefelix

24

El comportamiento del cuaderno es el resultado del complemento autoCloseBrackets de CodeMirror . Puede desactivar esto editando (créelo con ipython profile createsi aún no lo ha hecho) ~/.ipython/profile_default/static/custom/custom.jsy agregando:

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

En cuanto a la terminal, no veo el comportamiento de paréntesis que describe. ¿Tiene quizás un PYTHONSTARTUP definido? IPython ejecuta este archivo de forma predeterminada, que puede deshabilitar agregando a ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.exec_PYTHONSTARTUP = False

¿Funcionaría incluso en la terminal? ¿Readline admite escribir )sobre una existente )?
asmeurer

2
El comando $ ipython profile createdirá que creó un .pyarchivo. No edite ese archivo. En su lugar, edite el archivo ~/.ipython/profile_default/static/custom/custom.js, como dice la respuesta. ¿Cómo puede alguien escribir código con esos molestos paréntesis de cierre automático?
7stud

5
Esto parece no funcionar en IPython 3.1.0 / Jupyter (intenté eliminar mi ~/.ipythony comenzar desde cero). ¿Alguna idea de cómo hacerlo en versiones más nuevas? Además, ¿qué tal si se destruye el comportamiento de cierre automático de citas aún más molesto?
naught101

La respuesta de chbrown anterior brinda la nueva forma de hacer esto.
Mike

1
También probé el método de chbrown en IPython 4.0 / Jupyter sin suerte; aún obteniendo mis cotizaciones cerradas automáticamente. ¿Alguna actualización de esto?
horatio1701d

12

Si quieres hacerlo solo desde Python:

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

2
parece ser la solución que debería seguir funcionando en las versiones de
jupyter

2
Después de ejecutar esto en una celda en cualquier cuaderno de jupyter, actualice la página (presione cmd+Ro F5) para que sea efectivo.
Louis Yang

11

Esto es lo que me funciona en Jupyter 4.0.6:

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

en ~/.jupyter/custom/custom.js.

Por cierto, si además desea desactivar el resaltado de sintaxis de los paréntesis coincidentes:

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

5

Las sugerencias anteriores no me funcionaron en Jupyter 4.3.0 con Jupyter Notebook 5.0.0

Descubrí que necesitaba crear un archivo llamado ~/.jupyter/custom/custom.jscon el siguiente contenido:

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

Tenga en cuenta que el directorio ~/.juypter/customno existía antes de hacer esto.

Esto fue pirateado a partir de sugerencias en documentos v5.0 , y para futuros lectores, estos son los últimos


8
Joder, ¿por qué las respuestas a esta pregunta se rompen con cada nueva versión de Jupyter? Solo quiero que esto esté desactivado para siempre.
asmeurer

Esta es la única solución que me ha funcionado en Jupyter 5.0
primer_cuervo

Esto no funcionó para mí con jupyter-core (4.3.0), notebook (5.0.0), ¡pero la respuesta de Sergey sí lo hizo!
Heath Raftery

4

Para Jupyter Notebook 5.1 use lo mismo que para 4.2, es decir, coloque el siguiente fragmento en ~ / .jupyter / custom / custom.js:

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

Esto funcionó para mí en 5.0.0 cuando la solución de Sam no hizo nada. Oh querido.
Heath Raftery

1
Ninguno de estos funciona para mí, pero esta solución sí: stackoverflow.com/questions/44216326/…
Jim Garrison

4

En Jupyter Lab Notebook, puede desactivar el autoClosingBracketscomplemento en el menú de configuración. Vaya a Settings --> Advanced Settings Editory agregue lo siguiente en la User Overridessección:

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

Captura de pantalla imagen

Esto funcionó con JupyterLab 0.32.1 y jupyter_core 4.4.0


3

Descubrí que no se menciona en otras respuestas. En mi caso (OS X, Jupyter 4.2.0), custom.js se encuentra en ~ / anaconda / lib / python3.5 / site-packages / notebook / static / custom / custom.js

Creo que puede ayudar a alguien como yo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.