smartparens chèn ký tự đơn so với cặp?


8

H: Làm thế nào tôi có thể điều chỉnh smartparenscác quy tắc quyết định khi nào nên chèn một ký tự được ghép nối hoặc một ký tự?

smartparensdường như chủ yếu là thông minh khi chèn dấu ngoặc đơn (ví dụ: trong text-modehoặc org-mode). Do đó, mặc định là chèn một cặp 's và đặt con trỏ vào giữa chúng, nhưng, khi được gọi ở cuối từ, chỉ chèn một từ duy nhất ' vào dự đoán các cơn co thắt. Vì vậy, ví dụ:

  • '=> '*'( *điểm là ở đâu )
  • can + '=> can'*(vì vậy tôi có thể tiếp tục viết "không thể")

Tuy nhiên, có một trục trặc tôi đang tìm cách khắc phục. Tôi thường sử dụng các chữ viết tắt kết thúc trong một khoảng thời gian, nhưng muốn làm cho chúng có tính sở hữu. Ví dụ: tôi có thể viết "so" là viết tắt của "someone" và do đó "so" sẽ là "someone". Vấn đề là smartparenschèn một cặp - 'sau một khoảng thời gian:

  • những gì tôi muốn: s.o. + '=>s.o.'*
  • những gì tôi nhận được: s.o. + '=>s.o.'*'

Sự ngụy biện cụ thể của tôi là với smartparenshành vi của mình ', nhưng tôi có thể tưởng tượng đây cũng là một vấn đề chung hơn với các nhân vật khác.

Vậy: làm thế nào tôi có thể điều chỉnh smartparensquy tắc quyết định của mình để mở rộng tập hợp các ký tự mà sau đó nó chỉ chèn một ký tự '?

PS: buồn cười, cố gắng gõ "` smartparens` "trong emacs cũng cho hành vi khó chịu tương tự.

Câu trả lời:


2

Có, với các điều kiện ghép nối:

;; a sample from my .emacs.d
(defun my-sp-pair-function (id action context)
  (if (eq action 'insert)
    ;; t to pair, nil to not pair
    (or (looking-at "[[:space:][:punct:]]")
      (sp-point-before-eol-p id action context))
    t))

(with-eval-after-load 'smartparens
    (sp-pair "(" ")" :when '(my-sp-pair-function) :wrap "C-)")
    (sp-pair "{" "}" :when '(my-sp-pair-function) :wrap "C-}")
    (sp-pair "[" "]" :when '(my-sp-pair-function) :wrap "C-]")
    (sp-pair "\"" "\"" :when '(my-sp-pair-function) :wrap "C-\"")
    (sp-pair "'" "'" :when '(my-sp-pair-function)))

1
Phần dưới trông hoàn toàn không liên quan. Phần trên có vẻ như nó sẽ không tự làm bất cứ điều gì. Bạn có thể vui lòng biến câu trả lời của bạn thành một cái gì đó chức năng?
wasamasa

Đó là sự thật ... sao chép-dán thất bại. Đã sửa.
PythonNut

Cảm ơn những suy nghĩ, nhưng my-sp-pair-functiondường như không cung cấp chức năng mong muốn. Nó cho tôi hành vi tương tự như trước sau khi chấm câu (chèn ghép), nhưng bây giờ nó cũng thực hiện thao tác chèn sau các ký tự chữ và số, phá vỡ các cơn co thắt.
Dân

@Dan, đây có nghĩa là một giải pháp chung. Ví dụ, bạn có thể thay thế điều kiện bằng:(and (or (looking-at "[[:space:][:punct:]]") (sp-point-before-eol-p id action context)) (not (looking-back "[.`]")))
PythonNut

2

Bạn có thể sửa đổi hành vi của smartparen bằng cách sử dụng các chức năng sp-pairsp-local-pair. Các smartparens wiki giải thích các chức năng này một cách chi tiết.

Về cơ bản, bạn có thể một cái gì đó như sau để tùy chỉnh hành vi trên toàn cầu

(sp-pair "\"" nil :unless '(my-custom-predicate))

HOẶC để tùy chỉnh hành vi chỉ cho một số chế độ

(sp-local-pair desired-modes "\"" nil :unless '(my-custom-predicate))

Đâu desired-modelà chế độ mà bạn muốn tùy chỉnh hành vi và my-custom-predicatelà chức năng mà smartparens nên sử dụng để xác định xem nó có nên chèn cặp tự động hay không.

Từ tài liệu sp-paircủa chuỗi, vị từ tùy chỉnh sẽ chấp nhận

mở dấu phân cách (xác định duy nhất cặp), hành động và bối cảnh. Đối số ngữ cảnh có thể có các giá trị:

  • chuỗi - nếu điểm nằm trong chuỗi.
  • bình luận - nếu điểm là bên trong bình luận.
  • mã - nếu điểm nằm trong mã. Bối cảnh này chỉ được công nhận trong các chế độ lập trình xác định ngữ nghĩa chuỗi.

Vì vậy, một chức năng tùy chỉnh có thể được sử dụng như một :unlessvị ngữ trong trường hợp cụ thể của bạn sẽ giống như sau

(defun predp (id action context)
  (sp--looking-back-p "[[:punct:]]'"))

Lưu ý rằng tôi đang kiểm tra regex <punctuation>'vì điểm sẽ xảy ra .'|khi vị từ đang thực thi.

Cuối cùng, bạn có thể nối nó vào smartparens bằng cách thực hiện

(sp-pair  "'" nil :unless'(predp))

Cảm ơn, điều đó giúp tôi trở thành một phần của cách đó, nhưng bạn có thể cung cấp một ví dụ cụ thể không? Tôi đã thử nhiều dạng khác nhau của hàm vị ngữ (ví dụ (defun predp () (sp--looking-back-p "[[:space:][:punct:]]")):), nhưng smartparensbỏ qua tất cả.
Dân

Xin chào @Dan, tôi đã thêm giải pháp cho vấn đề cụ thể của bạn vào câu trả lời. Bạn không chấp nhận các đối số được yêu cầu trong vị ngữ, còn biểu thức chính được sử dụng thì hơi bị tắt
Iqbal Ansari
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.