在IPython中关闭自动括号闭合功能

84
我一直关注ipython的开发分支(因为ipython几乎是最棒的东西了)。在不久之前(昨天发布神奇的ipython 2.0版本之前),我注意到它已经开始在我输入时自动关闭括号、方括号、引号等等。这种情况发生在终端和笔记本会话中,所以我认为这是开发人员故意选择的特性。我可以理解其他人可能喜欢这个功能,但它让我非常疯狂。
我在配置文件中找不到任何相关选项。我甚至无法通过谷歌搜索得到结果,因为我不知道它叫什么。唯一能找到的是括号自动匹配这个不同的功能。实际上,我确实找到了这个问题,但那很旧了,而且回答说我看到的行为不可能发生。
我该如何关闭这个功能?[我主要只在笔记本界面使用,所以在那里关闭就可以了,但我更希望同时在笔记本和终端的ipython会话中关闭它。]
9个回答

32

@minrk的答案是这个修复方案的核心,但你需要在一个初始化回调函数中加上它,至少在使用IPython-3.1.0版本时需要这样做。在你的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;
  });
});

感谢 @Mike 关于 IPython 的 RequireJS 依赖加载的评论和指向更好的表述的指针 IPython/Jupyter Installing Extensions

Jupyter 4.0.x 的编辑:

当前的 IPython notebook 实现,Jupyter 4.0.0,改进了 JS 自定义。它现在默认使用 ~/.jupyter/custom/custom.js,你需要将整个 require(... events.on(...)) 片段替换为以下全局范围内的代码:

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

同样地,如果你想使用jQuery来操纵任何东西,只需直接使用全局的jQuery。例如,我喜欢默认隐藏固定标题,这为我的代码提供了另外40像素的空间,我认为这比一直看Jupyter标志更有价值:
jQuery('#header-container').hide();

针对 Jupyter ≥ 4.0.6 进行编辑(但是小于 Jupyter Lab):

如果上面的 custom.js 解决方案不起作用,请尝试将以下内容添加到您的 ~/.jupyter/nbconfig/notebook.json 文件中:

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

1
请注意,现在只有大约2/3的时间定义了 $,因为启动过程已经改变。正如我在这个答案中指出的那样,你可以从现在创建的 custom.js 中看到,需要使用 require - Mike
3
在 Ipython/Jupyter 4.0 中,这个方法对我不再起作用了。有人遇到过同样的问题吗? - bjonen
隐藏 #header-container 也会隐藏文件名(没关系,只需使用“文件”>“重命名”查看/编辑名称)和自动保存的时间戳(我猜这不是很重要...)。 - MD004
1
你的 Jupyter 4.0 指南似乎也适用于 Jupyter 5.0,我很高兴看到这一点。 - nealmcb
我无法在6.0.3上使用4.0版本,但是这里有一个更新的答案对我有效:https://dev59.com/6lcP5IYBdhLWcg3wi6kA - doublefelix
或者您可以在 Jupyter 4.6.X 中运行以下代码: from notebook.services.config import ConfigManager ; c = ConfigManager() ; c.update('notebook', {"CodeCell": {"cm_config": {"autoCloseBrackets": False}}}) ,特别是当该配置文件已存在时。 - T. Zack Crawford

24

笔记本行为是CodeMirror autoCloseBrackets 插件的结果。您可以通过编辑(如果尚未创建,请使用ipython profile create~/.ipython/profile_default/static/custom/custom.js 并添加以下内容来关闭它:

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

关于终端,我没有看到你所描述的括号行为。你可能定义了 PYTHONSTARTUP 吗?IPython 默认会执行此文件,你可以通过添加到 ~/.ipython/profile_default/ipython_config.py 来禁用它:

c.InteractiveShellApp.exec_PYTHONSTARTUP = False

它在终端上能正常工作吗?readline支持在现有的“)”上键入“)”吗? - asmeurer
2
命令$ ipython profile create将会提示创建一个.py文件。请勿编辑该文件,而是像答案所说的那样编辑~/.ipython/profile_default/static/custom/custom.js文件。有没有办法关闭烦人的自动括号匹配功能,这样大家才能愉快地敲代码呢? - 7stud
5
这似乎在IPython 3.1.0 / Jupyter中无法使用(我尝试删除我的〜/ .ipython并从头开始)。有什么办法在更新的版本中实现它吗?此外,如何消除更烦人的引号自动关闭行为? - naught101
chbrown的回答提供了新的做法。 - Mike
1
在IPython 4.0/Jupyter中也尝试了chbrown的方法,但没有成功;我的引号仍然被自动关闭。有任何更新吗? - horatio1701d

14

如果你想仅使用Python完成此操作:

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

3
似乎这个解决方案应该能够跨越Jupyter版本持续发挥作用。 - ansonw
2
在任何Jupyter Notebook的单元格中运行此代码后,刷新页面(按下 cmd+RF5)使其生效。 - Louis Yang

11

这是我在 Jupyter 4.0.6 中使用的方法:

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

~/.jupyter/custom/custom.js文件中。

顺便提一句,如果你想关闭匹配括号的语法高亮:

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

7
在JupyterLab笔记本中,您可以在设置菜单中关闭autoClosingBrackets插件。前往Settings --> Advanced Settings Editor并在User Overrides部分添加以下内容:
{
  "codeCellConfig": {
    "autoClosingBrackets": false
  }
}

屏幕截图 image

这适用于JupyterLab 0.32.1和jupyter_core 4.4.0。


5

对我来说,在Jupyter 4.3.0和Jupyter Notebook 5.0.0中,上述建议没有起作用。

我发现我需要创建一个名为~/.jupyter/custom/custom.js的文件,并将以下内容放入其中:

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

请注意,在我进行此操作之前,目录~/.jupyter/custom不存在。
这是根据v5.0文档中的建议拼凑而成的,对于未来的读者,这些是最新版本

8
天啊,为什么每次Jupyter更新版本后,这个问题的答案都出问题。我只想永久禁用它。 - asmeurer
这是我在Jupyter 5.0中使用过的唯一有效解决方案。 - primer_cuervo
这对我在jupyter-core(4.3.0),notebook(5.0.0)上没有起作用,但Sergey的答案起了作用! - Heath Raftery

4

对于Jupyter Notebook 5.1版本,使用与4.2相同的方法,即将以下片段放入~/.jupyter/custom/custom.js文件中:

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

这个在5.0.0版本上对我有效,而Sam的解决方案却一点作用也没有。哎呀。 - Heath Raftery
1
这两个对我都不再起作用了,但是这个解决方案可以:https://dev59.com/6lcP5IYBdhLWcg3wi6kA - Jim Garrison

3

我发现其他答案中没有提到这一点。在我的情况下(OS X,Jupyter 4.2.0),custom.js位于~/anaconda/lib/python3.5/site-packages/notebook/static/custom/custom.js

我认为这可能会对像我一样的人有所帮助。


2
我们可以从Jupyter控制台中实现这个,试一下。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接