Tắt tự động đóng dấu ngoặc đơn trong ipython


81

Tôi luôn cập nhật chi nhánh nhà phát triển của ipython (vì ipython là thứ tuyệt vời nhất từ ​​trước đến nay). Khá gần đây (trước khi phát hành ipython 2.0 tuyệt vời ngày hôm qua) tôi nhận thấy rằng nó đã bắt đầu tự động đóng dấu ngoặc đơn, dấu ngoặc nhọn, dấu ngoặc kép, v.v. khi tôi nhập chúng. Nó xảy ra trong cả thiết bị đầu cuối [không có gì khác mà tôi sử dụng trong thiết bị đầu cuối làm điều đó] và các phiên máy tính xách tay, vì vậy tôi cho rằng đó là một lựa chọn có chủ ý từ phía các nhà phát triển. Tôi có thể tôn trọng rằng người khác có thể thích tính năng này, nhưng nó khiến tôi hoàn toàn phát điên .

Tôi không thể tìm thấy bất kỳ tùy chọn nào cho nó trong các tệp cấu hình. Tôi thậm chí không thể google cho nó, bởi vì tôi không biết nó được gọi là gì. Điều duy nhất xuất hiện là tính năng khác biệt của dấu ngoặc đơn tự động . Tôi đã thực sự tìm thấy câu hỏi này , nhưng câu hỏi này đã cũ và cho thấy rằng hành vi mà tôi đang thấy không thể xảy ra.

Làm cách nào để tắt tính năng này?

[Tôi hầu như chỉ sử dụng giao diện máy tính xách tay, vì vậy chỉ cần tắt nó ở đó là được, nhưng tôi muốn tắt nó trong cả máy tính xách tay và phiên ipython tại thiết bị đầu cuối.]

Câu trả lời:


32

Câu trả lời của @ minrk là phần lớn của bản sửa lỗi, nhưng bạn sẽ cần phải bọc nó trong một lệnh gọi lại khởi tạo, ít nhất là với IPython-3.1.0. Trong của bạn 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;
  });
});

Cảm ơn @Mike về nhận xét của bạn về RequireJStải phụ thuộc của IPython và hướng dẫn đến một công thức tốt hơn tại Tiện ích mở rộng cài đặt IPython / Jupyter .

Chỉnh sửa cho Jupyter 4.0.x:

Việc triển khai máy tính xách tay IPython hiện tại, Jupyter 4.0.0, các tùy chỉnh JS được cải tiến. Nó hiện sử dụng ~/.jupyter/custom/custom.jstheo mặc định và bạn sẽ cần thay thế toàn bộ require(... events.on(...))đoạn mã đó chỉ bằng đoạn mã sau trong phạm vi toàn cầu:

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

Tương tự như vậy, nếu bạn muốn sử dụng jQuery để thao tác bất cứ thứ gì, chỉ cần sử dụng jQuerytrực tiếp toàn cục. Ví dụ: tôi muốn ẩn tiêu đề cố định theo mặc định, điều này mang lại cho tôi 40px không gian khác cho mã của tôi, điều này tôi thấy có giá trị hơn một chút so với việc nhìn vào biểu trưng Jupyter mọi lúc:

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

Chỉnh sửa choJupyter ≥ 4.0.6 (nhưng <Phòng thí nghiệm Jupyter):

Nếu custom.jsgiải pháp trên không hoạt động, hãy thử thêm phần sau vào ~/.jupyter/nbconfig/notebook.json:

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

1
Lưu ý rằng $chỉ được xác định khoảng 2/3 thời gian hiện nay, vì quá trình khởi động đã thay đổi. Như tôi đã chỉ ra trong câu trả lời này , và như bạn có thể thấy từ custom.jsipython mà ipython tạo ra ngày nay, bạn cần phải sử dụng require.
Mike

3
Trong Ipython / Jupyter 4.0, điều này không hoạt động với tôi nữa. Có ai gặp phải vấn đề tương tự không?
bjonen

Ẩn # header-container cũng ẩn tên của tệp (không có vấn đề gì lớn, chỉ cần sử dụng Tệp> Đổi tên để xem / chỉnh sửa tên) và thông báo nhỏ cho biết khi nào nó được lưu tự động (tôi đoán nó không quan trọng lắm ... ).
MD004

1
Hướng dẫn của bạn cho Jupyter 4.0 dường như cũng hoạt động với Jupyter 5.0, tôi rất vui khi thấy.
nealmcb

Tôi không nhận được phiên bản 4.0 để hoạt động trên 6.0.3, nhưng có một câu trả lời được cập nhật ở đây phù hợp với tôi: stackoverflow.com/questions/44216326/…
doublefelix

24

