2009-05-27 30 views
11

Khi sử dụng paredit trong chế độ lập trình như C, gõ (sẽ chèn dấu cách trước dấu ngoặc khi tôi đang cố gắng để gọi một chức năng, để lại tôi với:Thay đổi Paredit Formatting

foo() 

Có cách nào Để vô hiệu hóa việc chèn không gian mà không thay đổi nguồn của paredit?

Trả lời

13

Vâng, cách paredit xuất hiện để hoạt động là nó kiểm tra các bảng cú pháp để xem bạn đang chèn một cặp ngay sau một từ/ký hiệu/v.v. trong trường hợp này, nó buộc một khoảng trống được chèn vào. Bạn cần ghi đè chức năng đó - có thể thực hiện một số cách khác nhau: tư vấn, xác định lại hàm quyết định không gian g, thay đổi bảng cú pháp vv

Tôi muốn thử thẳng về phía trước:

(defun paredit-space-for-delimiter-p (endp delimiter) 
    (and (not (if endp (eobp) (bobp))) 
     (memq (char-syntax (if endp (char-after) (char-before))) 
      (list ?\" ;; REMOVED ?w ?_ 
        (let ((matching (matching-paren delimiter))) 
        (and matching (char-syntax matching))))))) 

Điều này rõ ràng sẽ áp dụng cho tất cả những nơi mà bạn sử dụng paredit. Nếu bạn muốn một chế độ cụ thể hơn, bạn có thể thêm một số điều kiện vào câu lệnh and đó (ví dụ: (and ... (memq major-mode '(c-mode lisp-mode)))).

Vì vậy ... Tôi đoán tôi đã thay đổi "nguồn", nhưng bạn có thể làm điều tương tự với một đoạn defadvice ... tất cả đều là elisp, do đó, sự khác biệt là tối thiểu. Dường như không có cài đặt để kiểm soát loại hành vi này.

+2

Tôi đã muốn này trong một thời gian dài, kể từ khi tôi tìm autopair.el _very_ chậm. Paredit bây giờ hoạt động như một nét duyên dáng trong 'c-mode'. Cảm ơn bạn! :) –

+0

Đối với chế độ cụ thể, người ta cũng có thể viết '(defvar-local my-paredit-no-insert-space nil)' và sử dụng '(và ... my-paredit-no-insert-space)' thay vì '(và ... (memq major-mode '(chế độ lisp mode c))))' và sau đó đặt 'my-paredit-no-insert-space' thành' t' từ 'c-mode-common- hook'. Bằng cách này, hai người có sở thích khác nhau có thể sử dụng cùng một định nghĩa mới của 'paredit-space-for-delimiter-p' –

+0

' Nếu bạn muốn chế độ cụ thể hơn, bạn có thể thêm một số điều kiện vào đó và câu lệnh' - tôi muốn không ghi đè điều này cho một số chế độ, nhưng tôi không hiểu câu lệnh 'if 'nào tôi có thể thêm điều kiện vào. Bạn có thể làm rõ? – Max

4

Vâng, Paredit là lý tưởng để chỉnh sửa ngôn ngữ được tạo bằng biểu thức S. Nếu bạn chỉ thích cách nó tự động chèn dấu ngoặc đóng, hãy sử dụng tính năng skeleton-pair.

(setq skeleton-pair t) 
(global-set-key "(" 'skeleton-pair-insert-maybe) 
+0

Điểm tốt. Tôi quên mất bộ xương. Tôi rất quen với Paredit để nhạo báng xung quanh với các emacs lisp. Tôi cần phải thiết lập điều đó cho các ngôn ngữ không lispy của tôi .. –

+3

Trên thực tế, chế độ paredit là cực kỳ hữu ích bên ngoài các ngôn ngữ dựa trên biểu thức cũng như để thực thi tính hợp lệ của các dấu phân tách phù hợp; nó không chỉ là về chèn. – technomancy

5

Xem paredit-space-for-delimiter-predicates

+0

Điều này có thể quan tâm đến vấn đề này (có thể cần điều chỉnh tên chế độ, hoặc thậm chí loại bỏ 'dolist' và bổ sung đơn giản 'lambda()' vào móc của chế độ (nếu chỉ có một chế độ)): https://gist.github.com/remvee/879305 – dimsuz