Không ghép dấu ngoặc kép ở chế độ cặp điện


7

Làm thế nào tôi có thể nhận được electric-pair-modeđể không ghép dấu ngoặc kép (đơn hoặc đôi)? Tôi vẫn muốn nó ghép mọi thứ khác (dấu ngoặc, dấu ngoặc nhọn, v.v.), chỉ không trích dẫn.


Bạn đã thử tùy chỉnh electric-pair-inhibit-predicate?
elethan

@elethan tôi tìm electric-pair-inhibit-predicatebiến này ở đâu? Nó không được biết đến với emacs của tôi 24.3.1
ggll

@ggll Tôi đang sử dụng Emacs 25.1.1 và đối với tôi nó nằm trong elec-pair.el.
elethan

Trong nguồn electric-pair-mode, electric-pair-pairselectric-pair-text-pairsđược sử dụng để chỉnh sửa, nhưng electric-pair-text-syntax-tableđược ưu tiên. Một hook mà cục bộ đặt các biến này là đủ để làm cho nó hoạt động. Tôi sẽ kiểm tra nếu đó là trường hợp sau và gửi câu trả lời.
DoMiNeLa10

Câu trả lời:


5

Thêm phần sau vào tệp init emacs của bạn:

(setq electric-pair-inhibit-predicate
      (lambda (c)
        (if (char-equal c ?\") t (electric-pair-default-inhibit c))))

Tham khảo từ bài đăng trên blog của tôi: https://www.toporms.net/blog/2016/09/29/emacs-disable-certain-pairs-for-electric- Pair-mode /


1
Điều này không làm việc cho tôi. Dấu ngoặc kép vẫn được ghép nối.
Ben

@Ben Bạn có phiên bản emacs nào. Vui lòng thêm thông tin đó vào câu hỏi của bạn. Vui lòng thử mã từ câu trả lời này với emacs -Q(emacs bắt đầu với tùy chọn dòng lệnh -Q). Có lẽ một số gói khác can thiệp. Mã này hoạt động với tôi với GNU Emacs 25.3.1 (x86_64-unknown-cygwin, GTK + Phiên bản 3.22.20) của ngày 2017-09-11.
Tobias

Tôi đang thêm một câu trả lời vì tôi chưa thể bình luận. @xuhdev có câu trả lời đúng nhưng vì lý do tôi không thực sự hiểu trong hệ thống của mình khi tôi đánh giá: (setq điện-cặp-ức chế-dự đoán (lambda (c) (if (char-Equ c? \ ") t (điện -Pair-default-Ức chế c)))) Tôi nhận được (lambda (c) (if (char-bằng c 34) t (cặp điện-mặc định-ức chế c))). Vì vậy, hãy thử biến tùy chỉnh Mx, chọn điện -Pair-kiềm chế-vị ngữ, sau đó chọn từ hàm menu giá trị và trong hộp ghi: (lambda (c) (if (char-bằng c? \ ") t (cặp điện-mặc định-ức chế c)) ) Cách này hoạt động cho các cấu hình của tôi tại emac
D. Dimakakos

Xin đừng đăng một câu trả lời giả thay cho một bình luận. Khi bạn đạt được một chút điểm "danh tiếng", bạn sẽ có thể nhận xét. Nếu bạn đang tự hỏi tại sao ?\"cuối cùng lại được in thành 34, đó là vì "ký tự giống với số nguyên 34. Trong Emacs, các ký tự là số nguyên dương của một phạm vi nhất định.
vẽ

Đây phải là một vấn đề phiên bản điện.el. Tôi đang sử dụng GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu) of 2016-01-13.
Bến

3

Có vẻ như bạn không thể. Các tùy chỉnh khác nhau chỉ cho phép bạn thêm các cặp.

Nếu bạn sẵn sàng sử dụng một gói khác để thực hiện ghép nối, bạn có thể dùng thử smartparens . Bạn có thể đặt dấu ngoặc kép để không ghép nối như sau:

(sp-pair "'" nil :actions :rem)
(sp-pair "\"" nil :actions :rem)

Lưu ý rằng smartparens thiếu một số tính năng tinh tế từ cặp điện không rõ ràng ngay lập tức. Nếu bạn có thể vượt qua điều đó (hoặc tự sửa đổi chúng), dù sao đi nữa cũng có thể đáng để chuyển đổi. Smartparents có các tính năng hữu ích khác và linh hoạt hơn rất nhiều.
jcaw

Bạn có thể đề cập đến một tính năng cặp điện tinh tế bị thiếu từ smartparens, @JackCC không?
Omar

Đã được một thời gian kể từ khi tôi chuyển đổi, vì vậy những điều này có thể sai, nhưng ngoài đỉnh đầu của tôi: nếu bạn có một dấu ngoặc đóng ngay sau con trỏ (hoặc với khoảng trắng giữa nó), gõ dấu ngoặc mở vào electric-pairsẽ tôn trọng đóng nẹp. Trong smartparens, một nẹp đóng mới luôn được tạo trừ khi bạn ở chế độ nghiêm ngặt (có tác dụng phụ mạnh khác). Ví dụ: |)-> (|)trong electric-pairso với |)-> (|))trong smartparens. Biểu tượng ống |đại diện cho con trỏ.
jcaw

Tương tự như vậy, nếu bạn đang ở trong electric-pairvà bạn có một nẹp đóng bốn dòng xuống chỉ với khoảng trắng giữa con trỏ và nẹp đóng và bạn gõ nẹp đóng đó, nó sẽ thay thế nẹp bên dưới, làm cho nó trở nên lộn với con trỏ. Điều đó không xảy ra smartparenstrừ khi bạn ở chế độ nghiêm ngặt. Đây là một phím tắt đẹp khi chỉnh sửa một cái gì đó như lisp (hoặc thậm chí là một cái gì đó giống như Python, một cách trung thực) bởi vì nó làm giảm chi phí nhận thức của định dạng biểu thức s. Nó có thể làm cho việc niềng răng cân bằng trở nên khó hiểu hơn.
jcaw

Tôi tin rằng electric-paircũng thừa hưởng các cặp của nó từ bảng cú pháp của chế độ hiện tại, trong khi đó smartparensbạn phải lập trình rõ ràng trong mỗi cặp. Tôi có thể sai về điều đó mặc dù.
jcaw

2

Cập nhật: Câu trả lời của @ xuhdev là thích hợp hơn vì nó không can thiệp vào mã của Emacs.

Có thể có giá trị một yêu cầu tính năng có tùy chỉnh đó. Hiện tại, nó có vẻ tầm thường để sửa đổi mã trong câu hỏi.

Sau đó tải biến thể của riêng bạn về chức năng điện-cặp-hậu-tự chèn

Mở elec-cặp.el và sao chép từ đó

(defun electric-pair-post-self-insert-function ()
[ ... ] )

Sau đó nhìn vào cơ thể cho bất kỳ

(memq syntax '(?\( ?\) ?\" ?\$))

và xóa ?\"từ đó, tức là

(memq syntax '(?\( ?\) ?\$))

nhưng không xóa? \ "ở những nơi khác (!)

và tải lại tức là đánh giá chức năng đã thay đổi.

Để tải lại ở phiên tiếp theo, hãy đặt nó vào một số tệp "my-change-Stuff.el" và tải tệp này từ tệp init của bạn.


Đây là giải pháp duy nhất hoạt động cho emacs 24.3.1.
Bến
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.