【问题标题】:Turn off auto-closing parentheses in ipython在 ipython 中关闭自动关闭括号
【发布时间】:2014-05-15 15:37:32
【问题描述】:

我随时了解 ipython 的 dev 分支(因为 ipython 几乎是有史以来最棒的东西)。最近(在昨天的 ipython 2.0 发布之前)我注意到它已经开始自动关闭括号、方括号、引号等,因为我键入它们。它发生在终端[我在终端中没有使用其他任何东西]和笔记本会话中,所以我认为这是开发人员的有意选择。我可以尊重其他人可能会喜欢此功能,但它让我完全发疯

我在配置文件中找不到任何选项。我什至不能用谷歌搜索它,因为我不知道它叫什么。唯一出现的是automatic parentheses 的不同功能。我确实找到了this question,但那是旧的,并且表明我所看到的行为不会发生。

如何关闭此功能?

[反正我大多只是使用 notebook 界面,所以在那儿把它关掉就可以了,但我更愿意在终端的 notebook 和 ipython 会话中都把它关掉。]

【问题讨论】:

    标签: ipython ipython-notebook


    【解决方案1】:

    笔记本行为是 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 是否支持在现有的 ) 上键入 )
    • 命令$ ipython profile create 会说它创建了一个.py 文件。不要编辑该文件。而是像答案所说的那样编辑文件~/.ipython/profile_default/static/custom/custom.js。怎么会有人用那个烦人的自动右括号输入代码?
    • 这似乎在 IPython 3.1.0/Jupyter 中不起作用(我尝试删除我的 ~/.ipython 并从头开始)。知道如何在新版本中做到这一点吗?另外,如何破坏更烦人的报价自动关闭行为?
    • chbrown's answer above 提供了执行此操作的新方法。
    • 还在 IPython 4.0/Jupyter 中尝试了 chbrown 的方法,但没有成功;仍然让我的报价自动关闭。有什么更新吗?
    【解决方案2】:

    @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 笔记本实现 Jupyter 4.0.0 改进了 JS 自定义。它现在默认使用~/.jupyter/custom/custom.js,您需要在全局范围内将整个require(... events.on(...)) sn-p 替换为以下内容:

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

    同样,如果你想使用 jQuery 来操作任何东西,直接使用 jQuery 全局即可。例如,我喜欢默认隐藏固定标头,这为我的代码提供了另外 40px 的空间,我发现这比一直看 Jupyter 徽标更有价值:

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

    编辑Jupyter ≥ 4.0.6(但

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

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

    【讨论】:

    • 请注意,$ 现在只定义了大约 2/3 的时间,因为启动过程已经改变。正如我在this answer 中指出的那样,从ipython 现在创建的custom.js 中可以看出,您需要使用require
    • 在 Ipython/Jupyter 4.0 中,这不再适用于我。有人遇到同样的问题吗?
    • 隐藏#header-container 也隐藏了文件的名称(没什么大不了的,只需使用文件>重命名来查看/编辑名称)以及自动保存时显示的小消息(我猜猜它没那么重要......)。
    • 您对 Jupyter 4.0 的说明似乎也适用于 Jupyter 5.0,我很高兴看到。
    • 我没有得到适用于 6.0.3 的 4.0 版本,但这里有一个更新的答案对我有用:stackoverflow.com/questions/44216326/…
    【解决方案3】:

    这在 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;
    

    【讨论】:

      【解决方案4】:

      如果你只想通过 python 来做:

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

      【讨论】:

      • 似乎是跨 jupyter 版本的解决方案
      • 在任何一个 jupyter notebook 的单元格中运行后,刷新页面(按cmd+RF5)使其生效。
      【解决方案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);
      

      请注意,在我执行此操作之前,目录 ~/.juypter/custom 并不存在。

      这是从v5.0 文档中的建议中整合而来的,对于未来的读者来说,这些是latest

      【讨论】:

      • 天哪,为什么这个问题的答案会随着 Jupyter 的每个新版本而中断。我只是希望它永远被禁用。
      • 这是在 Jupyter 5.0 中唯一对我有用的解决方案
      • 这对我来说不适用于 jupyter-core (4.3.0)、笔记本 (5.0.0),但 Sergey 的回答可以!
      【解决方案6】:

      对于 Jupyter Notebook 5.1,使用与 4.2 相同的内容,即将以下 sn-p 放入 ~/.jupyter/custom/custom.js:

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

      【讨论】:

      【解决方案7】:

      我发现其他答案中没有提到它。就我而言(OS X,Jupyter 4.2.0),custom.js 位于 ~/anaconda/lib/python3.5/site-packages/notebook/static/custom/custom.js

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

      【讨论】:

        【解决方案8】:

        在 JupyterLab 笔记本中,您可以在设置菜单中关闭 autoClosingBrackets 插件。转到Settings --> Advanced Settings Editor 并在User Overrides 部分添加以下内容:

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

        截图

        这适用于 JupyterLab 0.32.1 和 jupyter_core 4.4.0

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-04
          • 2011-09-10
          • 1970-01-01
          • 1970-01-01
          • 2013-03-15
          • 1970-01-01
          相关资源
          最近更新 更多