Hành vi sổ ghi chép là kết quả của plugin CodeMirror autoCloseBrackets . Bạn có thể tắt tính năng này bằng cách chỉnh sửa (tạo nó ipython profile createnếu bạn chưa có) ~/.ipython/profile_default/static/custom/custom.jsvà thêm:

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

Đối với thiết bị đầu cuối, tôi không thấy hành vi dấu ngoặc như bạn mô tả. Bạn có lẽ đã định nghĩa PYTHONSTARTUP không? IPython thực thi tệp này theo mặc định, bạn có thể tắt tệp này bằng cách thêm vào ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.exec_PYTHONSTARTUP = False

Nó thậm chí sẽ hoạt động trong thiết bị đầu cuối? Dòng đọc có hỗ trợ nhập )qua dòng hiện có )không?
asmeurer

2
Lệnh $ ipython profile createsẽ nói rằng nó đã tạo một .pytệp. Không chỉnh sửa tệp đó. Thay vào đó, hãy chỉnh sửa tệp ~/.ipython/profile_default/static/custom/custom.js, giống như câu trả lời cho biết. Làm sao mọi người có thể gõ mã với dấu ngoặc đơn tự động đóng khó chịu đó?
7stud

5
Điều này dường như không hoạt động trong IPython 3.1.0 / Jupyter (Tôi đã thử xóa của mình ~/.ipythonvà bắt đầu lại từ đầu). Bất kỳ ý tưởng làm thế nào để làm điều đó trong các phiên bản mới hơn? Ngoài ra, làm thế nào về việc phá hủy hành vi tự động đóng trích dẫn thậm chí còn khó chịu hơn?
naught101

câu trả lời của chbrown ở trên cung cấp một cách mới để thực hiện việc này.
Mike

1
Cũng đã thử phương pháp của chbrown's trong IPython 4.0 / Jupyter mà không gặp may; vẫn nhận được báo giá của tôi tự động đóng. Bất kỳ cập nhật cho điều này?
horatio1701

12

Nếu bạn muốn làm điều đó chỉ từ python:

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

2
có vẻ như giải pháp sẽ tiếp tục hoạt động trên các phiên bản
jupyter

2
Sau khi chạy điều này trong một ô trong bất kỳ sổ ghi chép jupyter nào, hãy làm mới trang (nhấn cmd+Rhoặc F5) để làm cho nó có hiệu lực.
Louis Yang

11

Đây là những gì phù hợp với tôi trong Jupyter 4.0.6:

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

trong ~/.jupyter/custom/custom.js.

BTW, Nếu bạn cũng muốn tắt tính năng tô sáng cú pháp của dấu ngoặc đơn phù hợp:

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

5

Các đề xuất trên không hiệu quả với tôi trong Jupyter 4.3.0 với Jupyter Notebook 5.0.0

Tôi thấy rằng tôi cần tạo một tệp có tên ~/.jupyter/custom/custom.jsvới nội dung sau:

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

Lưu ý rằng thư mục ~/.juypter/customkhông tồn tại trước khi tôi làm điều này.

Điều này đã được tấn công cùng nhau từ các đề xuất trong tài liệu v5.0 và đối với những người đọc trong tương lai, đây là những điều mới nhất


8
Ôi trời, tại sao câu trả lời cho câu hỏi này lại bị phá vỡ với mọi phiên bản Jupyter mới. Tôi chỉ muốn điều này bị vô hiệu hóa mãi mãi.
asmeurer

Đây là giải pháp duy nhất mà đã làm việc cho tôi trong Jupyter 5,0
primer_cuervo

Điều này không hiệu quả với tôi với jupyter-core (4.3.0), notebook (5.0.0), nhưng câu trả lời của Sergey đã làm được!
Heath Raftery

4

Đối với Jupyter Notebook 5.1, sử dụng tương tự như đối với 4.2, tức là đặt đoạn mã sau vào ~ / .jupyter / custom / custom.js:

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

Điều này đã làm việc cho tôi trên 5.0.0 khi giải pháp của Sam không làm gì cả. Ôi trời.
Heath Raftery

1
Không có những công việc cho tôi nữa, nhưng giải pháp này không: stackoverflow.com/questions/44216326/...
Jim Garrison

4

Trong Máy tính xách tay Jupyter Lab, bạn có thể tắt autoClosingBracketsplugin trong menu cài đặt. Đi tới Settings --> Advanced Settings Editorvà thêm phần sau vào User Overridesphần:

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

Ảnh chụp màn hình hình ảnh

Điều này hoạt động với JupyterLab 0.32.1 và jupyter_core 4.4.0


3

Tôi thấy nó không được đề cập trong các câu trả lời khác. Trong trường hợp của tôi (OS X, Jupyter 4.2.0), custom.js nằm trong ~ / anaconda / lib / python3.5 / site-package / notebook / static / custom / custom.js

Tôi nghĩ nó có thể giúp ích cho ai đó giống như tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.